代码之家  ›  专栏  ›  技术社区  ›  Matthew J Morrison

禁止从Ruby运行cgi-php的php头文件

  •  0
  • Matthew J Morrison  · 技术社区  · 14 年前

    诚然,这对我来说是个奇怪的问题,但我正在做的是:

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

    这与 another problem that I had 从命令行运行cgi-php。

    下面是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 />"
    

    真正奇怪的是,当我从命令行运行Ruby脚本与从CGI运行Ruby脚本时,这里的PHP代码的行为似乎有所不同。这对我来说真的没有意义,因为不管怎样,我都在用相同的参数从命令中执行相同的PHP字符串。

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

    内容类型:文本/HTML

    启动PHP输出
    你好世界尽头 PHP输出

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

    启动PHP输出
    X-POWER: php/5.2.13内容类型:文本/html
    puts“内容类型:文本/html\n\n” 输入“start php output
    “放 echo 'hello world' | php5 -q 放 “结束PHP输出”
    “结束PHP 产量

    在我看来,发生的事情是php字符串没有抑制头,就像我希望-q选项所做的那样…同时也把我的整个Ruby脚本放回了浏览器——这让我很困惑。

    有什么想法吗?

    事先谢谢!

    1 回复  |  直到 14 年前
        1
  •  1
  •   Wrikken    14 年前

    据我所知,PHP接管了整个请求,并使用请求的同一个文件重新运行它,然后在调用点将控制权返回给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 />"