我在周围搜索但是找不到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插件。谢谢!
答案 0 :(得分:0)
如果你把它放到某种cron中会是理想的。构建要发送的电子邮件列表并将它们存储在队列中,并拥有一个队列的某个排序进程的cron脚本。 Wordpress确实拥有自己的cron机制(请参阅wp_cron),但在低流量网站上运行频繁以发送该数量的电子邮件可能很困难。当然,您可以使用cron来确保运行wp_cron。您应该看到How to execute a large PHP Script?,因为它非常相关。
如果你真的希望它是同步的,因为你使用的是后台ajax,你也可以做一些较小的ajax调用。例如,您可以让ajax脚本一次执行20封电子邮件,然后返回剩余的电子邮件数量。然后你的浏览器上的客户端代码知道还剩下一些,并再次通过ajax调用后台php,可能还有一个指示当前位置的计数器。 [编辑:但这取决于您的用户是否足够耐心以保持浏览器打开以完成发送,他们可能需要相对稳定地连接到互联网。]