一、python文件位于项目中,非远程外部。
1、定义一个python测试文件
test.py
#!/usr/bin/env python
#-*- coding: UTF-8 -*-
print "这是一个测试"
2、定义一个url去访问一个php方法(我直接在laravel框架里测试的)
$output = exec("python /home/vagrant/code/php-dms/test.py"); // 1
// $output = shell_exec("python /home/vagrant/code/php-dms/test.py"); // 2
// $output = system("python /home/vagrant/code/php-dms/test.py"); // 3
// $output = passthru("python /home/vagrant/code/php-dms/test.py"); // 4
// $handle = popen("python /home/vagrant/code/php-dms/test.py",'r');
// $output = fread($handle,4096); // 5
dump($output);exit;
解析:
exec ( string $command [, array &$output [, int &$return_var ]] ) : string
备注: exec有3个参数,第一个是要执行的命令,第二个是参数是一个数组,数组的值是由第一个命令执行后生成的,第三个参数执行的状态,0表示成功,其他都表示失败。
查看具体信息需要使用 2>&1, 命令就会输出shell执行时的错误到$output变量, 输出该变量即可分析。
例如:
exec('ls 2>&1', $output, $return_val);
print_r($output);
exec参考链接:https://mp.csdn.net/postedit/91494115
1、2、3、4、5 分别对应输出:
总结:先说明一下,python在linux系统里是全局变量,所以执行shell可以直接调起python解释器去执行python文件。如果是windows,需要将python改为python.exe安装的地址。
从结果来看:
1、exec和shell_exec和popen差不多。
2、system会自动输出结果,所以其实无需打印。
3、passthru也是会自动输出结果,但不会将变量赋值。
具体它们之间有何差异,重建线程还是覆盖原有线程等,在此不再赘述,自行查阅资料吧,不过我项目里用的最多的就是exec。
参考:https://mp.csdn.net/postedit/91494115
请求发送方式curl、stream流、socket等。
二、PHP主动向python发送数据 socket
python要主动向PHP发送数据,很简单,通过http方式调用接口即可(常见),而PHP要向python发送数据,则需要使用到php的socket相关功能(不常见)。
/*socket收发数据
@host(string) socket服务器IP
@post(int) 端口
@str(string) 要发送的数据
@back 1|0 socket端是否有数据返回
返回true|false|服务端数据
*/
function sendSocketMsg($host,$port,$str,$back=0){
$socket = socket_create(AF_INET,SOCK_STREAM,0);
if ($socket < 0) return false;
$result = @socket_connect($socket,$host,$port);
if ($result == false)return false;
socket_write($socket,$str,strlen($str));
if($back!=0){
$input = socket_read($socket,1024);
socket_close ($socket);
return $input;
}else{
socket_close ($socket);
return true;
}
}
socker_read的第二个参数用以指定读入的字节数,你可以通过它来限制从客户端获取数据的大小。
注意:socket_read函数会一直读取壳户端数据,直到遇见\n,\t或者\0字符,PHP脚本把这些字符看做是输入的结束符。
三、PHP主动向python发送数据 stream流
可以使用 file_get_contents() 发送 HTTP POST 请求,使用一个流上下文对象即可实现。学院君stream
//测试已实现数据发送
<?php
$requestBody = '{"username":"nonfu"}';
$context = stream_context_create([
'http' => [
'method' => 'POST',
'header' => "Content-Type: application/json;charset=utf-8;\r\nContent-Length: " . mb_strlen($requestBody),
'content' => $requestBody
]
]);
$response = file_get_contents('https://my-api.com/users', false, $context);
?>
//这个是php.net的example
<?php
$opts = array(
'http'=>array(
'method'=>"GET",
'header'=>"Accept-language: en\r\n" .
"Cookie: foo=bar\r\n"
)
);
$context = stream_context_create($opts);
/* Sends an http request to www.example.com
with additional headers shown above */
$fp = fopen('http://www.example.com', 'r', false, $context);
fpassthru($fp);
fclose($fp);
?>
//最后这个请忽视
<?php
$fp = stream_socket_client("tcp://www.example.com:80", $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
fwrite($fp, "GET / HTTP/1.0\r\nHost: www.example.com\r\nAccept: */*\r\n\r\n");
while (!feof($fp)) {
echo fgets($fp, 1024);
}
fclose($fp);
}
?>
扩展:
ppython :传送门
开源项目既是结合使用PHP和Python两种语言,取其所长、补其所短,面向企业WEB领域的开发技术。此技术可以理解为PHP和Python相结合的 技术,也可称为PHP和Python混合编程技术,或者PHP调用Python服务的技术,也有人习惯称之为前台PHP后台Python的技术框架。