都知道调用系统函数式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.