質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

コマンド

コマンドとは特定のタスクを行う為に、コンピュータープログラムへ提示する指示文です。多くの場合、コマンドはShellやcmdようなコマンドラインインターフェイスに対する指示文を指します。

Q&A

解決済

2回答

2324閲覧

phpでフォルダを圧縮したい

smaeda

総合スコア16

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

コマンド

コマンドとは特定のタスクを行う為に、コンピュータープログラムへ提示する指示文です。多くの場合、コマンドはShellやcmdようなコマンドラインインターフェイスに対する指示文を指します。

0グッド

0クリップ

投稿2020/01/20 07:35

編集2020/01/20 08:49

こんにちは。
あまりphpに詳しくないため、見当違いの事を申し上げていたら申し訳ありません。

環境

・php7.3.13
・WindowsServer2012R2
・IIS10.0

概要

・とあるフォルダを「lzh」形式で圧縮したい
・ZipArchiveでは「lzh」の作成が出来ないようなので、代替で圧縮ソフト「Lhaplus」を利用
・「shell_exec」を使って「Lhaplus.exe」をキックしたい

フォルダ階層

C: └inetpub └wwwroot ├Lhaplus (exe一式が入っており、IUSERでフルコン権限付与済み) └hoge (IUSERでフルコン権限付与済み) ├output │└202001(圧縮元フォルダ) │ └csv、Excelファイルなど・・・ └fuga └202001(圧縮先フォルダ) └202001.lzh(正常に完了すれば出力されるlzhファイル)

試したこと

php

1 $cmd = "C:\inetpub\wwwroot\Lhaplus\Lhaplus.exe /c:lzh /o:C:\inetpub\wwwroot\hoge\fuga\202001 C:\inetpub\wwwroot\hoge\output\202001"; 2 $return_ver = shell_exec($cmd); 3 echo '実行結果:'.$return_ver; 4 exit();

「C:\inetpub\wwwroot\hoge\fuga\202001」フォルダをlzh化して
「C:\inetpub\wwwroot\hoge\output\202001」の直下に配置したいです。

尚、対象のフォルダは既に作成済みです。

また、コマンド内の「/c:」は「指定の拡張子で圧縮するオプション」で、
「/o:」は「圧縮したファイルの出力先を指定するオプション」となります。

サーバー上のコマンドラインで同じコマンドを実行すると、すぐに処理が正常に完了するのですが、
ブラウザ経由でコードを実行すると、処理が完了せずタイムアウトエラーとなってしまいます。

何か記述方法が間違っているようでしたら、ご指摘頂けますと嬉しいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2020/01/20 07:42

特定のソフトウェアを呼び出すのではなくlhaコマンドを利用した方が良いように思うのですが、如何でしょうか。
退会済みユーザー

退会済みユーザー

2020/01/20 07:50

Microsoft でさえ切り捨てた lzh をなぜ使うんだろう
smaeda

2020/01/20 08:24

>>m.ts10806さん お恥ずかしながらlhaコマンドなるものを知らず、調べてみたのですが こちらはLinuxのコマンドでWindowsで使用するには、専用のソフトが必要という事でよろしいでしょうか? 下記のURLにたどり着いたのですが、exeをインストールしようとしたところ、「このアプリはお使いのPCでは実行できません」とエラーが出てきてしまいました・・・ https://www.vector.co.jp/soft/dl/dos/util/se002413.html
smaeda

2020/01/20 08:25

>>asahina1979さん zipを使用出来ればそれで解決なのですが、顧客からのご要望ですので・・・
guest

回答2

0

ベストアンサー

サーバー上のコマンドラインで同じコマンドを実行すると、すぐに処理が正常に完了するのですが、

というのが解せなかったのですが、もしかして、php 質問文の4行を書いたファイル名を実行したんじゃなくて、直接Lhaplusコマンドを実行したのでは?それだと確認になっていません。

PHPプログラムが間違っています。文字列リテラルの中に\を書くときは\と書きます。

投稿2020/01/20 12:17

otn

総合スコア84380

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/01/20 13:01

もしかして、addslashes()で解決しちゃうやつ?
smaeda

2020/01/21 03:30

おっしゃるとおり「\」が原因でした。 「\」に直した所、無事に圧縮される事を確認いたしました。 勉強不足で申し訳ありません・・・皆様、ご丁寧な回答を頂き本当にありがとうございました。
退会済みユーザー

退会済みユーザー

2020/01/21 03:35

ダブルクォーテーションマークで括ると、\→\になるけど、 シングルクォーテーションならそういう展開は起きないってことで。 https://www.php.net/manual/ja/language.types.string.php ご参考まで。
smaeda

2020/01/22 04:46 編集

