我有一个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调用完成。
有什么想法吗?
答案 0 :(得分:0)
我不确定这一点,但鉴于你的解释,听起来似乎有道理,你是否看过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
。你明白我的想法。