14

タイムアウトしている cron タスクによって実行されている更新クエリがあります。navicat で実行した場合、クエリの実行には平均で 5 分かかります。

コードは大体こんな感じ。それは非常に簡単です:

// $db is a mysqli link
set_time_limit (0); // should keep the script from timing out
$query = "SLOW QUERY";
$result = $db->query($query);
if (!$result)
    echo "error";

スクリプトはタイムアウトするべきではありませんが、SQL 呼び出しの待機に費やされた時間は依然としてタイムアウトの影響を受けているようです。

使用できる非同期呼び出しはありますか? またはタイムアウトを調整しますか?

Apache ではなくコマンドラインから呼び出されているため、タイムアウトは異なりますか?

ありがとう

4

6 に答える 6

36

私はどこかで同じ問題を抱えていて、次のコード(私のファイルの最初の2行)でそれを「解決」しました:

set_time_limit(0);
ignore_user_abort(1);
于 2008-12-13T18:34:02.903 に答える
4

マニュアルによると:

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

したがって、PHPの制限時間とは関係がない可能性があります。タイムアウトしたときにどのようなメッセージが表示されますか?おそらく、MySQL設定が関係しています。

于 2008-12-13T18:39:37.463 に答える
2

あなたのphpはセーフモードで実行されていますか?set_time_limit の PHP マニュアルからの引用:

この関数は、PHP がセーフ モードで実行されている場合は効果がありません。セーフ モードをオフにするか、php.ini で時間制限を変更する以外に回避策はありません。

于 2008-12-13T17:57:22.650 に答える
0

Linux を使用していると仮定すると、Debian ベースのシステムには、mod_php/php cgi と php-cli 用の個別の構成があります。これは、cgi/cli 構成を分離していない別の Linux システムでセットアップするのはそれほど難しくありません。

個別の構成を作成したら、php cli 構成を調整します。セーフ モードと時間制限と RAM 制限を無効にします。

于 2008-12-13T18:10:02.750 に答える
0

php、ini のリソース制限変数のいくつかを確認してください: max_execution_time、max_input_time、memory_limit

PHP 自体でスクリプトの時間制限を設定することもできます: http://ca3.php.net/set_time_limit

于 2008-12-13T18:10:05.090 に答える
0

PHP スクリプトの 1 つで似たようなものを見つけたので、スロー クエリを実行する直前にインラインで追加しました。

$timeout_seconds = 3153600; // 1 year... 

// Make sure the PHP script doesn't time out
set_time_limit(0);
ignore_user_abort(1);

// Make sure the PHP socket doesn't time out
ini_set('default_socket_timeout', $timeout_seconds);
ini_set('mysqlnd.net_read_timeout', $timeout_seconds);

// Make sure the MySQL server doesn't time out
// Assuming your $link is a MySQLi object:
$link->query("SET SESSION connect_timeout=" . $timeout_seconds);
$link->query("SET SESSION delayed_insert_timeout=" . $timeout_seconds);
$link->query("SET SESSION have_statement_timeout='NO'");
$link->query("SET SESSION net_read_timeout=" . $timeout_seconds);
$link->query("SET SESSION net_write_timeout=" . $timeout_seconds);

秒数を適切に設定する必要があることは明らかですが、スクリプトがタイムアウトになることはまったく望んでいませんでした。

PHP 初期化ディレクティブ: https://www.php.net/manual/en/ini.list.php

MySQL サーバー変数: https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html

注: 詳細についてはドキュメントを確認し、使用している PHP および MySQL のバージョンと変数が一致していることも確認してください。PHP 7.3 と MySQL 5.7 を使用しています。

** 編集: 私のスクリプトでは PHP のタイムアウトを設定するだけでは十分ではありませんでした。MySQL SESSION 変数も追加する必要がありました。

于 2021-01-18T17:50:58.663 に答える