php呼叫指令碼或者系統函式
阿新 • • 發佈:2018-11-29
都知道呼叫系統函式式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.