2009-09-08 69 views
0

调用Ruby脚本时发生意外的行为我有一个用于执行一些API调用/屏幕抓取的Ruby脚本,但我们的主要应用程序是在PHP中。我们的PHP应用程序使用shell_exec()来调用Ruby脚本。通过PHP的shell_exec()

ruby​​脚本在命令行中调用时效果很好,但在通过PHP的shell exec调用时,它会随机退出。

下面是Ruby脚本的例子:

#!/usr/bin/env ruby 
require 'rubygems' 
require 'mysql' 
require 'net/http' 
require 'open-uri' 
require 'uri' 
require 'cgi' 
require 'fileutils' 

# Bunch of code here ... works fine 
somePath = 'http://foo.com/bar.php' 
# Seems to always exit when I do a Net::HTTP or open-uri call 
post = Net::HTTP.post_form(URI.parse(somePath),{'id'=>ID,'q'=>'some query'}) 
data = post.body 
# OR 
data = open(somePath).read 
# More code here ... 

所以,我只能到目前为止推断的是,它总是在离开时,我试图抓住/读通过网/ HTTP或开URI外部URL调用。我抓住的页面可以接受POST或GET请求,但它似乎退出了任何一种方式。

我在shell_exec调用后用PHP输出结果,但没有错误消息或退出。我的确有消息通过我的Ruby脚本在这里和那里用“puts ....”输出。这可能是一个问题(我想'不',因为它不会退出以前的投入消息)?

同样,从shell中调用它时它工作正常。这几乎就像shell_exec调用不会等待net/http调用完成。

任何想法?

回答

0

只是一个参考,我从来没有真正发现这是为什么发生。我可以推断出的最好的情况是某种类型的权限问题阻止了Ruby的open-uri命令正常工作。

我选择在db表中排队这些作业,并定期通过cron运行我的ruby脚本。当ruby脚本以root/sudo perms运行时,一切似乎都正常工作。

0

我不知道这一点,但鉴于你的解释,这听起来似是而非,让你看着都在proc_open:

http://us3.php.net/proc_open

+0

proc_open与shell_exec有什么不同? – Callmeed

0

Ruby的open-uri需要tempfile,所以我猜有一个运行ruby脚本和运行它的Web服务器之间的文件所有权冲突。 Web服务器可以使用tempfile创建临时文件吗?

+0

我会如何测试?只要看看我是否可以在Ruby中使用shell_exec()tempfile命令? – Callmeed

+0

好的,我测试了一个ruby脚本,创建一个临时文件,睡了60秒,然后关闭。 我用PHP的shell_exec()运行它,它工作正常。该文件在运行时显示在/ tmp中。 这似乎不是问题,但我很欣赏这个想法。谢谢。 – Callmeed