我有一项任务要求我使用大量数据同步,由于脚本执行时间短,PHP无法处理。我有的选择是启动一个Python脚本并让PHP终止(使用" Successfully Done"这样的消息给用户)。我已经尝试了我在SO和其他地方找到的所有选项,我通过谷歌找到但没有效果。
在第一次尝试失败后,我想出了这个想法,我的PHP脚本将启动第一个Python脚本(让我们称之为testcmd.py
)。然后,Python脚本将启动并独立进程(让它称之为thecommand.py
)与它无关(类似于分离的线程)并终止。这样可以避免挂起PHP脚本同时完成我想要的内容
很遗憾,我还没有找到一种从thecommand.py
独立发布testcmd.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
thecommand.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
答案 0 :(得分:1)
通常,用于执行此类任务的方法是拥有背景" worker"线程运行,定期检查"工作队列"。然后,工作人员根据需要处理事情(并且不需要启动子线程,因为它不受Web服务器执行时间的限制)。
所以尝试从那开始。您的队列可以在您的数据库中,您的后台作业可以是每分钟(或5等)检查的cronjob。
这也意味着您不需要 来启动Python脚本,但如果能够更好地运用您的业务逻辑,则可以使用其他PHP脚本。