我有一项任务要求我处理大量数据同步,由于脚本执行时间短,PHP 无法处理。我的选择是启动 Python 脚本并让 PHP 终止(向用户显示“成功完成”等消息)。我已经尝试了我可以在 SO 和其他地方通过谷歌找到的所有选项,但都没有用。
在我第一次尝试失败后,我提出了这个想法,我的 PHP 脚本将启动第一个 Python 脚本(我们称之为 testcmd.py
)。然后,他们的 Python 脚本将启动和独立的进程(我们称之为 thecommand.py
),它没有绑定(bind)到它(就像分离线程那样)并终止。这将避免挂起 PHP 脚本同时完成我想要的
不幸的是,我还没有找到一种从 testcmd.py
独立启动 thecommand.py
的方法
我尝试了很多东西,但这是我当前的代码。如果您对如何做有更好的想法,我很乐意走那条路。
run_command.php
$cmd = "./testcmd.py";
$output = [];
exec("$cmd 2>&1", $output, $return_status);
print_r($output);
echo $return_status;
testcmd.py
#!/usr/bin/env python
import subprocess
import sys
# some code here
print "Launching Command"
#proc = Popen([cmd_str], shell=True,
# stdin=None, stdout=None, stderr=None, close_fds=True)
pid = subprocess.Popen([sys.executable, "/path/to/file/no/spaces/in/path/thecommand.py"], stdin=None, stdout=None, stderr=None, close_fds=True) # call subprocess
command.py
#!/usr/bin/env python
import json
import urllib2
url = 'http://some/api/url/here/2'
data = urllib2.urlopen(url).read()
js = json.JSONDecoder().decode(data)
for user in js:
print js
最佳答案
通常用于执行此类任务的方法是让后台运行的“工作”线程定期检查“工作队列”。他们的工作人员然后根据需要处理事情(并且不需要启动子线程,因为它不受 Web 服务器的执行时间限制)。
所以尝试从那开始。您的队列可以在您的数据库中,您的后台作业可以是每分钟(或 5 分钟等)检查一次的 cronjob。
这也意味着您不需要启动 Python 脚本,但可以使用另一个 PHP 脚本(如果它更适合您的业务逻辑)。
关于php - 从 PHP 启动独立的 Python 进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26293463/