2012-02-27 19 views
2

私たちは、SSHアクセス権を持たないサーバー上の非常に大きなアーカイブファイルのuntar/unzipする必要があります。代替オプションの1つは、ファイルを解凍するためにPHP経由でシステムコマンドを実行することです。PHPを使用してシステムコマンドを長いタイムアウト時間で実行しますか?

問題は、ファイルを解凍するにはかなりの時間がかかります。 PHPは完了する前にタイムアウトします。

PHPスクリプトがタイムアウトしたかどうかに関係なく、untarコマンドを完全に実行する方法はありますか?非同期実行と同じですか?

また、ファイルの解凍を完了するのに十分な時間があるように、PHPのタイムアウト期間を極端に長く設定するにはどうすればよいですか?サーバー構成は、これらの値を変更するのを防ぐことはできません場合

+0

はLinuxシステムですか? afaik、Linux上では、システムコマンドに費やされた時間はmax_execution_time制限にはカウントされません。多分それはいくつかのタイムアウトが設定されているhttpdです。 –

+0

Ditto、それはLinuxシステムですか?共有されたWebホスティングプラットフォームにありますか?おそらく、ファイルを非同期で解凍することができるcronjob(共有ホスティングで珍しくない)を定義して実行することができます。ファイルを一度解凍するか、ユーザーが圧縮ファイルをアップロードするたびに解凍する必要がありますか?それが一度だけの場合は、copmress/uncompress機能を持つファイルマネージャを使用してWebコントロールパネルにアクセスすることができます。または、ファイルを解凍するようサーバ管理者に問い合わせる方が簡単かもしれません。 – juanrpozo

+0

はい、Linuxです。 Rackspace Cloudサイト。 –

答えて

1

を終了するまで、PHPスクリプトはOutfile.txtをスキャン可能性があり:

関数set_time_limit()と設定ディレクティブ max_execution_timeにのみ影響を与えますスクリプト 自体の実行時間。 スクリプトを実行している時間が最大であると判断した場合、system()、ストリーム操作、 データベースクエリなどを使用したシステムコールなど、スクリプトの実行 の実行以外で発生した時間は含まれません。 Windowsの では、測定された時間が実際のものとは異なります。

クライアント(ブラウザ)がタイムアウトしている可能性があります。このような切断により、スクリプトが中止されることがあります。これを防ぐには、次のようにします。

ignore_user_abort(true); 

次に、進捗状況を確認できる2番目のスクリプトが必要になります。 1つ目の考え方は、tarの出力をファイルに書き込ませて、2番目のスクリプトが終了しているかどうかを確認できるようにすることです。もう1つは、順番にtarを実行するシェルスクリプトを呼び出すことです。そのシェルスクリプトは、リターンコードをチェックして結果にファイルをタッチするか、動作している間に基本的なロックファイルを作成する可能性があります。

+0

答えをありがとう。linuxコマンドをファイルに出力して、別のスクリプトがコマンドのステータスをチェックできるように更新されるようにすることはできますか?私が知っていることから、あなたが '#command> output.txt'を使うと、コマンドが完了するまでファイルに書き込まれないからです。 –

+0

私の経験から、ファイルは全面的に書かれており、いつでもチェックすることができます。 – webbiedave

+0

あなたはその答えに大歓迎です。しかしアップヴォートはそれをもっと良く言うだろう;) – webbiedave

0

サーバーが* nixシステムで実行されている場合は、nohupコマンドを使用できます。すなわち

nohup tar ... >outfile.txt 

その後、操作がmanualから

関連する問題