禁止从Ruby运行cgi PHP的PHP头文件

时间:2010-06-04 12:57:13

标签: php ruby command-line cgi

不可否认,这对我来说是一个奇怪的问题,但这就是我正在做的事情:

我有一个Ruby脚本,它正在执行一串PHP代码并捕获输出。

这与从命令行运行cgi PHP的another problem that I had有些关联。

以下是Ruby脚本的来源:

#!/usr/bin/ruby
puts "Content-type: text/html\n\n"
puts "Start PHP Output<br />"
puts `echo '<?php echo "hello world"; ?>' | php5 -q`
puts "End PHP Output<br />"

我无法弄清楚的奇怪的事情是,当我从命令行和CGI运行Ruby脚本时,这里的PHP代码似乎表现不同。这对我来说真的没有意义,因为无论哪种方式,我都从具有相同参数的命令执行相同的PHP字符串。

当我从命令行运行上面的Ruby脚本时,我得到了我期望的输出:

  

内容类型:text / html

     

启动PHP输出
hello world End   PHP输出

当我通过CGI从浏览器点击相同的Ruby脚本时,我得到了这个输出:

  

启动PHP输出
X-Powered-By:   PHP / 5.2.13内容类型:text / html
  put“Content-type:text / html \ n \ n”   把“启动PHP输出”放入   echo 'hello world' | php5 -q提出   “结束PHP输出
”结束PHP   输出

对我来说,看起来正如所发生的那样,PHP的字符串并没有抑制标题,就像我期望-q选项那样......并且还将我的整个Ruby脚本转储回浏览器 - 这令我感到困惑。

有什么想法吗?

提前致谢!

1 个答案:

答案 0 :(得分:1)

据我所知,PHP接管整个请求&amp;使用所请求的相同文件重新运行它,之后它在调用点将控制权返回给ruby。如果可能的话,请使用CLI而不是CGI。

您可以尝试清除cgi在Web服务器请求中确定的环境变量。

#!/usr/bin/ruby
puts "Content-type: text/plain\n\n"
puts "Start PHP Output<br />"
f = IO.popen("env -i php5-cgi -q","r+")
f.write("<?php var_dump(time());?>");
f.close_write()
f.each {|line| puts line}
f.close()
puts "End PHP Output<br />"