max_execution_time のドキュメントでは、それを読みました
system() を使用したシステム コール、ストリーム操作、データベース クエリなど、スクリプトの実行以外で発生するアクティビティに費やされた時間は、スクリプトの最大実行時間を決定する際には含まれません。
もしそうなら、これまでに PHP が実行された時間を決定するで提案されているようにマイクロタイムを使用するだけでは、最大実行時間制限にどれだけ近づいているかについての手がかりは得られません。
一部の環境/言語では、「ソフト」制限の概念があります。制限に達すると、アプリケーションは通知されますが、終了せず、適切に反応できます。PHP では、「ハード」な制限しかないように思えます。締め切りの前にいるか、「最大実行時間 %d 秒 %s を超えました」E_ERROR で壁にぶつかりました。これは何もできません。約。
私がやりたかったのは、スクリプトがこれまでに実行された時間を時々チェックし、最大実行時間に近づいたときに手動で正常な終了を処理することです。
同様の問題によって動機付けられた実行時間が max_execution_time に近づいたときに検出する同様の質問では、受け入れられた解決策はシャットダウン関数を登録することでした-これは元の問題を多少回避し、実際には私の状況には当てはまりません-問題を処理したいシャットダウン ハンドラ内ではなく、アプリ コンテキスト内で。
Zend/zend_execute_API.c を理解していることから、 zend_set_timeout 関数は struct itimerval t_r; を使用します。/* 要求されたタイムアウト */ sigset_t sigset;
if(seconds) {
t_r.it_value.tv_sec = seconds;
t_r.it_value.tv_usec = t_r.it_interval.tv_sec = t_r.it_interval.tv_usec = 0;
setitimer(ITIMER_PROF, &t_r, NULL);
}
if(reset_signals) {
signal(SIGPROF, zend_timeout);
sigemptyset(&sigset);
sigaddset(&sigset, SIGPROF);
}
私が理解していることからhttp://linux.die.net/man/2/setitimerこれは、ユーザーとシステムモードの両方の時間を測定する必要があります。PHPの仕様と多少矛盾しているため、ここで混乱しています。setitimer へのメモでは、それを読むことができます
POSIX.1 では、setitimer() と、alarm(2)、sleep(3)、および usleep(3) の 3 つのインターフェースとの間の相互作用が規定されていません。
これは、次のスクリプトが 5 (ウォール クロック) 秒後に終了しない理由を説明している可能性があります。
<?php
set_time_limit(5);
while(1){sleep(1);}
?>
おそらく、スリープはユーザー時間にもシステム時間にもカウントされません。