一、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的socket编程

三、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的技术框架。 

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