0

我四处搜索,但找不到除 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 插件。谢谢!

4

1 回答 1

0

如果您将其放入某种 cron 中,那将是理想的。建立一个电子邮件列表以发送并将它们存储在一个队列中,并有一个队列中的某种进程的 cron 脚本。Wordpress 确实有它自己的 cron 机制(请参阅wp_cron),但在低流量站点上运行足够频繁以发送这么多电子邮件可能很困难。当然,您可以正确使用 cron 来确保运行 wp_cron。您应该看到如何执行大型 PHP 脚本?因为它非常相关。

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

于 2013-07-13T17:27:04.100 回答