2

これがこのアイデアです: php スクリプトは、投稿されたデータを別のサーバーに送信します。サーバーが投稿されたデータの取得に失敗した場合、php スクリプトは数分後に再試行する必要があります。

最初の試行が失敗した場合、プログラマーはタスクを完了するために数分後にスクリプトを再実行するにはどうすればよいでしょうか?

新しい更新またはデータベースによる挿入によって通知されたときに、別のサーバーを呼び出してデータをサーバーに投稿する php スクリプトを作成したいと考えています。したがって、HTML/CSS/JS は関係ありません。これは完全にコマンド ラインであり、バックグラウンドで実行されます。では、最初の実行が失敗した場合、スクリプトが数分後に再試行されるようにするにはどうすればよいでしょうか?

4

6 に答える 6

2

at unix commandを参照してください。そのため、適切な時間を待っている間にスクリプトを実行する必要はありません。

echo "php yourscript.php" | at $TIME

他のサーバーへの呼び出しが失敗した場合に備えて、これを php スクリプトの最後に配置します。

shell_exec('echo "php yourscript.php" | at ' . $moment);
于 2012-08-03T19:20:30.883 に答える
1

ほとんどの場合、PHP でスクリプトをスケジュールする必要がある場合は、cron に依存し、最後のスクリプト実行の失敗または成功に関連するデータ (つまり、DB またはテキスト ファイル) を永続化する方法が必要になります。

ただし、一度実行するスクリプトがあり、成功するまで定期的に再試行する場合は、次のようなタイマーで while ループを使用できます。

// allow for long running execution
ignore_user_abort(true);
set_time_limit(0);

$success = false;
while($success === false) {
    // attempt what you are trying to do, set $success to true if it works
    if ($success === true) {
        continue;
    } else {
        sleep(300); // this pauses execution for 300 seconds
    }
}

Ross Smith II からの提案に従って編集

于 2012-08-03T19:16:34.077 に答える
0

あなたはajaxの友達に出くわしました。

例えば:

var x = false;

function ajax()
{
 if(x)
 {
    $.ajax({
      url: "test.php"
    }).done(function() { 
      x = true;
    });
 }
 else
 {
    setTimeout(ajax(),3000);
 }
于 2012-08-03T19:12:08.593 に答える
0

この PHP スクリプトが Web サーバー経由で実行されるのか、コマンド ラインで実行されるのか、あなたの質問は明確ではありません。

コマンドラインでの実行について話している場合は、次のようにします。

#!/bin/bash

while true
do
    php script_that_returns_non_zero_if_it_fails.php && break
    sleep 300 # sleep 5 minutes
done
于 2012-08-03T19:13:12.510 に答える
0

おそらくsleep()、条件が false または同等の値を返した場合に自分自身を呼び出す関数を作成するでしょう。

<?php
function doSomething() {
    // do request, should return true or false
    $result = dymmyRequestFunction();
    if ($result === false) {
        sleep(300);
        doSomething();
    }
}

それが役立つことを願っています。

于 2012-08-03T19:15:43.860 に答える
0

Ajaxが答えです..このようなもの

xmlHttp.open('GET', '/ajax/script.php?id=' + id, true);
xmlHttp.onreadystatechange = function()
{
    if (xmlHttp.readyState == 4 && xmlHttp.status == 200)
    {
       //complete
    }
    else
    {
       //try again
    }
}
于 2012-08-03T19:19:38.817 に答える