2010-08-27 75 views
1

我正在构建一款应用,让用户将他们的Facebook,Twitter帐户和LinkedIn帐户链接到我的应用,并通过我的应用发布到所有这些网站。此外,用户可以'后日期'状态更新。他们可以设置更新的日期和时间,并且只会在指定的日期将更新发布到请求的网站,而不是立即发布。PHP守护进程向Facebook,Twitter等提交过期状态更新

我得到这个工作很好,cron工作,提取所有尚未发布的更新(有一个标志,指示更新是否已发布或不在数据库中),然后发布它。我使用cron每分钟运行一次这个过程。 现在我的问题是,在足够的更新设置为同一时间的情况下,我会遇到PHP最大限度地缩短执行时间的问题。我目前的工作是获取所有包含post_timestamp < current_timestamp的更新并尝试发布它们;所以如果在某个特定的分钟内,一些更新没有被发送,下一个cron运行将尝试发送它,如果它仍然在最大执行时间限制内。

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

在此先感谢。

回答

0

我已经写了一个数字,做类似的事情PHP为基础的系统 - 不能从频繁的Cron作业运行为长时间运行的进程它不能被允许同时运行。

这是一个三阶段的过程。

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

第二部分很简单。

#!/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脚本的任何其他实例,然后重新启动它,从“控制台”断开,在后台运行它。