【发布时间】:2015-09-03 20:24:37
【问题描述】:
我希望能够通过电子邮件从我的服务器向我的所有订阅者发送新闻通讯。 数据库中有超过一千个电子邮件地址需要我处理。 我刚刚为我创建了一个后端系统来执行此操作,它允许我编写新闻通讯并开始发送它们,以及一个进度条来监控进度。出于测试目的而不是发送电子邮件,我调用 sleep(1) 然后我意识到如果我在脚本运行时尝试重新加载页面或运行另一个 PHP 脚本,什么都没有发生 - 批处理电子邮件过程必须首先完成。 然后我才想起 PHP 是单线程的,而且我的系统设计得很糟糕。
我知道有一种方法可以使用 Thread 类模拟多线程,但我的主机服务器不支持。
解决此问题的另一种明显方法是将任务分解并使用 cron 作业一点一点地触发几封电子邮件,但这意味着我必须反复验证我的电子邮件服务器,在相当长的时间内可能多达 100 次如果我希望我的网站保持活跃,则需要很短的时间。 由于我的服务器限制,这可能会引发问题。
显而易见的答案是找到一个限制较少的新服务器,或者将时事通讯错开到可以克服任何问题的程度,但这是最后的手段,在这种情况下,我可能会找到一种方法在本地进行批量电子邮件发送。
有什么方法可以执行这样一个长时间运行的 PHP 脚本,而不会延迟所有其他脚本直到它完成?
我是否在某处误解了一些相当基本的 PHP 知识?因为自相矛盾的是,我发现我可以运行一些长时间运行的脚本(例如,我有一个 php 脚本,它需要大约 5 秒才能完成,因为它将我的旧数据库转换为新格式),由于某种原因,它似乎可以与其他脚本并行运行。
是的,我很困惑。请帮忙。
编辑:正如 wischi 正确指出的那样,发送电子邮件的脚本也调用 session_start(),因为它需要检查管理员是否登录并出于安全目的调用脚本。这就是为什么在这个批处理电子邮件脚本运行期间实际上一切都停止了。
【问题讨论】:
-
在后台通过命令行运行
exec("nohup /usr/bin/php mailer.php > /dev/null");
标签: php ajax multithreading email batch-processing