>>m6uさん お恥ずかしながら、ダブルクォートとシングルクォートの違いを初めて知りました。 おかげさまで勉強になりました。ありがとうございます。
guest

0

IISのwebサーバープロセスのユーザー権限が、
任意のフォルダにアクセスできないように制限がかかっているはずです。

まずは該当フォルダやファイルに対して、
プロパティから、
アクセス許可を確認してください。

加えて、lhaplus.exe本体や、lhaplus.exeが参照するファイルに対して、
IUSR_xxxxユーザーがアクセス可能かどうかも、確認お願いします。
特に、exe本体には実行権限も必要だと思います。

フォルダやファイルに対して、
「IUSR_xxxx」っていうユーザーに対する読み込み許可を与えてみたらいかがでしょうか。

詳しい情報は、「IIS アクセス許可」でネット検索してみてください。


話を聞いていると、IISから直接起動するのは厳しいような気がしてきますね。
ExpLzhもコマンドラインからやれそうですが、同じような結末もありそうで。

exeがどんなファイルを使うのかを丁寧に追えるとよいのですが。

投稿2020/01/20 07:45

編集2020/01/20 08:54
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

smaeda

2020/01/20 07:55

ご回答いただきありがとうございます。 IISからのアクセスユーザーに対して権限は付与済みとなっております。 例で言うところの「hoge」フォルダにフルコンを与えており(実際はもう少し深い階層ですが・・・)「C:\inetpub\wwwroot\hoge\fuga\202001」にファイルの書込み自体も出来ているので、権限関係ではなさそうです・・・
退会済みユーザー

退会済みユーザー

2020/01/20 07:58

IUSR_xxxxxx のユーザーは特殊なので、ちゃんとユーザーを指定した上で権限付与しないと効かないと思います。
smaeda

2020/01/20 08:20

理解力が乏しくて申し訳ないのですが、現在「hoge」フォルダ配下全てに「IUSER」でフルコンを与えており、ブラウザ経由で「C:\inetpub\wwwroot\hoge」直下にフォルダやファイルを作成出来る事も確認済みとなっています。これは正常に権限付与されていると思えばよろしいでしょうか・・・?
退会済みユーザー

退会済みユーザー

2020/01/20 08:23 編集

そこまで説明していただければOKです。 加えて、lhaplus.exe他実行に必要なファイルが、IUSR_xxxxxからアクセス可能かどうかも ご確認ください。
smaeda

2020/01/20 08:47 編集

元々「Lhaplus .exe」を「C:\Program Files (x86)」に配置しており、コマンドではexeのリンクをキックする形となっていたため、階層を変更してフォルダに「IUSER」でフルコンを付与しました。 (質問内容の「概要」欄に階層を追記しましたので、ご確認頂けますと幸いでございます) 「lhaplus.exe他実行に必要なファイルが、IUSR_xxxxxからアクセス可能かどうか」と言うのは、exeが配置されているフォルダに「IUSER」で権限が付与されているかどうか、と言う事でよろしいでしょうか? 尚、上記の状態で試してみたのですが、やはりタイムアウトとなってしまいます・・・
退会済みユーザー

退会済みユーザー

2020/01/20 08:47

だとすると、lhaplusがきびしいのではないかと。。
Y.H.

2020/01/20 09:08

lhaplusがユーザープロファイル必須になってる気がしますね。 lhaplusが初回起動時(レジストリのHKLUにエントリが無かったら)は設定ダイアログ出したりしているかもしれません。。。 設定ダイアログとか出してなければですが、 IISのアプリケーションプールの設定で、「ユーザープロファイルの読み込み」がfalseになっているなら、trueにすると動作する可能性がちょっとだけあります。
smaeda

2020/01/20 09:36

お二人ともありがとうございます。 lhaplusがそもそも使えない線も考え、 http://rokujo.hatenadiary.com/entry/2015/07/26/101609 ↑このブログを参考に「LHA」と言うソフトを使ってexec関数で実行したところ 今度は処理がタイムアウトせずに終了し、exec関数の第2引数(=処理結果)も「0:正常」で返ってきました。 ですが、何故か肝心のlzhファイルが出来上がっておらず、首を捻っている状態です・・・ また、Y.Hさんの仰るとおりIISの「ユーザープロファイルの読み込み:True」にして lhaplus.exeをキックしたところ、こちらも処理がタイムアウトせずに終了し、処理結果も「0:正常」で返ってきました。 そして同じくlzhファイルが出来上がっておりません。 exe自体はキック出来ていて、正常に処理が走っているように思えるのですが、ファイルが出来上がらないので、何かまた別の問題が起きてしまっているような気もしております。 もしも思い当たる節がございましたら、アドバイスを頂けますと幸いでございます・・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問