由于错误gem_original_require无法从 php 运行 ruby 脚本



我正在尝试从需要一些 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 文档中阅读有关使用自动/外壳任务的更多信息。

相关内容

  • 没有找到相关文章

最新更新