5

ドキュメントによると:

max_execution_time only affect the execution time of the script itself. 
Any time spent on activity that happens outside the execution of the script
such as system calls using system(), stream operations, database queries, etc.
is not included when determining the maximum time that the script has been running.
This is not true on Windows where the measured time is real.

これは、テストによって確認されます。

タイムアウトしません

<?php
set_time_limit(5);
$sql = mysqli_connect('localhost','root','root','mysql');
$query = "SELECT SLEEP(10) FROM mysql.user;";
$sql->query($query) or die($query.'<br />'.$sql->error);
echo "You got the page";

タイムアウトします

<?php
set_time_limit(5);
while (true) {
  // do nothing
}
echo "You got the page";

私たちの問題は、PHPが何をしているかに関係なく、一定の時間が経過した後、PHPを本当にタイムアウトさせたいということです(許容可能な量のページの配信に失敗したことがわかっている場合、リソースをビジー状態に保ちたくないため)時間の、10秒のように)。SQLクエリのMySQLwait_timeoutなどの設定で遊ぶことができることはわかっていますが、ページタイムアウトは、実行されるクエリの数によって異なります。

一部の人々は回避策を考え出そうとしましたが、それは実装可能ではないようです。

Q:Linuxで本物を手に入れる簡単な方法はありますか、それともレベルPHP max_execution_timeなど他の場所でタイムアウトする方が良いですか?Apache

4

3 に答える 3

5

これは非常にトリッキーなアドバイスですが、PHPを変更して再コンパイルする場合は、間違いなく希望どおりの結果が得られます。

https://github.com/php/php-src/blob/master/Zend/zend_execute_API.c(ファイルはZend/zend_execute_API.c)の関数でPHPソースコードを見てくださいzend_set_timeout。これは、時間制限を実装する関数です。さまざまなプラットフォームでどのように機能するかを次に示します。

  • Windowsでは、新しいスレッドを作成し、タイマーを開始し、終了したら、1と呼ばれるグローバル変数を設定しますtimed_out。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およびApacheで他のモジュールが破損する可能性があります。何らかの理由で、SIGALRMシグナルまたは他のタイマーを使用します。

于 2012-04-05T10:59:30.493 に答える
1

これは古くて答えられた質問です。request_terminate_timeoutしかし、他の人を助けるために、私はphp-fpmオプションを指摘したいと思いました。PHP-FPMを使用している場合は、おそらくそれが必要なものです。

このオプションを設定すると、PHPの動作に関係なく、N秒後にリクエストを強制終了するようにPHP-FPMに指示できます。

詳細については、 http://php.net/manual/en/install.fpm.configuration.php#request-terminate-timeoutを参照してください。

于 2015-04-17T10:44:22.857 に答える
-2

httpd.confから:

タイムアウト:タイムアウトを送受信するまでの秒数

タイムアウト300

于 2012-04-05T10:08:29.373 に答える