【问题标题】:Different PHP results with -r option使用 -r 选项的不同 PHP 结果
【发布时间】:2009-11-18 20:35:34
【问题描述】:

当我在命令行上使用 php -r <code> 以及使用 php <file>php -f <file> 执行文件或在 Apache 中运行代码时,PHP 似乎给出了不同的哈希值。

例如,在命令行中使用-r 的SHA1 用法:

$ php -r "print sha1('$1S*90');"
77cd8b48ceca53e018f80536b0a44c5b6710425f

当我尝试对下面的文件 testSHA.php 进行相同操作时:

<?php
print sha1('$1S*90');
?>

并使用mod_php5在命令行或Apache内部运行它:

$ php testSHA.php
201cb5aaa7d4db1a49d9be1f2c06d45e4c2a69f2

但奇怪的是,当我尝试使用不同的输入字符串(例如“123456789”)时,使用这两种方法的哈希值确实匹配。

我不认为我在这两种方法中使用了不同的编码或字符集。我还尝试使用 MD5,但在命令行中仍然可以使用 -r 和 '-f' 获得不同的哈希值。

有人能指出为什么使用上述两种方法的哈希值会不同吗?有没有办法在命令行上运行 PHP,我可以在不将其输入文件的情况下键入代码,并查看输出,就好像它在文件/Apache 中运行一样?未设置单步调试代码时,我使用命令行进行快速 sn-p 测试。

谢谢。

PS:我在 OpenSUSE 11.1 上使用 PHP 5.2.11 和 Suhosin-Patch 0.9.7 (cli)。

【问题讨论】:

    标签: php sha1


    【解决方案1】:

    当您在 bash shell 上运行 $ php -r "print sha1('$1S*90');" 时,bash 将 $1 解释为 shell 变量,除非您设置它,否则它可能为空。

    所以 PHP 只看到了这个:print sha1('S*90');

    结果是:77cd8b48ceca53e018f80536b0a44c5b6710425f,你第一次得到的值。 :)

    你可以这样转义:

    $ php -r "print sha1('\$1S*90');"
    

    【讨论】:

    • 谢谢,本。我错过了 Bash 可能正在解释它。我落入了我指出我的同事要寻找的同一个陷阱:) 当有几个字符要转义并且我们知道 shell 可能解释的字符时,转义会有所帮助。 Python 和 Ruby 可以像 Bash 一样在命令行上以解释器模式运行,从而避免了 shell 解释问题。你会碰巧知道 PHP 是否可以这样执行吗?它可能是 Yii 控制台工具 yiic 之类的东西,没有 Yii 依赖。
    • $ php -a 为您提供(有些受限的)交互模式
    • 是的,我过去尝试过$ php -a,但无法弄清楚如何显示执行结果。在你指出之后我做了一些搜索。看来我们需要使用&lt;?php 才能执行PHP 代码。选项-a 是一个可行的解决方案。我可以使用局部变量剪切、粘贴和运行多行 PHP 代码,而不用担心 shell 转义和将引号与 -r 选项配对。感谢分享。
    • 投反对票的人能否告诉我错误是什么?谢谢。
    【解决方案2】:

    您的字符串中的 $ 和或 * 将被解释,可能是因为 " 而不是 '

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-22
      • 2019-04-16
      • 1970-01-01
      • 2021-05-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多