1

Linux の PHP は、setitimer で ITIMER_PROF を使用して ini(max_execution_time) と set_time_limit を実装しますが、ITIMER_REAL は使用しません。google it で、この質問https://bugs.php.net/bug.php?id=65596に関する php.net のスレッドを見つけました。PHPマニュアル関連http://php.net/manual/en/function.set-time-limit.php note

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

PHP タイムアウト メカニズムがそのように設計された理由を知りたいのですが、Zend/zend_execute_API.c で ITIMER_PROF を ITIMER_REAL に変更すると、どのような副作用が現れるでしょうか?

4

1 に答える 1

2

彼らは移植性のためにそれを行います。

ITIMER_REALまたはシグナルの代わりにシグナルをITIMER_REAL送信するため、一部の SAPI および unices で中断します。SIGALRMSIGVALRMSIGPROF

スクリプトの早期終了と、Apache + mod_php などの一部の SAPI との非互換性が副作用になると思います。

一部の unice は、php の sleep() 関数が使用する sleep(2) で SIGALRM も使用するため、別の副作用になります。

于 2014-08-16T11:05:02.623 に答える