批处理长执行时脚本

时间:2013-07-13 16:05:03

标签: php wordpress wordpress-plugin batch-processing execution

我在周围搜索但是找不到set_time_limit(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();

使用exec会是一个很好的解决方案吗?例如

exec("doTask.php $arg1 $arg2 $arg3 >/dev/null 2>&1 &");

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

1 个答案:

答案 0 :(得分:0)

如果你把它放到某种cron中会是理想的。构建要发送的电子邮件列表并将它们存储在队列中,并拥有一个队列的某个排序进程的cron脚本。 Wordpress确实拥有自己的cron机制(请参阅wp_cron),但在低流量网站上运行频繁以发送该数量的电子邮件可能很困难。当然,您可以使用cron来确保运行wp_cron。您应该看到How to execute a large PHP Script?,因为它非常相关。

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