スクリプトのタイムアウトを防ぐためのPHPのスリープ

私は大規模なディレクトリのリストを読み込むスクリプトを持っており、(その性質上)読み込みには永遠にかかります。私はスクリプトのタイムアウトを経験するケースがいくつかあり、スクリプトがタイムアウトしないように私のようなものを使うことができるのか、状況を悪化させるだけなのか不思議でした。

0
出力を生成していますか?場合によっては、クライアントに出力を送信せずに長時間実行していた場合、apacheはアクティブなリクエストを終了させることがあります。
追加された 著者 Abhi Beckert,
私たちはどのようにして実行タイムアウトを防ぐことができますか?
追加された 著者 MatTheCat,
このディレクトリにはいくつのファイルとディレクトリがありますか?
追加された 著者 Homer6,
要求ごとにディレクトリリストをロードする必要がありますか?代わりにファイルリストをキャッシュする定期的なタスクを実行できますか?
追加された 著者 user212218,

4 答え

set_time_limit()でタイムアウト制限を設定することはできませんか?

0に設定すると、スクリプトは永遠に実行されます。

set_time_limit(0);

Usleep() will halt the execution of the PHP script in the given time. In that time your script will not be listing any directories and such. It will just freeze the script until it is allowed to continue.

3
追加された

PHPは長い間存在していないファイルやディレクトリを探し出そうとしますので、すでに次のようなものを使用している場合は、

if ((is_dir($path) || file_exists($path)) && ($dh = opendir($path)))
{
  while(($file = readdir($dh)) !== false)
  {
    .. file or dir is found, do stuff :)
  }

  closedir($dh);
}

私は言葉を言ったことはありませんが、あなたが単純に使うならば:

$dh = opendir($path);

スクリプトがタイムアウトするまでに数分かかることがありますが、何もしません。

1
追加された

RecursiveDirectoryIterator を使ってディレクトリリストを生成しようとしましたか?

私は再帰関数を使用してディレクトリリストを生成していましたが、これは深刻なレベルになる膨大な量のファイルを処理しなければならないときに誤ってスクリプトのタイムアウトを引き起こしていました。 RecursiveDirectoryIterator を使用すると、私の多くの問題が解決しました。

1
追加された

set_time_limit を試すか、コードを最適化できるかどうかを確認してください:

  • execute ls -l > results.txt & on your system so that the listing launches in the background and copies it to the results.txt file.
  • reduce the amount of files in your directory by using subdirectories
0
追加された
PHP - 日本のコミュニティ [ja]
PHP - 日本のコミュニティ [ja]
4 参加者の

このグループではPHPについて話します。 パートナー:kotaeta.com