2012-07-07 20 views
0

我有一個PHP腳本,拉下了一堆RSS提要。爲了防止出版商的服務器過載,我使用PHP Sleep功能來減慢速度。PHP與冗長的循環造成不穩定的服務器錯誤

整個腳本可能會持續幾個小時。

如果我從GoDaddy上的Cron作業運行它,它將愉快地工作5 - 10分鐘,然後返回服務器錯誤。我檢查了PHP的最大執行時間是30秒,所以我不確定這是否是問題的原因。

如果我在我的Mac上運行這個作業,我的本地PHP也有30秒的默認最大執行時間,但是如果我從終端運行它,這個腳本會工作,但我不明白爲什麼。

如何循環腳本超過30秒而不會遇到不可靠性問題?

幫助讚賞。

回答

2

簡短回答是使用set_time_limit(0)來允許長時間運行的腳本。您的終端(CLI)PHP可能已將其設置爲0.您也可能內存不足,特別是在PHP 5.2或更低版本上。將所有錯誤記錄到文件中,並檢查它。

您可以重寫您的程序,以便能夠在一次運行期間處理數據的子集。這種方法的好處是您可以使用它來全天候運行或每五分鐘運行一次,具體取決於PHP環境支持的內容。您也可以一次運行多個實例,每個實例都處理自己的數據。

+0

謝謝馬特。麻煩的是GoDaddy(我瞭解大多數其他主機,不允許更改time_limit。)因爲每個RSS下載都非常快,所以您對子集的想法是很好的。但是,如何創建一個時間表來下載一個時間,比如兩個小時?我是否必須創建數百個克朗作業? – Jeremy 2012-07-07 21:13:11

+0

@Jeremy也許你可以跟蹤數據庫中下載的內容和剩餘內容,並以固定的時間間隔運行你的腳本,然後讓腳本根據他們以前的下載時間決定下載哪些內容。只是一個想法,雖然可能看起來有點含糊:) – Sarwara 2012-07-07 21:17:06

+0

@Jeremy,一個簡單的方法是把一個列表放在數據庫中。添加一個狀態/ PID列。在開始時,'更新作業SET pid = $ pid WHERE status IS NULL LIMIT 50'。然後選擇具有匹配PID的那些,並在完成時更新其狀態。每X分鐘運行一次。你並不是真的想要重疊的工作,儘管只要你跟蹤PID(或工作編號等),它就不會受到傷害。更強大的解決方案存在,但這是簡單而有效的。 – Matthew 2012-07-07 21:36:07