【问题标题】:How to execute a long task in PHP without stopping everything else [duplicate]如何在不停止其他一切的情况下在 PHP 中执行一项长任务[重复]
【发布时间】: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


【解决方案1】:

听起来你正在使用会话。

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

有关此主题的更多信息:

长时间运行的 php 脚本

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

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

【讨论】:

  • 他在哪里提到会话?
  • 因为他没有提到会话。如果他知道这是至关重要的信息,他会在不发布问题的情况下解决此问题。他也没有提到 apache 和 os 的版本以及他的屏幕分辨率和许多其他的东西——因为通常这无关紧要。
  • 你在干什么?这与会话无关
  • “我尝试在脚本运行时重新加载页面或运行另一个 PHP 脚本,但什么也没发生 - 批处理电子邮件过程必须先完成”这正是第一个脚本锁定会话时发生的情况文件,第二个脚本必须等到它被解锁。
  • 他说得对,我正在使用会话进行管理员身份验证,以防止加载其他脚本
【解决方案2】:

你可以试试:

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

不要忘记& 符号,它基本上会说:“使用新线程来执行此操作”。

【讨论】:

  • 我认为(因为他说“但我的主机服务器不支持这个”)他使用的是通用网络空间主机(没有 root 访问权限),并且出于明显的原因,他们不允许系统调用。
猜你喜欢
  • 2023-02-06
  • 2017-02-27
  • 1970-01-01
  • 2019-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多