2011年6月21日 星期二

PHP + IIS + 工作排程

<?php

$dir = dirname(__FILE__);

$rootpath = explode("system",$dir);
define('ROOT', $rootpath[0]); //本系統根目錄的路徑
require(ROOT.'system/config.php');
//以上是為取得 ROOT 這個參數內容,絕對路徑。
//例如 C:\Inetpub\www\

set_time_limit(0);

//週一到週五執行
if(date(w)!=6 || date(w)!=0){

 //$url = ROOT.'system/cron/aaa.php';

 $url = 'http://'.$server_host.'/system/cron/aaa.php';

 $msg_array[] = cron($url, array('db'=>1));



 //$url = ROOT.'system/cron/aaa.php';

 $url = 'http://'.$server_host.'/system/cron/aaa.php';

 $msg_array[] = cron($url, array('db'=>2));



 //$url = ROOT.'system/cron/bbb.php';

 $url = 'http://'.$server_host.'/system/cron/bbb.php';

 $msg_array[] = cron($url, array('db'=>1));



}

//執行完之後,把執行情況寫到某個檔案。

writeLog($msg_array);



function cron($url,$post_data=array()){

 $ch = curl_init();

 curl_setopt($ch, CURLOPT_URL, $url);

 curl_setopt($ch, CURLOPT_HEADER, 0);

 curl_setopt($ch, CURLOPT_POST, 1);

 curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);

 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

 curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);

 curl_setopt($ch, CURLOPT_TIMEOUT, 600);

 $output = curl_exec($ch);

 curl_close($ch);

 return $output;

}



function writeLog($msg_array){

 //創建當月資料夾

 $log_folder = ROOT.'system/log/cron/'.date("Ym");

 if(!is_dir($log_folder)) mkdir($log_folder, 0775, true);



 //建立檔案

 $log_file= $log_folder.'/'.date("Y-md").'.txt';



 $fp = fopen($log_file, "a+");

 if($fp){

  //$msg = $msg . "\r\n GET=".$_GET['sync_dbno'].;

  foreach($msg_array as $value){

   $value = $value."\r\n";

   fputs($fp,$value);

  }

 }

 fclose($fp);

}

?>

筆記:

原本打算使用這種:

D:\PHP\php.exe -f "C:\Inetpub\www\system\cron.php"

測試後,curl 似乎不能使用實體路徑,要用 http:// 這種 url 才行。

所以變成:

D:\PHP\php.exe -f "http://192.168.1.1/system/cron.php"

結果程式在我的電腦測試正常後,丟到公司 Windows 2003 Server 卻無法執行。工作排程不行,黑底白字的命令提示字元也不行。可能因為伺服器是用 IIS6.0 ,而我的執行環境是 Apache 。

會出現錯誤訊息:Could not open input file

矛盾:curl 要用 url,但 php + iis 寫到工作排程,卻要用實體路徑。

最後決定使用 IE ~~

"C:\Program Files\Internet Explorer\iexplore.exe" "http://192.168.1.1/system/cron.php"

用 IE 就可以去打開 url。

不過這樣一來,桌面每天都會開一個瀏覽器,而且不會自己關掉。所以再加這段自動關閉的 JavaScript:

<script>

function closeWindow(){

 window.opener = null;

 window.open("", "_self", "");

 window.close();

}

setTimeout("closeWindow();", 3000 );

</script>



疑問:

curl 真的不使用實體路徑嗎?

PHP + IIS,不能使用 url ?

沒有留言:

張貼留言