1. 程式人生 > >php呼叫指令碼或者系統函式

php呼叫指令碼或者系統函式

都知道呼叫系統函式式exec或者system這兩個方法,至於其他的我還不知道,學識有限。

至於這兩個函式個人喜好,我覺得沒什麼區別,不過建議呼叫系統函式使用system,呼叫指令碼什麼使用exec至於為什麼,只是個人按單詞字面理解,

今天說的是exec,剛好專案使用的抓取,前面用php curl方式,但是老長了,維護起來也是特糾結。有python這麼好的抓取利器不能浪費了,反正centos裡面自帶不是

exec呼叫方法

exec('python ' . dirname(dirname(__FILE__)). '/\python2/\getPay.py "' . $id . '" '.$url, $array, $ret);

這個是帶了兩位引數,$array是返回值,$ret是執行狀態,如果python報沒有找到,這時候$ret報的好像是127吧,可能你是docker環境,會遇到這個問題,應為你當前容器並不具備python只是系統底層具備

所以你可以有兩種方式解決,curl方式單獨開一個容器,這個容器也有php環境和python環境。在配置對映目錄建一個php檔案,呼叫通過curl埠加上這個新建的php檔案,就好


還有一個這個新建檔案呼叫返回資料大都是echo json_encode($data);這樣的吧!注意這樣curl抓取的bom頭,你直接json_decode($output);是解析不出來的

 $postData=array('pythontype'=>'getPay','id'=>$id,'url'=>$url);
           // $url = "";
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, 'https://172.0.0.1/getpython.php');
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// post資料
            curl_setopt($ch, 
CURLOPT_POST, 1); // post的變數 curl_setopt($ch, CURLOPT_POSTFIELDS, $postData); $output = curl_exec($ch); curl_close($ch);

if(preg_match('/^\xEF\xBB\xBF/',$output)){
    $output = substr($output,3);
}
$output = json_decode(trim($output),true);

差不多就是這樣的了,這樣做也有一個不好處就是埠暴露在外面,那就改成智慧內部服務呼叫就好curl地址改一下就ok.