php调用脚本或者系统函数

来源:互联网 发布:sql 添加默认值 编辑:程序博客网 时间:2024/05/23 21:40

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