让PHP等待Python脚本完成

4

我将在PHP中使用exec()命令运行一个Python脚本并生成一些输出。这个Python脚本查询一个相当大的PostgreSQL数据库,因此执行需要一两秒钟的时间。下面是我的代码:

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脚本中添加测试语句"print 10"来验证php脚本是否正常工作。

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

有什么建议吗?


尝试运行 $output=passthru('/usr/local/bin/python2.7 test.py'); ? - hanshenrik
是的,passthru也不起作用。 - dmarzio
让我猜猜,你用用户X测试Python脚本,而PHP使用用户Y(也许是用户www-data)运行Python脚本。 最好的猜测是,Python脚本在PHP用户下运行时存在访问问题。 不过我不确定,这只是一个猜测。 - hanshenrik
如果我在Python脚本中包含类似"print 10"的内容,PHP脚本将会获取到这个10,但不会获取其他任何内容。当我从命令行运行该脚本时,它肯定会先输出10,然后在大约2秒后输出其他输出。这就是为什么我认为这只是因为PHP没有等待足够长的时间。 - dmarzio
嗯...你能试试这个脚本吗?import time \n print "test";\ntime.sleep(60*10);\nprint "test done"; #我想知道在Python中是否有一种强制刷新标准输出的方法 - hanshenrik
好的,它确实等待那个脚本完成了。(我不得不将其更改为sleep(10)来进行验证哈哈)。那么是什么原因解释了它为什么不等待数据库查询完成呢? - dmarzio
2个回答

0
你正在将exec()的返回值分配给$output,这会用程序的数字返回值覆盖实际输出。不要这样做。

0

使用popenr模式。

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

那也不起作用。PHP脚本输出几乎瞬间完成,所以我知道它没有完全执行该脚本。 - dmarzio
@user1874544,如果您指定test.py的绝对路径会发生什么? - falsetru
这不是问题,因为我知道脚本已经在工作。我在Python脚本中放置了“print 10”,而PHP脚本确实输出了10,所以我知道这不是权限或文件位置的问题。 - dmarzio
@user1874544,尝试使用popen('/usr/local/bin/python2.7 test.py 2>&1', 'r')(以捕获stderr)。 - falsetru

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接