2017年11月7日 星期二

Hostinger crontab 的正確執行路徑

昨晚想起我的 Hostinger 主機 Domain name 快到期了, 有來信詢問是否要續約, 因為租虛擬主機有贈送第一年免費, 第二年開始收費, 兩年 8.49 英鎊, 以匯率 39.6 計算, 折合台幣約 336 元 :




我在今年 2 月初因為試著將專案移到樹莓派上, 看看能否順利執行, 結果可以, 但也因此回到樹莓派與 Python 的研究上, 但不久又轉向到 MicroPython on ESP8266 上. 雖然發現 Hostinger 上跑的 crontab 有異常, 但實在無暇檢查到底哪裡出錯. 既然來到 Hostinger 後台, 那就順便檢查看看. 打開 cron job 執行報告, 發現是匯入函式庫失敗 :


PHP Warning:  include(../db.php): failed to open stream: No such file or directory in /home/u865685xxx/public_html/cron/fetch_taifex_options_pcr.php on line 141

檢查匯入函式庫原始碼如下 :

//載入 webbot 函式庫
include_once("../db.php");           //匯入資料庫設定檔 (必須)
include_once("../lib/mysqli.php");   //匯入資料庫模組   (必須)
include_once("../lib/parse.php");    //匯入剖析模組     (必須)
include_once("../lib/http.php");     //匯入http模組     (必須)

這是因為 cron job 程式放在根目錄的 cron 子目錄下, 而資料庫設定檔放在根目錄下, 因此要用 ".." 跳回上一層; 而函式庫放在根目錄的 lib 子目錄下, 所以先跳回上一層再往下走到 lib. 這個寫法在瀏覽器測試 OK, 但在 cron job 執行卻不行. 我在下面兩篇中看到, 應該要用 $_SERVER['DOCUMENT_ROOT'] 取得根目錄路徑才能正確匯入函式庫 :

PHP absolute path to root
PHP Warning: include_once() Failed opening '' for inclusion

所以我將程式碼改成如下 :

$root=$_SERVER['DOCUMENT_ROOT'];        //$root="/home/u865685122/public_html"
include_once($root."/db.php");          //匯入資料庫設定檔 (必須)
include_once($root."/lib/mysqli.php");  //匯入資料庫模組   (必須)
include_once($root."/lib/parse.php");   //匯入剖析模組     (必須)
include_once($root."/lib/http.php");    //匯入http模組     (必須)

但結果還是一樣, 用瀏覽器測試 OK, 但 cron job 還是不行.

後來我用線上客服的 Hecko 先生, 他說應該用明確的根目錄路徑, 可在 "HOSTING/HOME ROOT" 中查得 :




"No, that would be /home/u865685xxx/public_html/db.php, It must start with a "/" to show that it's a complete path"




改為如下寫法後果然已可正常運作 :

/* 載入 webbot 函式庫 */
$root="/home/u865685xxx/public_html";
include_once($root."/db.php");          //匯入資料庫設定檔 (必須)
include_once($root."/lib/mysqli.php");  //匯入資料庫模組   (必須)
include_once($root."/lib/parse.php");   //匯入剖析模組     (必須)
include_once($root."/lib/http.php");    //匯入http模組     (必須)

參考 :

關於 cron jobs 執行頻率的調整問題
cron jobs crontab 排程教學

沒有留言 :