2

这是这个想法:一个 php 脚本将发布的数据发送到不同的服务器。如果服务器无法获取发布的数据,php 脚本应该在几分钟后重试。

如果第一次尝试失败,程序员如何让脚本在几分钟内再次执行以完成任务?

我想创建一个 php 脚本,当新更新或数据库插入通知时,它会调用不同的服务器并将数据发布到服务器。因此,不涉及 HTML/CSS/JS。它完全是命令行 - 在后台运行。那么,如果第一次执行失败怎么办,我该如何计时脚本在几分钟后重试呢?

4

6 回答 6

2

请参阅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
    }
}

根据罗斯史密斯二世的建议编辑

于 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()if 条件返回 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 回答