用php在后台运行脚本

时间:2011-09-20 02:21:11

标签: php shell

我有一个php函数,可以向所有关注该帖子的用户发送某个帖子。

因为有时可能会有多达10万用户关注该帖子。这意味着这个功能需要重复10万次,因此需要永久性。

我想知道是否有办法在后台运行迭代,但与此同时,发布答案的用户不必等待所有时间。

我正在考虑告诉用户该电子邮件已发送给所有用户,而不是等到所有帖子都被发送,只是在php的后台运行shell中的另一个脚本。

你认为这是最好的解决方案吗?如果没有,那么在后台进行所有处理的最佳方法是什么?

谢谢

3 个答案:

答案 0 :(得分:1)

将后台任务移至cronjob

可能是这样的:

  • 您有一个要在表格中通知的用户列表
  • 创建一个可执行以下操作的脚本:
    • 在每个脚本运行时,它将获取多行进行处理
    • 处理完行后,将其更新为已完成
  • 将此脚本设置为在xxx分钟运行。

<强>更新

实际上,还有另一个技巧:

  1. 您有要在users_tobenotified表格中收到通知的用户列表。
  2. 你有PHP脚本作为cron,它将在该表上读取并在名为/data/cron/tobenotified的某个目录中生成文本文件。此文件包含以下内容:

    [date]\t[time]\t[post-entry]\t[user-tobenotified]\t[someotherinfo]
    
  3. 将另一个PHP脚本作为cron,循环遍历/data/cron/tobenotified并读取每个文件然后进行处理。
  4. test ... test ... test ...
  5. 的利润!

答案 1 :(得分:1)

将这样的异步活动添加到PHP脚本并不简单,但可以像您正在寻找的那样增加巨大的性能提升。

方法一

将待完成的电子邮件或其中的一些元数据存储在数据库中,并将其标记为已处理:false。然后,在服务器上运行的cron作业或其他一些守护程序/进程会定期检查该数据库表以查找要发送的电子邮件,或者您正在卸载的任何内容。这可能是最安全的,因为你记录了什么时候被请求,然后实际发送。

方法二

对于我必须完成的特别棘手的工作,我实际上发射了一个在后台运行的bash命令:

$job = "/bin/myscript $param1 $param2";             
$job = "$job > /dev/null 2> /dev/null";
$cmd = "bash -c \"$job &\"";
exec($cmd)

请注意,在这种情况下,在调用exec()之后,您实际上无法控制事物。

<强>其他

以下示例类似于我的方法#2: http://robert.accettura.com/blog/2006/09/14/asynchronous-processing-with-php/

Gearman是另一种处理异步PHP任务的工具。他们甚至提到“Zend Framework现在正在使用它来执行提交后挂钩而不会让提交者经历延迟” http://css.dzone.com/articles/asynchronous-processing-php

答案 2 :(得分:-1)

您是否需要通过电子邮件单独通知每个用户?

为什么不在BCC字段上发送包含所有用户电子邮件地址的1封电子邮件?