IT Knowledge Base

~ Without sacrifice, there can be no victory ~

發佈日期:

分類:

,

如何使用GoDaddy的週期性執行指令(Cron job)服務‧執行PHP檔案

01. 早2天完成了PHPExcel檔案,主要的目的是自動向某些用戶週期性發送電郵。在GoDaddy伺服器上,執行那些PHP檔案是沒有問題的。但當設定以Cron job模式自動執行時,問題便出現了。而更想不到的是,一個Cron job居然引伸出那麼多的學問。

02. 遇上的的問題有兩個。第一是如何在GoDaddy伺服器,用Cron job執行PHP檔案,第二個是不論設定任何時間,都好像收不到那個電郵。

03. 登入GoDaddy帳戶,我用的是最經濟的Linux主機配以cPanel。Cron job的選項是在『進階』選單內。

04. 第一步驟建議先設定一個電郵,每當Cron job被執行時,這個電郵也會收到通知。好處是你至少會知道Cron job是被執行了,再看程式碼有沒有問題。

05. 在新加入Cron job前,建議先了解現在伺服器的PHP版本。為何呢?根據GoDaddy網上文件指出,不同的PHP版本,PHP執行檔是放在不同位置。

06. 檢查PHP版本的位置,是位於『管理』、『軟體』、『選擇 PHP 版本』內看到。

07. 現在使用的是PHP 5.5的版本。

08. 根據文件GoDaddy網上文件,PHP執行檔是存放於/usr/bin/php位置。那Cron job的內容,應該類似:

/usr/bin/php http://www.xxx.com/folder1/test.php

09. 如果是這樣想,Cron job是永遠不會被執行的。正確執行PHP檔案,路徑應是伺服器實際位置。打開『檔案管理員』。

10. 左邊便看到檔案實際位置的結構。

11. 那正確的Cron job的內容,就是:

/usr/bin/php -q /home/<username>/public_html/folder1/test.php

12. 設定好Cron job時間,假設是上午9點。

13. 之後就發現,就是永遠也收不到第4步驟題及的電郵通知,而PHP檔案也從未被執行。

14. 第一刻想到,會不會是現在GoDaddy伺服器上設定的時區,並不是PHP檔案中設定的Asia/Hong_Kong時區呢?用phpinfo()檢查一下,便會看到現在GoDaddy伺服器時區。

15. 時區是UTC,即是格林威治時間GMT+0,那再試一下把原來Cron job設定的時間,改為上午1點。

16. 等了又等之後,第4步驟題及的電郵通知,以及PHP檔案也是沒有被執行。再想想,現在使用中的GoDaddy伺服器是設在北美的資料中心,那會不會時區是設在北美時區呢?

17. 但北美好像也有幾個不同的時區呢?那究竟伺服器的時區又在那裡呢?看看維基百科,一點頭緒也沒有。但原來有個最最簡單的方法,可以知道伺服器的地址呢。辦法是先看看網站的實體IP地址。

18. 再在網上用WHOIS IP_ADDRES方式查看伺服器的地址,再用地址查看時區。

19. 以今次為例,伺服器的實體地址是位於美國亞利桑那州,時區是GMT-15。

20. 以GMT-15來設定Cron job時間,到達指定時間,便會執行有關PHP的檔案。而第4步驟輸入的電郵,也會收到通知。

21. 當以為一切問題也解決了,那我真是太膚淺了,電郵通知卻又出現錯誤了。

22. 之前說過,執行PHP檔案在瀏覽器上測試是沒有問題的。但現在卻出現找不到檔案。再看看PHP檔案的程式碼,問題就是出在這裡。

$inputFileName = 'USD_RMBHKD_RMB.xls';
try {
$inputFileType = PHPExcel_IOFactory::identify($inputFileName);
$objReader = PHPExcel_IOFactory::createReader($inputFileType);
$objPHPExcel = $objReader->load($inputFileName);
} catch(Exception $e) {
die('Error loading file "'.pathinfo($inputFileName,PATHINFO_BASENAME).'": '.$e->getMessage());
}

23. 更改以下內容。所有PHP檔案出現的變數,需要以實際位置表達才能成功讀取。

由:
$inputFileName = 'USD_RMBHKD_RMB.xls';
更改為:
$inputFileName = '/home//public_html/folder1/USD_RMBHKD_RMB.xls';

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *