これは非常にトリッキーなアドバイスですが、PHPを変更して再コンパイルする場合は、間違いなく希望どおりの結果が得られます。
https://でPHPソースコードを確認してください。 github.com/php/php-src/blob/master/Zend/zend_execute_API.c
(ファイルはZend/zend_execute_API.c
です。 )、関数zend_set_timeout
。これは、時間制限を実装する関数です。さまざまなプラットフォームでの動作は次のとおりです。
-
Windowsでは、新しいスレッドを作成し、タイマーを開始し、終了したら、
timed_out
というグローバル変数を設定します。 1にすると、PHP実行コアはすべての命令についてこの変数をチェックしてから終了します(非常に単純化されています) -
Cygwinでは、本物を測定するITIMER_REALでitimerを使用します 睡眠を含む時間、待つなど、信号を上げる すべてを中断します 処理して処理を停止します
-
他のUNIXシステムでは、itimerをITIMER_PROFとともに使用します。これは、現在のプロセスによって費やされたCPU時間のみを測定します(ただし、ユーザーモードとカーネルモードの両方で)。これは、他のプロセス(MySQLなど)を待つことはこれにカウントされないことを意味します。
ここで、LinuxのitimerをITIMER_PROFからITIMER_REALに変更します。これは、もちろん手動で行う必要があり、再コンパイル、インストールなどが必要です。これら2つの違いは、タイマーの実行時に異なる信号を使用することです。アウト。だから私の提案はifdefを変更することです:
# ifdef __CYGWIN__
に
# if 1
ITIMER_REALとPHPが待機するシグナルの両方をSIGALRMに設定するようにします。
とにかく、このアイデア全体はテストされていません(ITIMER_PROFが壊れている、非常に特殊なシステムに使用しています。 動作する)、サポートされていないなど。自己責任で使用してください。 PHP自体で動作する可能性がありますが、PHP and では、他のモジュールが破損する可能性があります。 Apacheでは、何らかの理由でSIGALRMシグナルまたは他のタイマーを使用します。