phpy 是Python
与PHP
互调用库,可以在PHP
中使用Python
语言的函数和类库,或者在Python
中使用PHP
的包。 但不是语言内嵌。编码依然使用各自的原生语法。
phpy
使得PHP
可以调用所有Python
的包,包括当下非常流行的PyTorch
、transformers
、TensorFlow
等AI
库,以及Numpy
、Pandas
、Scikit
等科学计算库,还可以使用PyQt
、wxPython
等图形界面库。
- 目前仅支持 Linux 平台(理论上可以支持所有操作系统,待实现)
- 不支持 Python 多线程、
async-io
特性
PHP 调用 Python
编译安装phpy.so
作为扩展加载,修改php.ini
追加extension=phpy.so
即可。
例子:
$os = PyCore::import("os");
$un = $os->uname();
echo strval($un);
Python 中调用 PHP
直接作为C++ Mudule
,import 加载即可。
import phpy
content = phpy.call('file_get_contents', 'test.txt')
o = phpy.Object('redis')
assert o.call('connect', '127.0.0.1', 6379)
rdata = phpy.call('uniqid')
assert o.call('set', 'key', rdata)
assert o.call('get', 'key') == rdata
实现原理
在进程内同时创建了ZendVM
和CPython VM
,直接在进程堆栈空间内使用C
函数互相调用, 开销只有zval <-> PyObject
结构体转换,因此性能是非常高的。
实际案例
基于 tkinter
实现 GUI
的例子
<?php
$tkinter = PyCore::import('tkinter');
$root = $tkinter->Tk();
$root->title('我的窗口');
$root->geometry("500x500");
$root->resizable(False, False);
$button = $tkinter->Button($root, text: "Click Me!!", command: PyCore::fn(function () {
var_dump(func_get_args());
echo 'click me!!' . PHP_EOL;
}));
$button->pack();
$tkinter->mainloop();