PHP守护进程向Facebook,Twitter等提交过期状态更新

时间:2010-08-27 12:03:07

标签: php cron daemon

我正在构建一个应用程序,允许用户将他们的facebook,twitter,linkedin帐户链接到我的应用程序,而不是通过我的应用程序发布所有这些网站的更新。此外,用户可以“发布日期”状态更新。他们可以设置更新的日期和时间,这将导致更新仅在指定日期发布到请求的站点,而不是立即发布。

我已经通过 cron 作业完成了这项工作,该作业可以提取尚未发布的所有更新(有一个标志指示是否已在DB中发布更新)然后张贴它。我使用cron每分钟运行一次这个过程。 现在我的问题是,如果将足够的更新设置为同一时间,我将遇到PHP最大化执行时间的问题。我的直接工作是获取post_timestamp < current_timestamp的所有更新并尝试发布它们;因此,如果在某一特定时刻,某些更新尚未发送,则下一个cron运行将尝试发送它,如果它仍在最大执行时间限制内。

我知道这是实现我想要的非常蹩脚的方式。因此,我打算让某种守护进程继续运行并发布所有过时的更新。 实现这一目标的最佳方法是什么?我还需要这个守护进程来处理我正在进行的另一个项目。在这方面的任何帮助将不胜感激......:P

提前致谢。

2 个答案:

答案 0 :(得分:0)

Gearman可能就是您所寻找的:http://gearman.org/

答案 1 :(得分:0)

我编写了许多类似的基于PHP的系统 - 长时间运行的进程无法从频繁的Cron作业运行,因为它不能同时运行。

这是一个三阶段的过程。

  1. 初始脚本按需运行,或者在重新启动服务器时运行(请参阅vixie-cron @reboot)。这只是第二部分。
  2. 一个循环脚本,它调用您的PHP脚本以发送到期但尚未发送的所有操作
  3. 从数据库发送内容的脚本。
  4. 第二部分很容易。

    #!/bin/sh
    # this file is runSocialSend.sh
    
    BASEURL=http://alister.example.com
    URL=$BASE/path/actions/send-to-social-sites.php
    # don't store the output
    WGET="/usr/bin/wget  -O /dev/null -- "
    # wait this many seconds between runs
    SLEEP=20
    
    # could also just run it from the CLI - php -f ..../send-to-social-sites.php
    $WGET $URL
    sleep $SLEEP
    # and loop round again to restart...
    exec $0
    

    正确运行上述内容的第一部分更简单。

    #!/bin/sh
    
    killall runSocialSend.sh
    nohup ./runSocialSend.sh > /dev/null &
    

    从字面上看,杀死runSocialSend.sh脚本的任何其他实例,然后重新启动它,断开与'console'的连接,在后台运行它。