我已经在我的树莓派上使用PHP
一段时间了,我的Apache2
网络服务器。 它工作得很好,但我厌倦了总是不得不思考"我如何在 PHP 中进行 X"或"PHP 中的函数名称是什么"。
我有一个强烈的印象,即应该有一些等效的东西,我可以用python
代码替换<?php ?>
代码,但我的搜索结果充其量是令人困惑的。
我本质上正在寻找一些东西,我可以在 HTML 脚本中编写任何python
代码,并在请求时对其进行解释和执行,并将其输出插入页面。
例如,要从python
中的列表创建用户表。
<table><tr><td>User list</td></tr>
<?python
import json
library=json.load(open(some_json_file,'r'));
for user in library:
print "<tr><td>"+user+"</td></tr>"
?>
</table>
我的印象是变色龙可以使用此处描述的代码块来做到这一点,(https://chameleon.readthedocs.io/en/latest/reference.html),但当我深入研究时,我得到的印象是它不像我认为的那样工作。 这是我从我看过的所有模板引擎以及 WSGI 中得到的印象
PHP的python替代品有很好的下降吗? 或者有没有办法将半复杂的 python 代码干净地包装到我的 php 中,而不涉及编写由 PHP 调用的额外 python 脚本? 我试过exec()
python -c
;但这并不理想,必须逃离所有的 ' 和 ' 字符......
更新
下面的代码工作得很好,但如果在脚本中多次运行,可能会变得非常慢(在树莓派上每次大约需要 0.4 秒)。 我用python编写了一个程序,该程序在后台运行并处理来自php的请求,运行速度提高了约15倍。 我现在在 github 上维护它。
原始答案
在搞砸之后,我能够想出一些最适合我正在做的事情的东西。 在我的php中,我创建了一个执行python脚本的函数。
<?php
function py($s){
exec("python -c '$s'",$arr);
foreach($arr as $v){
echo $v."n";}
}
?>
然后我使用 phpHeredoc
(相当于 python "",意味着我不必转义每个双引号)来填充函数:
<?php
py(<<<python
print "Hello world<br>"
s="ello world"
for x in s:
print x+"<br>"
python
);
?>
输出>>>
Hello world
e
l
l
o
w
o
r
l
d
在这一点上,我遇到的唯一真正的缺点是这种方法使我无法在Python脚本中的任何位置使用单引号......:(。 我会克服的。
编辑
我添加了一些调整,使其更加有用。 新功能如下:
<?php
function py($s,$return=false){
$s=str_replace("'","'''",$s);
$h=<<<head
def cleanup():
for x in globals().keys():
if not x.startswith("_"):
del globals()[x]
import dill
try:
dill.load_session("pyworking.pkl")
except:
pass
head;
$f=<<<foot
import dill
dill.dump_session("pyworking.pkl")
foot;
if ($return==false){
echo shell_exec("python -c '$h$s$f'");
}
else {
return shell_exec("python -c '$h$s$f'");
}
}
?>
这允许您在脚本中使用单引号,并在同一脚本中多次调用py()
函数,您的变量和模块将跟随您。在脚本结束时,您只需调用清理(或使用 php 清除 pyworking.pkl 文件)并擦除环境。
我还把这个函数放在一个文件中,在我的pyp.ini
我使用auto_prepend_file=my/file/location
自动包含它,所以不需要事先加载它。
总的来说,我对这种方法非常满意,特别是因为我可以在我的 python 脚本中读取 php 变量。 传递对象非常简单,如下所示:
<?php
$data_en=json_encode($data);
py(<<<p
import json
data=$data_en
#do something with data
p
);
?>
如果我能想到一种在脚本中为 PHP 变量赋值的方法,那将是完美的,但如果你想要 PHP 和 Python 的融合,或者只是一种在不编写 Python 网络服务器的情况下用 Python 做所有事情的方法,这将不是一个糟糕的解决方法(我也做过)。