2016年11月26日 星期六

Hostinger 的 Advanced Cron Jobs 設定

昨天終於有空將我的 PHP 專案上傳到 Hostinger 虛擬主機, 安裝好應用程式後馬上就來測試它的 "Advanced Cron Jobs" 功能, 如果好用的話就可以自行觸發 PHP 程式的執行, 不用再依靠 GAE 的 Cron  Jobs 從外部查詢觸發了.

首先登入後台管理頁面, 往下移到 "Advance" 區塊按 "Advanced Cron Jobs" 鈕 :



最上面 "Command to run" 框是填入要執行的 PHP 程式, 裡面有提示預設格式如下 :

/usr/bin/php /home/u123456789/public_html/cron.php

注意喔, php 與後面的 / 之間必須空一格, 我第一次輸入就忽略這個, 雖然可以順利建立一個 cron, 但是在 View Output 時就會看到下列 "Not a directory" 的錯誤訊息 :

/bin/sh: /usr/bin/php/home/u123456789/public_html/cron/fetch_twse_daily_close.php: Not a directory

我猜這是 Hostinger 當初在 /user/bin 下建立 php 目錄時多敲了一個空格所致, 可能用戶多了之後才發現, 只好將錯就錯了. 我的 cron jobs 檔都放在根目錄的 cron 資料夾下面, 所以正確的路徑應該是 :

/usr/bin/php /home/u123456789/public_html/cron/fetch_twse_daily_close.php



這樣 cron tables 便設定完成, 按 "View Output" 可看到最近一次執行結果 (如果沒有的話, 可能是被瀏覽器擋掉了, 檢查網址列是否有顯示自動阻擋彈出式選單的統計, 將其取消阻擋即可). 與 "Cron Jobs" (Simple) 比較, "Advanced Cron Jobs" 最快執行頻率可設到每分鐘跑一次, 設定選項比較細比較多; 而 "Cron Jobs" 則最快是一小時跑一次, 而且只能在整點時跑 (即 0 分時), 選項也比較少.


"Cron Jobs" (Simple) 的 command to run 欄位已經預先固定路徑到我的帳號底下, 因此不會碰到 "Advanced Cron Jobs" 中 php 後面須有一空格問題.

不過, 不論是 "Advanced Cron Jobs" 或 "Cron Jobs", 同一個程式只能設一次, 但如果分別在兩邊各設一次則可以, 亦即兩者是各自獨立的. 要解決此問題也很簡單, 就是把要在不同時間執行的程式複製為另一個檔案, 例如 fetch_twse_daily_1.php 與 fetch_twse_daily_2.php 即可, 或者乾脆就每個小時執行一次也不為過, 有些意天只能產生一筆的資料就在程式中用日期欄位來判斷即可.

當然我還是可以從外部用 GAE 來觸發執行, 但先看看內部觸發跑的情況如何, 優的話就不必用到 GAE 了.

2016-11-29 補充 :

觀察 Cron jobs 運轉兩天的報告, 我發現指定時間執行的程式都比預期時間晚 8 個小時執行, 例如指定 16:00:00 執行, 實際上卻是到 00:00:00 才真的跑. 我猜這是因為台灣與英國有 8 小時時差的關係, 我們是 GMT+8, 所以若指定下午四點執行, 我們下午四點時英國才當日早上 8 點, 而英國下午 4 點時我們已是晚上 12 點. 我已寫信詢問 Hostinger 是否有地方可以設定 Cron Jobs 時區的? 不過我相信是沒有, 這部分可能得自己換算, 反正就是將我們預定要執行的時間減 8 即可, 要不然就改為每小時或每兩小時執行一次, 然後在程式中依據日期欄位判斷是否已經執行過了, 是的話跳過即可.


沒有留言 :