如何在PHP中执行长任务而不停止其他所有任务

时间:2015-09-03 20:24:38

标签: php ajax multithreading email batch-processing

我希望能够通过电子邮件将我的服务器的简报发送给我的所有订阅者。 数据库中有超过一千个电子邮件地址,我需要满足这些地址。 我刚刚为我创建了一个后端系统来执行此操作,这使我可以编写新闻稿并开始发送它们,以及进度条来监控进度。出于测试目的而不是发送电子邮件,我称之为睡眠(1) 然后我意识到如果我在脚本运行时尝试重新加载页面或运行另一个PHP脚本,则没有任何反应 - 批处理电子邮件进程必须先完成。 然后我记得PHP是单线程的,我的系统设计不合理。

我知道有一种方法可以使用Thread类模拟多线程,但我的主机服务器不支持此功能。

另一个显而易见的方法是打破任务并使用cron作业一点一点地发送一些电子邮件,但这意味着我必须重复验证我的电子邮件服务器,可能多达100次如果我希望我的网站保持活动状态,则时间相当短。 由于我的服务器限制,这可能会引发一个问题。

显而易见的答案是找到一个限制较少的新服务器,或者将时事通讯错开到可以克服任何问题的程度,但这是最后的手段,在这种情况下,我会这样做。可能只是找到一种方法在本地批量发送电子邮件。

有没有什么方法可以执行这样一个长时间运行的PHP脚本,而不会延迟所有其他脚本,直到它完成?

我是否在某处误解了一些相当基本的PHP知识?因为矛盾的是我发现我可以运行一些长时间运行的脚本(例如我有一个PHP脚本需要大约5秒才能完成,因为它将旧数据库转换为新格式),由于某种原因,它可以与其他脚本并行运行。

是的,我很困惑。请帮忙。

编辑:正如wischi正确指出的那样,发送电子邮件的脚本也会调用session_start(),因为它需要检查管理员是否已登录并出于安全目的调用脚本。这就是为什么在批处理电子邮件脚本中一切都停止运行的原因。

2 个答案:

答案 0 :(得分:0)

听起来像是在使用会话。

单个会话并不可能并行运行多个php脚本,因为这会在使用会话变量时导致意外行为。

关于此主题的更多信息:

长时间运行php脚本

修复会话锁定后,您可能正在寻找一些东西来阻止客户端断开连接后关闭脚本(关闭选项卡或取消加载):

How do I stop PHP from sending data to client while still running PHP code in server?

答案 1 :(得分:0)

你可以尝试:

system('php my_mailing_script.php > /tmp/mail_logs.txt &');

不要忘记&符号,它基本上会说:“使用新线程来做到这一点。”