avatar

麦兜的小站

MDO.INK

  • 首页
  • 随笔
  • 知识库
  • 归档
  • 动态
  • 标签
  • 关于
Home 用PHP调用Python程序
文章

用PHP调用Python程序

Posted 2025-01-23 Updated 2025-01- 23
By power 已删除用户
24~31 min read
  1. 利用ppython.sh 来替换screen或tmux

请注意:这种方式和supervisor互斥

# 开启ppython服务
sh ppython/ppython.sh
# 停止ppython服务
sh ppython/ppython.sh stop 
  1. 所有重要信息都会被记录在日志里 ppython/log/python/all.log ,默认按天进行分割,保留最近10天日志,追错/排查不再抓瞎

  1. 强烈建议使用supervisor来管理你的ppython服务

supervisor简介

C/S架构的进程控制系统,可使用户在类UNIX系统中监控、管理进程。常用于管理与某个用户或项目相关的进程。 官网地址:http://www.supervisord.org

组成部分

supervisord:服务守护进程 supervisorctl:命令行客户端 Web Server:提供与supervisorctl功能相当的WEB操作界面 XML-RPC Interface:XML-RPC接口

使用方法

  • 安装supervisor

    # 注意,supervisor不支持python3,如果你默认是python3请使用pip2 isntall supervisor来安装
    pip install supervisor 
    
  • 修改配置文件

    ①在supervisor/supervisord.conf搜索 /Users/liuzhen20/work/2019/php-python/ppython/ ,然后将这几处替换成你的ppython所在位置

    ②修改supervisor/supervisord.conf第22~25行

    [inet_http_server]         ; inet (TCP) server disabled by default
    port=127.0.0.1:8886        ; 这里改为你的IP地址和端口
    username=admin              ; 默认用户名
    password=admin2019               ; 默认密码 
    

    ③在supervisor/ppython.ini搜索 /Users/liuzhen20/work/2019/php-python/ppython/ ,然后将这几处替换成你的ppython所在位置

  • 启动服务

    sh ppython/supervisord/super_update.sh 
    
  • 访问服务

打开上面配置的IP+端口号 http://127.0.0.1:8886

Enjoy it!

本类库基于年久已不再维护的ppython改写,为了表达对它的敬意,我决定沿用原名称。


ppython是一个令人兴奋的项目,但是已经在14年停止维护和更新。以下部分文字摘自原ppython介绍,原文地址 http://www.oschina.net/p/ppython

许多人在纠结WEB快速开发究竟是采用PHP,还是采用Python,二者同样是脚本语言,但特点鲜明:

PHP: Web专用开发利器,有10多年的经验积累,但其他领域基本不涉及,扩展性不强,企业应用少。

Python: 近期的明星语言,面向对象、简单高效、可扩展性强,但Web开发积累少,成熟度低。

ppython开源项目既是结合使用PHP和Python两种语言,取其所长、补其所短,面向企业WEB领域的开发技术。此技术可以理解为PHP和Python相结合的技术,也可称为PHP和Python混合编程技术,或者PHP调用Python服务的技术,也有人习惯称之为前台PHP后台Python的技术框架。

本项目是LAJP项目的语言环境的拓展,变化是将LAJP中的Java语言变更为Python语言,因此LAJP的技术、文档对本项目有参考作用。

特点

优势互补: PHP和Python都是流行的脚本语言,PHP非常适合网页编程;而Python可以当作轻量级JAVA,二者结合可发挥各自优势。

高效稳定: Apache+PHP组合可带来优异的WEB服务稳定性,而Python的语言能力可补充如连接池、事物管理、分布式、对象模型等高端特性。

通信机制: PHP和Python间的通讯方式采用TCP Socket和Unix Socket两种机制,兼顾通讯效率和分布式。

数据类型自动转换机制: PHP数据和Python数据可准确地自动匹配和转换,无须程序员编写解析代码。

易用: 安装配置简单,PHP端和Python端编程符合各自的编程习惯。

轻量级: 架构非常轻量级,除了最基本的PHP和Python环境,不需要任何扩充的、第三方的组件、容器。

PHP和Python的互通:

提高Python的多线程效率

Python因其语言GIL特性,多线程效率不高。在PHP+Python的混搭机制中,Python端可以多进程方式部署,从而提高Python的整体工作效率。


相对于已经年久失修且各种报错的旧版ppython,我做了相应的优化和修正,您可以很容易的集成在任意PHP项目中!

新的ppython主要改进了以下内容:

  • 将原生代码封装成可供调用的类库,开发者不需要关注深入的代码逻辑即可方便的使用;
  • 改正了原项目中很多错误,精简了代码,去除无用代码;
  • 将方法调用逻辑优化,从只传入文件名改为默认需传入文件夹/文件名,这样使开发者可以更好的管理Python文件;

  • 确保PHP已经打开socket相关模块
  • 确保你的服务器上有Python3及以上版本

  1. 克隆代码放到example的extend目录下。

  2. 在python目录下新建文件目录和文件,例:test/test.py。

  3. python文件的基本写法和以前没有区别,其实就是将对外部访问的部分封装成方法,最终要将结果返回一个字符串或数组。

    在test.py中写入你要调用的方法,例:

    # 无参数
    def hello():
        return 'Hi , Tommy'
    
    # 传递参数
    def hello_name(name):
        return 'Hi , ' + name
    
    # 返回数组
    def return_arr():
        user = {}
        user['name'] = 'Tommy'
        user['age']     = 24
        return user
    
    # 由于PHP传过来的参数都会被处理成字符串类型,所以需要使用数字类型的地方请自行转换,如若是其他类型数据做类似处理,否则会报错。
    # 但是由Python传给PHP的结果的数据类型不受限制
    def dosum(num1 , num2):
        return int(num1) + int(num2) 
    
  4. 使用终端用python3运行类库下的php_python.py文件

    看到以下输出,证明启动成功

    -------------------------------------------
    - PPython Service
    - Time: 2017-08-04 13:24:13
    -------------------------------------------
    Listen port: 21230
    charset: utf-8
    Server startup... 
    

  • 头部要引用该类库

  • 示例代码

