我正在尝试从需要一些 gem 的 php(浏览器)运行一个 ruby 脚本。VPS:CentOS,PHP5,ruby2.0.0,使用RVM。我通过 PUTTY 到达服务器,并从浏览器运行 php 代码。
所以当我运行这个时:
<?php
$descriptorspec = array(
0 => array("pipe", "r"),
1 => array("pipe", "w"),
2 => array("file", "./error-output.txt", "a")
);
$process = proc_open('ruby /home/balint/test.rb', $descriptorspec, $pipes);
if (is_resource($process)) {
fwrite($pipes[0], 'hello world');
fclose($pipes[0]);
echo stream_get_contents($pipes[1]);
fclose($pipes[1]);
$return_value = proc_close($process);
echo "command returned $return_valuen";
}
?>
test.rb 脚本只包括"xxx",然后我在屏幕上得到输出为 xxx。
但是,当我包含一些宝石(例如需要"nokogiri")时,我会在错误日志中得到以下信息:
/usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require': no such file to load -- nokogiri (LoadError)
from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
from /home/balint/test.rb:5
这直接从外壳工作正常。
红宝石 -v:
ruby 2.0.0p643 (2015-02-25 revision 49749) [x86_64-linux]
哪个红宝石:
/usr/bin/ruby
宝石环境:
RubyGems Environment:
- RUBYGEMS VERSION: 2.4.8
- RUBY VERSION: 2.0.0 (2015-02-25 patchlevel 643) [x86_64-linux]
- INSTALLATION DIRECTORY: /home/balint/.rvm/gems/ruby-2.0.0-p643
- RUBY EXECUTABLE: /home/balint/.rvm/rubies/ruby-2.0.0-p643/bin/ruby
- EXECUTABLE DIRECTORY: /home/balint/.rvm/gems/ruby-2.0.0-p643/bin
- SPEC CACHE DIRECTORY: /home/balint/.gem/specs
- SYSTEM CONFIGURATION DIRECTORY: /home/balint/.rvm/rubies/ruby-2.0.0-p643/etc
- RUBYGEMS PLATFORMS:
- ruby
- x86_64-linux
- GEM PATHS:
- /home/balint/.rvm/gems/ruby-2.0.0-p643
- /home/balint/.rvm/gems/ruby-2.0.0-p643@global
- GEM CONFIGURATION:
- :update_sources => true
- :verbose => true
- :backtrace => false
- :bulk_threshold => 1000
- :sources => ["https://rubygems.org/", "http://rubygems.org"]
- REMOTE SOURCES:
- https://rubygems.org/
- http://rubygems.org
- SHELL PATH:
- /usr/local/jdk/bin
- /home/balint/.rvm/gems/ruby-2.0.0-p643/bin
- /home/balint/.rvm/gems/ruby-2.0.0-p643@global/bin
- /home/balint/.rvm/rubies/ruby-2.0.0-p643/bin
- /home/balint/perl5/bin
- /usr/local/bin
- /bin
- /usr/bin
- /usr/local/sbin
- /usr/sbin
- /sbin
- /home/balint/.rvm/bin
- /usr/local/bin
- /usr/X11R6/bin
- /home/balint/.rvm/bin
- /home/balint/bin
回声$PATH
/usr/local/jdk/bin:/home/balint/.rvm/gems/ruby-2.0.0-p643/bin:/home/balint/.rvm/gems/ruby-2.0.0-p643@global/bin:/home/balint/.rvm/rubies/ruby-2.0.0-p643/bin:/home/balint/perl5/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/balint/.rvm/bin:/usr/local/bin:/usr/X11R6/bin:/home/balint/.rvm/bin:/home/balint/bin
根据日志,它在 1.8 文件夹中查找。但是除了 1.8 之外,usr/lib/ruby/site_ruby/
没有其他文件夹。而且我也不明白为什么它在 shell 中工作,为什么它不是来自浏览器。
有人能把我放在正确的方向上吗?
当PHP尝试运行脚本时,它很可能以非常低的权限和有限的env和PATH运行。它的路径与你的路径不同,你在外壳中看到。
检查 PHP 会话的运行方式。这很可能是服务器的环境。还要检查服务器是否知道RVM,并可以看到正确的gem env
。这可以解释为什么服务器看到/usr/lib/ruby/site_ruby/1.8/
而你看到RVM托管的Ruby。
此外,除非服务器的路径能够找到正确的 Ruby,否则使用
ruby /home/balint/test.rb
它将启动在 PATH 中找到的第一个 Ruby,它可能是/usr/bin/ruby。相反,始终强制路径到您想要的 Ruby。对于内置的Ruby,这将是:
/usr/bin/ruby /home/balint/test.rb
将 RVM 放入混合中会使事情变得有点复杂,但 RVM 提供了一个填充程序,它将尊重您指定的 Ruby --default
或带有宝石组的 Ruby。在 RVM cron 文档中阅读有关使用自动/外壳任务的更多信息。