2013年6月19日 星期三

Appfog 的 PHP 以 ini_set() 設定時區無效問題

今天下午把 stockbot 專案部署到 Appfog, 晚上檢查 cron log 發現時間都不對, 差了 8 個小時, 顯然還是主機所在位置 (愛爾蘭) 的時間. 我是用這個指令來指定為台北時間 :

ini_set('date.timezone','ASIA/Taipei')

這在別的 PHP Hosting 似乎沒問題, 但到 Appfog 就有問題, 可見 Appfog 無法更改 php.ini 內容. 還是用 date_default_timezone_set() 比較保險. 所以我把每一個 cron 程式頭的 ini_set 都改成如下 :

#設定時區以使 cron_log 紀錄台灣時間
@ini_set('date.timezone','ASIA/Taipei');  //不一定有效
@ini_set("max_execution_time","120");     //不一定有效
date_default_timezone_set("Asia/Taipei");
echo date_default_timezone_get()."<br>";

重新發佈之後, cron log 資料表所記錄的就是台灣時間了.
另外, 同時也發現一個問題, 也就是若 stock_list 資料表是空的 (也就是還沒執行過 fetch_twse_daily_close.php), 那麼去抓 Yahoo 資料的 cron 程式也會做白工, 因為每一次從 stock_list 抓幾筆 stock_id, 便去擷取相應網頁來分析, 如果 stock_list 是空的, 那麼迴圈也就不會跑. 所以, 相關的 2 個 cron 程式要做些修改 :

$SQL="SELECT `stock_id` FROM `stocks_list` WHERE NOT `stock_id` LIKE '0%'";
$RS=run_sql($SQL);
if (count($RS)==0) {
    header('Location: fetch_twse_daily_close.php');
    } //end of if

這樣一來, 只要是交易日, 只有第一個 cron 程式會失敗, 但它會觸發 twse 的擷取動作, 填滿 stock_list 資料表, 第二個執行的 cron 程式就會成功了. 但若系統啟動時為非交易日, 則要到下一個交易日收盤資料可以抓到時才會真正抓到資料, 在此之前全部都是做白工.

沒有留言 :