在哈維硬體網上週改用新的新聞發布平台後,由於暫時的需要,原有的新聞平台並沒有徹底停止使用,所以在新平台開始使用後便發現一個讓人頭痛的問題,網站首頁總是被更新為原來的系統內容,最終導致某此新聞連結無法正常存取。新系統對URL做了最佳化,新聞頁面的網址和原系統不同。最初的時候以為是仍舊有人在使用舊的系統操作,可在第二天這樣的情況仍舊出現,便想到應當是舊系統的問題,後來檢查發現帝國CMS系統有一個默認的刷新首頁的任務,取消後網站首頁的更新便正常了。
解決這個問題後,我對php任務有了興趣,以前也有所了解,但卻沒有真正的去實踐,也許是考慮到這個功能對網站系統開發的重要性,所以現在決定研究一下,並編寫一套成熟的程式碼以便於以後應用。
首先是上網找相關的資料,透過閱讀這些資料,知道了PHP任務大體上可以分為三類。
伺服器規劃任務
WIN伺服器可以直接使用定時任務執行相關的應用程序,linux伺服器則可以透過在/etc/crontab裡新增定時任務來實現。
透過死循環實現任務自動執行
建立一個程式檔案頁面,透過ignore_user_abort來設定關閉瀏覽器頁面後仍可執行,那麼,在執行該程式頁面後,您所需要的任務計畫便會一直自動執行。對於一般的PHP程式設計師來說,如果沒有足夠的把握,這種操作是不被允許的,因為死循環極容易使用伺服器當機。
觸發式定時任務
在我所了解的幾套程序中,像Discuz、帝國CMS等等,均使用這種方式來完成系統的定時任務,相對前面的兩種方法,這是最為安全和簡單的。
有這麼多選擇,那麼在設計程序的時候應根據實際的需要選擇最為恰當的方式去做程序。下面就用實例做個介紹。
愛上文學網的電子雜誌在網站上線不久便製作出來了,這是透過電子郵箱傳遞的電子雜誌,將最新一期的電子雜誌發送到訂閱用戶的郵箱裡是一個龐大的工作,單純的頁面批量發送顯然是行不通的。主要原因是目前還沒有自己的郵件伺服器,像是新聞、騰訊以及163所提供的郵箱,儘管支援SMTP發送郵件,但卻不允許大批量的發送電子郵件,條件有限,那麼就只能透過程式來解決這個問題。
首先,我選擇觸發式定時任務,為了避免發送郵件的程式不會影響使用者造訪網站的體驗,主要是開啟網站頁面的速度,因此選擇使用Ajax來實現觸發。在公共JS檔案裡增加觸發函數,使用者在造訪任何頁面的時候便可以觸發郵件發送任務。
為了限定郵件發送的頻率,防止因為過度頻繁發送郵件被郵件伺服器禁止,在程式上也做了時間的限制,使用RAND隨機產生一個等待時間,解決發送郵件不是固定間隔時間,實際上觸發模式中間隔時間本來就不確定,但當網站訪問量大的時候,還是有可能出現這樣的問題,所以加一下這方面的設定還是比較穩健。
儘管有了上面的一些措施,在實際應用中還是發現會被郵件伺服器禁止發送郵件,但不是永久禁止。解決這個問題的方法是建立一個數組,將不同的郵件服務SMTP參數保存起來,當一個郵件伺服器無法正常發送郵件的時候,則會自動跳轉使用另一個郵件伺服器。
在所收集的郵箱地址清單中,會有一些無效的地址,在發送郵件的過程中,如果一次發送不同功,則切換另一個郵件伺服器再次發送,如果均不成功,則將這個郵件地址設為無效,以後便不會再向這個地址發送郵件,從而提高郵箱地址清單的有效率,也為下次發送郵件節省了時間。
有朋友說我太小氣,在這類日誌裡分享的程式碼太少,其實我們上網查資料的時候便會發現,許多網站分享的程式碼不一定實用,有時還會因為參考這些程式碼而耽誤了許多時間,所以我在總結的時候往往總結解決問題的方法,並把關鍵的技術參數記下,以便以後再遇到類似的問題自己也有了可以參考的資訊。如果你有這方面的問題,可以透過留言、電子郵件和我聯絡。
作者快樂男孩的個人空