从PHP启动独立的Python进程

时间:2014-10-10 06:48:11

标签: php python linux apache yii

我有一项任务要求我使用大量数据同步,由于脚本执行时间短,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

1 个答案:

答案 0 :(得分:1)

通常,用于执行此类任务的方法是拥有背景" worker"线程运行,定期检查"工作队列"。然后,工作人员根据需要处理事情(并且不需要启动子线程,因为它不受Web服务器执行时间的限制)。

所以尝试从那开始。您的队列可以在您的数据库中,您的后台作业可以是每分钟(或5等)检查的cronjob。

这也意味着您不需要 来启动Python脚本,但如果能够更好地运用您的业务逻辑,则可以使用其他PHP脚本。