如何在Linux上使用PHP脚本添加shebang #!?

32

我在RedHat linux上,尝试为我的php脚本添加shebang #!时遇到了一些问题。我已经尝试添加了一个带有shebang的小型测试代码(还尝试了不同的变体),但每次尝试运行该脚本时都会得到以下错误消息。

错误消息:

-bash: script.php: command not found

测试脚本:

#!/bin/env php    
<?php echo "test"; ?>

Shebang #! 的变化:

#!/usr/bin/php
#!/usr/bin/env php

1
很明显 - 这就是他在问的原因 :) - Banago
@JoelFan,PHP文档似乎与您的观点不一致:http://www.php.net/manual/en/features.commandline.usage.php#example-375 - Digital Chris
1
@JoelFan - 人们有权利在博客上表达他们的愚蠢想法,但请不要在我们帮助其他开发者的网站上这样做。谢谢。回答关于错误的问题 - 这很可能是因为你的第一行之后有CR\LF组合引起的。使用十六进制编辑器检查是否有\n\r,如果有,请删除回车符。还要将yourfile.php设置为可执行文件,使用CHMOD +x命令。 - N.B.
离题,应该移到 Shell 使用。 - user3694243
5个回答

51

大多数系统应该是 #!/usr/bin/env php,但你的错误与此无关。

-bash: script.php: command not found
它说找不到 script.php
如果问题是 shebang 行,则错误会显示类似以下内容:
bash: script.php: /usr/env: bad interpreter: No such file or directory

假设您正在输入script.php,但该文件不在您的$PATH目录下或者没有可执行权限。

  1. 将其设置为可执行文件:chmod +x script.php
  2. 如果它在当前目录中,则需输入完整路径而非仅文件名:./script.php

除第二种方法外,您还可以将文件移动、复制或建立符号链接到$PATH列表中的某个目录下,或修改$PATH以包含脚本所在的目录。


1
请确保脚本中使用的是Unix换行符,而不是DOS。DOS换行符会导致类似的错误。 - Nigel Atkinson

18

如果你的脚本没有位于 /usr/local/bin 且可执行,你必须在调用脚本前加上 php 前缀,像这样:

php myscrip.php

对于 shebangs,以下是我使用的方式:
像这样:
#!/usr/bin/php

or this:

#!/usr/bin/env php

3
“#!/usr/bin/env php” 很受欢迎,因为它可以让系统知道可执行文件的安装位置。 - robrecord

5
回复@NVRM有关只使用一次-d的评论,这是不正确的。
chmod +x script开始。
#!/usr/bin/php
<?php
phpinfo();

运行script | grep -E 'memory_limit|error_reporting',您将看到结果

error_reporting => no value => no value
memory_limit => 128M => 128M

现在添加一些-d条目,这样你就有了。
#!/usr/bin/php -d memory_limit=2G -d error_reporting=-1
<?php
phpinfo();

重新运行script | grep -E 'memory_limit|error_reporting',你会看到

error_reporting => -1 => -1
memory_limit => 2G => 2G

因此,演示你可以设置多个选项。

事实上,您在这里使用的是整个命令行。 所以您可以加载扩展、使用不同的配置等,在命令行中所能做的一切都可以做到。


0

在Linux中查找可调用的PHP shebang,不要死记硬背,学会如何使用它。


which php

输出


zeus@pop-os:~$ which php
/usr/bin/php



那么 shebang 必须是

#!/usr/bin/php  

0

在这里留下一些小笔记:


使用位于同一文件夹中的php二进制文件。

例如,从/usr/bin复制的php7.2可执行文件与hello脚本位于相同的路径中。

#!./php7.2
<?php

echo "Hello!"; 

运行它:

./hello

它们的行为完全相同:

./php7.2 hello

这样做可以实现可移植性,但要注意系统架构,PHP二进制文件可能与目标平台不匹配。


从哈希行设置允许的内存:

我们可以从哈希行设置一个INI条目

#!/usr/bin/php -d memory_limit=2048M
<?php
phpinfo();
exit;

然后为了查看PHP是否已经理解,可以使用phpinfo()函数:

./myphpProg | grep memory

正确的 shell 输出应包含:

memory_limit => 2048M => 2048M

以上操作类似于以下命令行:

php -d memory_limit=2048M myphpProg.**php**

这就是为什么我们只能在哈希标记中设置一个ini值,因为php一次只能接受一个-d参数。


2
多种选择可行。请查看我的答案 https://dev59.com/vmEi5IYBdhLWcg3wCoMp#59552213 - Richard A Quadling

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接