2014-10-10 52 views
1

我有一项任务要求我使用海量数据同步,PHP由于脚本的执行时间很短而无法处理。我的选择是启动一个Python脚本并让PHP终止(给用户提供“成功完成”等信息)。我尝试了所有的选项,我可以在这里找到SO和其他地方,我通过谷歌发现,但没有任何作品。从PHP启动独立Python进程

在我第一次尝试失败后,我想出了这个想法,我的PHP脚本将启动第一个Python脚本(可以称之为testcmd.py)。然后他们将启动Python脚本并独立进程(我们称之为thecommand.py),它不受其束缚(像分离线程那样)并终止。这将避免在同一时间挂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 

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

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

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

这也意味着你不需要需要启动一个Python脚本,但可以使用另一个PHP脚本,如果这对您的业务逻辑更好。

+0

所以基本上你说cron一个工作,运行5分钟,然后检查数据库条目,一旦它完成标记不知何故? 5分钟后如何定期检查添加到服务器负载?我想只是想听到 – 2014-10-11 09:27:57

+0

这是正确的重新标记数据库中的条目。重新加载服务器,并不是那么多,就好像没有任何东西需要处理,那么这个过程就可以退出。我的建议和你的想法之间唯一的区别是定期发布时间。除此之外,您的流程执行将会出现大部分负载。无论如何,这都会发生。 – acorncom 2014-10-11 13:05:13

+0

酷感谢很多哥们 – 2014-10-12 20:58:22