这个问题一直困扰着我。
我知道你能做到
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。
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
- 检查"#!"之前是否没有任何内容。',如UTF-8 BOM
- 检查行尾是否没有任何内容,例如最后一个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行结尾?