运行带有执行位的CLI php脚本


Running CLI php script with execute bit

这个问题一直困扰着我。

我知道你能做到

php foo.php

php -f foo.php

是否没有办法直接启动一个脚本与执行位设置

./foo.php

#!/usr/bin/php
<?php 
exit('hello');

我得到"无法打开输入文件"或"坏解释器:没有这样的文件或目录"取决于"bin/php"后是否有空格。

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

此外,您需要确保这是第一行,并且脚本设置了可执行位,为每个人设置它(通常OK)使用: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
  1. 检查"#!"之前是否没有任何内容。',如UTF-8 BOM
  2. 检查行尾是否没有任何内容,例如最后一个LF ('n)之前的CR ('r)。如果您在Windows中使用Windows行结尾(CR LF)编写文件,则CR会出现在那里,并且可能被解释为解释器路径的一部分。

您给出的示例代码似乎很好,适用于我(我添加了关闭?>虽然)

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

php(1)手册:

提示

您可以使用shebang行从脚本。只有CLI版本的PHP才会忽略第一行所示:

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

所以,shebang方法确实有效。如果我在Vim中将行结尾设置为"unix"以外的内容,我会得到":No such file or directory"。您是否在脚本中使用DOS行结尾?