2014-01-22 102 views
2

我在PHP中使用exec()命令来运行一个会产生一些输出的python脚本。这个python脚本查询一个相当大的PostgreSQL数据库,所以它需要一两秒才能执行。这里是我的代码:让PHP等待python脚本完成

test.php的

<?php 
$output = exec('/usr/local/bin/python2.7 test.py', $output); 
var_dump($output); 
?> 

test.py

import nfldb 


db = nfldb.connect() 
q = nfldb.Query(db) 

q.game(season_year=2012, season_type='Regular') 
for pp in q.sort('passing_yds').limit(10).as_aggregate(): 
    print pp.player, pp.passing_yds 

所有的代码工作正常通过运行在命令行的python脚本,并把测试验证在python脚本中“打印10”以确保php脚本正常工作。

我很确定,因为PHP需要几秒钟的时间才能执行PHP没有正确等待输出的脚本。我尝试了set_time_limit()函数,但它实际上并没有从exec()计算时间。

有什么建议吗?

+0

尝试$ output = passthru('/ usr/local/bin/python2.7 test.py'); ? – hanshenrik

+0

是的,passthru也不起作用。 – dmarzio

+0

lemme guess,你用用户X测试python脚本,PHP用用户Y运行python脚本(用户www-data可能?) ..最好猜测,python脚本有一个(access?)问题PHP用户.. idk虽然,它只是一个猜测 – hanshenrik

回答

0

使用popenr模式:

<?php 
    $handle = popen('/usr/local/bin/python2.7 test.py', 'r'); 
    $output = fread($handle, 1024); 
    var_dump($output); 
    pclose($handle); 
?> 
+0

这也行不通。 php脚本几乎立即输出,所以我知道它没有完全执行该脚本。 – dmarzio

+0

@ user1874544,如果指定'test.py'的绝对路径会发生什么? – falsetru

+0

这不是问题,因为我知道脚本已经在工作。我把“打印10”放在python脚本中,PHP脚本输出10,所以我知道它不是权限或文件位置问题。 – dmarzio

0

你分配的exec()到$输出,这将覆盖该程序的数字返回值实际输出的返回值。不要这样做。