3

phpでforeachループを実行していますが、最大実行時間である30秒よりも実行に時間がかかります。ループは、個々の電子メールをユーザーに送信します。

30秒ごとにcronジョブを実行し、レコードのキューを作成する代わりに、set_time_limit(30)?を使用してループ内のカウンターを再起動するのは非倫理的です。

$i = 0; //start count from 0

foreach ($users as $user): 

    //limit emails sent
    if(++$i == 100) break; //ends execution of loop

    set_time_limit(30); //restart timeout counter

    send_email($user); //send email to user

endforeach;

私はこれに不慣れですが、上記のコードを使用すると、各電子メールの完了に30秒を与えていると思いますが、100通の電子メールが送信されるとループが中断されるため、スクリプトが永久に実行されることはありません。

更新: set_time_limit(0) TOSのホスティングに反対します。タイムアウトカウンターを再起動すると、CRONと同様にスクリプトが再起動すると思いました。

4

3 に答える 3

4

set_time_limitをループで実行するforeachと、いくつかの問題が同時に発生し、解決されます。

このソリューションの最大の長所は、リクエストに 30 秒以上かかることがないようにすることです (そして、完全なキューがある場合は、30 秒以上かかるすべてのスクリプトをカットすることが望ましいとさえ思います)。

それがもたらす問題は、必ずしもすべてのジョブが実行されるわけではないということです。ジョブ キューの途中で問題が発生し、すべて失敗する可能性があります。

私はこれで行きます:

# crontab
0,30 * * * * php /path/to/your/script.php

そして、あなたのスクリプトを使用します。

ジョブをできるだけ速く実行する必要がある場合は、(すべてのジョブが正常に実行された) 終了しないか、何もexit(0)返されない限り (タイムアウトなしで) php スクリプトを実行する bash スクリプトを作成します。"Done!"あなたが好きです。

bash スクリプトの例: 12

#!/bin/bash
# Note that false sets $? to 1
false
while [ $? -ne 0 ]; do
    php /path/to/your/script.php >> log.log
done

また、2 つのインスタンスが同時に実行されないようにする必要がある場合は、そのうちの 1 つをググってください (頭のてっぺんから):

  • .pidファイル
  • mysqlLOCK TABLE

PS: メソッドの一部を使用する場合は、途中でクラッシュしてもスクリプトが機能することを確認してください。

于 2012-07-24T18:26:06.297 に答える
2

スクリプトの開始時に時間制限をすべて無効にするだけです。

set_time_limit(0);
于 2012-07-24T17:33:09.093 に答える
0

ホストの TOS で無制限のスクリプトの使用が禁止されている場合、ホストはほぼ確実にスクリプトのリセットに反対するでしょう。唯一の選択肢は、電子メールを並行して送信するか、別のホストに移動することです。

于 2012-07-24T18:23:29.950 に答える