2010-08-27 13 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腳本的任何其他實例,然後重新啓動它,從「控制檯」斷開,在後臺運行它。