通过PHP的shell_exec()调用Ruby脚本时出现意外行为

时间:2009-09-08 00:20:56

标签: php ruby shell

我有一个Ruby脚本,用于执行一些API调用/屏幕抓取,但我们的主要应用程序是PHP。我们的PHP应用程序使用shell_exec()来调用Ruby脚本。

从命令行调用时,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 ... 

所以,到目前为止我所能推断的是,当我尝试通过net / http或open-uri调用来获取/读取外部URL时,它总是存在。我抓住的页面可以接受POST或GET请求,但它似乎正在退出。

我在shell_exec调用后使用PHP输出结果,但没有错误消息或退出。我确实有我的Ruby脚本输出的消息,其中包含“puts ....”。这可能是一个问题(我在想'不'因为它没有退出早期的放置消息)?

再一次,它从shell调用时工作正常。这几乎就像shell_exec调用没有等待net / http调用完成。

有什么想法吗?

4 个答案:

答案 0 :(得分:0)

我不确定这一点,但鉴于你的解释,听起来似乎有道理,你是否看过proc_open:

http://us3.php.net/proc_open

答案 1 :(得分:0)

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

答案 2 :(得分:0)

仅仅是一个FYI,我从未真正发现过为什么会这样。我可以推断的最好的是某种类型的权限问题阻止了Ruby的open-uri命令正常工作。

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

答案 3 :(得分:0)

在Linux终端上运行: sudo -H -u <user> bash -c <your code>,其中<user>是Apache的用户。

要找到Apache的用户,您可以在代码中echo("shell_exec(\"whoami\")");并在浏览器中运行它。 whoami在Linux和Windows上均可使用,但是如果您使用Windows,则Apache默认用户为您的用户。无论如何,您都可以对其进行测试,但是我无法告诉您如何在Windows上运行代码,就像Apache在运行它一样。

之后,您可以了解正在发生的事情。在大多数情况下,问题在于Apache的根文件夹与操作系统的文件夹不同。因此,当您使用绝对路径运行命令时,操作系统在Linux上考虑/,而Apache在Xampp(Linux)上考虑/var/www/html,在Xampp(Windows)上考虑/opt/lampp/htdocs 。你明白我的想法。