【问题标题】:Running CLI php script with execute bit使用执行位运行 CLI php 脚本
【发布时间】:2011-10-18 04:48:38
【问题描述】:

这有点困扰我。

我知道你可以做到

php foo.php

php -f foo.php

有没有办法只启动一个设置了执行位的脚本

./foo.php

鉴于以下情况:

#!/usr/bin/php

<?php 
exit('hello');

我得到“无法打开输入文件”或“错误的解释器:没有这样的文件或目录”,具体取决于“bin/php”后是否有空格。

【问题讨论】:

  • 你在/usr/bin/php中有php吗?
  • @Subdigger 是的。这对你有用吗?我不确定我是否试图强迫它做一些不该做的事情。

标签: php linux command-line


【解决方案1】:
  1. 检查“#!”之前是否没有任何内容,例如 UTF-8 BOM
  2. 检查行尾是否没有任何内容,例如最后的 LF (\n) 之前的 CR (\r)。如果您在 Windows 中使用 Windows 行结尾 (CR LF) 编写文件,则 CR 会出现在那里,并且可能会被解释为解释器路径的一部分。

【讨论】:

    【解决方案2】:

    来自php(1) 联机帮助页:

    提示

    您可以使用 shebang 行自动调用 php 脚本。只有 CLI 版本的 PHP 会忽略这样的第一行 如下图:

    #!/bin/php
    <?php
    // your script
    ?>
    

    所以,shebang 方法确实有效。如果我在 Vim 中将行结尾设置为“unix”以外的其他内容,我会得到“:没有这样的文件或目录”。您是否在脚本中使用 DOS 行尾?

    【讨论】:

      【解决方案3】:

      使用#!/usr/bin/env php 代替#!/usr/bin/php 是更好的解决方案。这将在 PATH 环境变量中查找 PHP 二进制文件。这是更多更健壮和跨平台的。例如 BSD 在/usr/local/bin/php 中安装 PHP。

      此外,您需要确保这是 第一 行,并且脚本已设置可执行位,以便为每个人设置它(通常可以)使用:chmod a+x script.php

      还要确保您已启用 CLI SAPI。运行php -v top verify,它应该显示如下:

      [~]% php -v
      PHP 5.3.3 (cli) (built: Jul 22 2010 16:21:30)
      Copyright (c) 1997-2010 The PHP Group
      Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
      

      【讨论】:

        【解决方案4】:

        您提供的示例代码似乎没问题,对我有用(我添加了结束 ?&gt;

        如果您可以使用/usr/bin/php foo.php 运行该文件,就会发生一些奇怪的事情。只是一个疯狂的猜测,但也许您的文本编辑器在文件的开头留下了 BOM(字节顺序标记),因此 #! 不是该文件中的前两个字节。 (你可以通过hexdump -C foo.php | head找到)

        【讨论】:

          猜你喜欢
          • 2012-11-20
          • 1970-01-01
          • 2010-12-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-07-25
          • 2021-10-15
          • 2014-12-07
          相关资源
          最近更新 更多