Php 长执行时间脚本的批处理

Php 长执行时间脚本的批处理,php,wordpress,batch-processing,execution,Php,Wordpress,Batch Processing,Execution,我四处搜索,但除了设置时间限制(0)之外,我找不到其他解决方案,这在大多数共享主机上都不起作用 基本上,我有一个脚本,可以在用户的朋友需要时向他们发送消息。我的一些用户有+4000个朋友,脚本遇到了麻烦 目前我正在用AJAX在后台调用这个脚本。因为我不需要/不想让用户等到这个完成,我希望有一些后台处理 我当前的代码: global $client, $emails, $subject, $message; _info("got on_auth_success cb, jid ".$client-

我四处搜索,但除了设置时间限制(0)之外,我找不到其他解决方案,这在大多数共享主机上都不起作用

基本上,我有一个脚本,可以在用户的朋友需要时向他们发送消息。我的一些用户有+4000个朋友,脚本遇到了麻烦

目前我正在用AJAX在后台调用这个脚本。因为我不需要/不想让用户等到这个完成,我希望有一些后台处理

我当前的代码:

global $client, $emails, $subject, $message;
_info("got on_auth_success cb, jid ".$client->full_jid->to_string());
$client->set_status("available!", "dnd", 10);

set_time_limit(60*10);

if( count($emails) < 40 ){

    foreach( $emails as $email )
    {
        $msg = new XMPPMsg(array('to'=>'-'.$email.'@chat.facebook.com'), $message);
        $client->send($msg);  
        sleep(1);
    }

}
else
{
    $counter = 0;
    //Lets create batches
    foreach( $emails as $email )
    {
        $counter++;
        $msg = new XMPPMsg(array('to'=>'-'.$email.'@chat.facebook.com'), $message);
        $client->send($msg);
        sleep(1);

        if( $counter == 50 )
        {
            sleep(10);
            $counter = 0;
        }
    }
}
$client->send_end_stream();

我需要一个解决方案,工程上的大多数主机,因为这是一个wordpress插件,可以安装在任何主机上。谢谢

如果您将其放入某种cron中,那将是理想的。构建一个电子邮件列表,将其发送并存储在队列中,并使用某种类型的cron脚本处理该队列。Wordpress确实有自己的cron机制(请参阅),但在流量较低的网站上,可能很难频繁运行以发送如此数量的电子邮件。当然,您可以使用cron来确保wp_cron正在运行。你应该看到,因为这是非常相关的


如果您真的希望它是同步的,因为您使用的是后台ajax,您还可以进行一些较小的ajax调用。例如,您可以让ajax脚本一次执行20封电子邮件,然后返回剩余的电子邮件数。然后,浏览器上的客户机代码知道还有一些剩余,并再次通过ajax调用后台php,可能带有指示当前位置的计数器。[编辑:但这取决于您的用户是否有足够的耐心保持浏览器打开以完成发送,并且他们可能需要与internet保持相对稳定的连接。]

您不应该以同步方式执行此类任务!取而代之的是,将这些任务委托给cron系统的某个软件,以便在时间允许时发送消息。或者,如果连cron系统都不可用,则使用“穷人cron”。但是你当然应该存储作业并异步处理它们。你能提供一些代码示例吗?不,对不起,我没有代码示例。大约10年前,我实现了一个复杂的系统来执行这些任务,这些任务可能会变得非常复杂。但对于基本概念,谷歌上有数百个例子。基本方法是:将所有“要完成的工作”保存在数据库中,然后在任务触发时逐个处理它们:由cron作业或穷人的cron触发,如前所述。然后,这只是一个调整一次处理多少个作业的问题。我真的不需要用户等到过程完成。我可以在后台运行它。我看到一些插件使用某种自ping,以便在后台运行进程。啊,是的,这是完成后台处理的另一种方法。
exec("doTask.php $arg1 $arg2 $arg3 >/dev/null 2>&1 &");