12

set_time_limit()またはmax_execution_timeを使用しても、PHPマニュアルに記載されているように、実行時間を「実際に」制限することはありません(Windowsを除く)。

ノート:

set_time_limit()関数と構成ディレクティブ max_execution_timeは、スクリプト自体の実行時間にのみ影響します。system()を使用したシステムコール、ストリーム操作、データベースクエリなど、スクリプトの実行外で発生するアクティビティに費やされた時間は、スクリプトが実行されている最大時間を決定するときに含まれません。これは、測定された時間が実際のWindowsには当てはまりません。

PHPのコメントで、私が探しているような「実際の」実行時間制限を持つ解決策が提案されていますが、それが不明確で混乱していることがわかりました。

4

1 に答える 1

3

私は間違っているかもしれませんが、私が理解している限り、あなたは「PHPコメント」ソリューションコードの説明を求めます。

秘訣は、 pcntl_fork関数を使用して子プロセスを生成することです。この関数は、タイムアウト後に元の(親)プロセスを終了します。関数pcntl_forkは、親プロセス実行スレッド内で新しく作成された子プロセスのプロセスIDを返し、子プロセス実行スレッド内でゼロを返します。つまり、親プロセスはifステートメントの下でコードを実行し、子プロセスはelseの下でコードを実行します。コードからわかるように、親プロセスは無限ループを実行し、子プロセスは5秒間待機してから、親を強制終了します。したがって、基本的には次のようなことをしたいと思います。

$real_execution_time_limit = 60; // one minute

if (pcntl_fork())
{
    // some long time code which should be
    // terminated after $real_execution_time_limit seconds passed if it's not
    // finished by that time
}
else
{
    sleep($real_execution_time_limit);
    posix_kill(posix_getppid(), SIGKILL); 
}

私はそれをうまく説明したと思います。この解決策について質問がある場合はお知らせください。

于 2011-10-04T23:14:14.807 に答える