<?php
namespace appindexcontroller;
use ppythonPpython;

class Index
{
    // 不带参数
    public function py()
    {
        $python = new Ppython();
        $data = $python->py("sayhi.hi::hello");
        dump($data);
    }

    //带参数的方法
    public function py_with_something($name)
    {
        $python = new Ppython();
            // 更多参数依次往后添加
        $data = $python->py("sayhi.hi::hello_name",$name);
        dump($data);
    }

    // python返回的是数组
    public function py_arr()
    {
        $python = new Ppython();
        $data = $python->py("sayhi.hi::return_arr");
        dump($data);
    }

    // PHP传递数字类型变量,计算2+3的和
    public function py_num()
    {
        $python = new Ppython();
        $data = $python->py("sayhi.hi::dosum",2,3);
        dump($data);
    }
} 

  • 开启服务器,将根目录指向example的public下。

  • 访问不带参数的方法

http://localhost/index/index/py 

直接会得到结果

  • 访问带参数的方法,可以依次将参数跟在方法后面
http://localhost/index/index/py_with_something/name/Handsom_Tommy 

经过Python处理后得到结果(多参数的情况按照说明使用即可)

string(18) "Hi , Handsom_Tommy" 
  • Python返回给PHP的结果不受限制,我们来测试下返回一个数组
http://localhost/index/index/py_arr 

得到相应数组

array(2) {
  ["name"] => string(5) "Tommy"
  ["age"] => int(24)
} 
  • 由于PHP传过来的参数都会被处理成字符串类型,所以需要使用数字类型的地方请自行转换,如若是其他类型数据做类似处理,否则会报错。
http://localhost/index/index/py_num 

得到以下结果,Python返回给PHP的数据类型不受限制

  1. 必须使php_python.py一直运行着

    使用本类库必须进行服务器端的相关操作,其实是起socket服务,以支持PHP和Python之间的通信。

    从上面已经可以看到,必须要让php_python.py运行着,这个类库才能正常使用,因此我们需要在服务器端进行一些必要的操作。我只提供思路和自己的解决办法,如果您有更好的解决方法,请联系我。

    解决方案原理: 当我们断开SSH连接时,依然保持该文件的运行状态。

    利用screen或tmux这类工具运行php_python.py,这样我们断开SSH连接也没关系,它会在后台继续运行。这类工具具体使用方法请自行搜索。

    GOOD NEWS!

    现在支持自管理脚本/supervisor进程管理啦!详情请看最上面【令人惊喜的更新】

  2. ~如果在已有文件中添加新的代码,必须先ctrl + c来shutdown上述php_python.py文件,然后重新运行该文件。否则,新添加的代码不起效果。~

    但是,如果是新添加了目录或文件,不用进行重启操作。

    GOOD NEWS!

    现在支持LOAD_TYPE设置啦!你可以在process.py里指定LOAD_TYPE的值。

    • 默认为0,即原有模式:如果在已有文件中添加新的代码,必须先ctrl + c来shutdown上述php_python.py文件,然后重新运行该文件。否则,新添加的代码不起效果。
    • 1为reload模式,此时可以动态加载模块,修改代码不必再重启ppython服务
知识库
License:  CC BY 4.0
Share

Further Reading

Jul 31, 2025

如何实现接口幂等性

通俗的说,用户在系统中有操作,不管重复多少次,都应该产生一样的效果或返回一样的结果的。 幂等性的概念 幂等(Idempotent)是一个数学与计算机学的概念,常见于抽象代数中。 f(n)=1^n//无...

Jul 19, 2025

10个npm工具包

有了npm之后,前端人员真的是过上好日子了。我们可以直接把别人写好的工具包拿来用,非常的方便。 1.day.js-轻量日期处理 npminstalldayjs importdayjsfrom'd...

Jul 17, 2025

How to set up PHP7.4 on MacOS.

Thisisallverywellandgood.Apartfromonesmallinsignificantthing… TheversionofPHPinuseiscurrently7.4. Th...

OLDER

Hono - Web framework built on Web Standards

NEWER

手把手教你 nodejs 保存各种小姐姐

Recently Updated

  • 如何实现接口幂等性
  • 10个npm工具包
  • How to set up PHP7.4 on MacOS.
  • Automa:一键自动化,网页数据采集与工作流程优化专家Automa:解锁自动化
  • Mac 下用 brew 搭建 LNMP

Trending Tags

thinkphp clippings

Contents

©2025 麦兜的小站. Some rights reserved.

Using the Halo theme Chirpy