1

PHPでのshell_execの最大実行時間を20秒に制限し、この時間中に生成された出力をフェッチしようとしています。shell_execが20秒未満で終了した場合、スクリプトは直接続行する必要があります。

具体的には、Subversionリポジトリの多数のリビジョンを反復処理する関数を開発しています。リビジョンごとに、svn diffをフェッチし、追加された行数をカウントします。問題は、リビジョンで非常に大きなファイルがコミットされている場合、スクリプトがハングすることです。したがって、私は各svndiffコマンドの実行時間を制限しようとしています。

popen()とsleep()の組み合わせは、100回の反復では実行できない各反復でスクリプトを20秒間スリープさせるように見えるため、オプションではありません。max_execution_timeを設定すると、致命的なエラーが返されるため、オプションではありません。

4

1 に答える 1

2

popen()またはproc_openまだオプションです。sleep() を回避し、実行時間を自分で管理する必要があります。

$end = time() + 20;
while (!feof($stream) && (time() < $end)) {

    $output .= fread($stream);

popen ストリームは引き続きノンブロッキングに設定する必要があります。

stream_set_blocking($stream, 0);

このように出力をポーリングすることは、まだ少し負担になる可能性があるため、time_nanosleep()いずれにせよ、小さなものを追加することを検討する必要があります。どちらの場合も、ランタイムはtime()<$endチェックによって最大 20 秒に制限されます。

于 2011-05-10T13:57:07.033 に答える