Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我怎样才能避免显示“我”/usr/bin/php“;关于PHP?_Php_Apache_Shell_Nginx_Command Line Interface - Fatal编程技术网

我怎样才能避免显示“我”/usr/bin/php“;关于PHP?

我怎样才能避免显示“我”/usr/bin/php“;关于PHP?,php,apache,shell,nginx,command-line-interface,Php,Apache,Shell,Nginx,Command Line Interface,我希望PHP脚本可以在命令行和网站上运行(我使用Apache和Nginx),所以我把#/usr/bin/php在我的脚本的第一行,但出现在网站上…使用php命令调用脚本无需使用#/usr/bin/php在代码中,只需使用php运行CLI脚本,例如php/path/to/file.php或/usr/bin/php/path/to/file.php我通常认为将逻辑与表示分离是个好主意。当我做类似的事情时,我会尽可能多地放在库中,然后为它编写单独的cli和web接口 也就是说,用php命令调用它可能更

我希望PHP脚本可以在命令行和网站上运行(我使用Apache和Nginx),所以我把#/usr/bin/php在我的脚本的第一行,但出现在网站上…

使用
php
命令调用脚本

无需使用
#/usr/bin/php
在代码中,只需使用
php
运行CLI脚本,例如
php/path/to/file.php
/usr/bin/php/path/to/file.php

我通常认为将逻辑与表示分离是个好主意。当我做类似的事情时,我会尽可能多地放在库中,然后为它编写单独的cli和web接口


也就是说,用php命令调用它可能更容易解决。

我使用输出缓冲解决了这个问题。 我的脚本现在如下所示:

#/usr/bin/php
在文件末尾。在编写PHP脚本时,这实际上是一个很好的实践。这可以防止意外打印任何垃圾文本

注意:的PHP文档说明:

输出缓冲区必须由ob_start()以 PHP_输出_处理程序_可清除和PHP_输出_处理程序_可移除标志。 否则ob_end_clean()将无法工作


这似乎是在PHP从命令行运行时自动完成的。

上面的输出缓冲解决方案是一个黑客攻击。不要那样做

首先,实际上最好使用env命令来确定正在使用的php:

#!/usr/bin/env php
然后授予其自身执行的权限:

chmod +x myfile
因此,您现在只需运行以下命令,而不是调用“php myfile”:

./myfile
从那个文件夹。希望这有帮助

@ViliamSimko的就快到了,但不幸的是,它有缺陷。(例如,它确实打破了我的头发送序列,尽管没有用shebang污染输出。)

TL;博士,这是修复方法*:

#!/usr/bin/php
<?php @ob_end_clean(); if(ini_get('output_buffering')) ob_start();
...

仍然只有“几乎”正确,因为在web模式下没有任何东西可以修复
output\u buffering=0
,并且只有在调用脚本添加显式的
ob\u start
-
ob\u end…
包装时,才能解决“包含但没有缓冲”的情况。此外,上面的大多数警告仍然适用:各种细微之处仍然会破坏它(例如,当前输出缓冲区必须具有(幸运的是默认)
PHP\u output\u HANDLER\u CLEANABLE
标志等)

如果您已经使用apache为PHP服务,只需将nginx配置为apache的反向代理即可。+1用于逻辑分离。通常,CLI和web需要单独的接口(例如,与
$argv
交互,而不是与
$\u GET
交互)。因此,实际上不需要从这两者调用同一个文件。是否需要
ob_start()也是吗?可能值得一提。这很漂亮。好主意,但@Floris在这里有一个关键点。请参阅my,我在那里解决了这个问题。但是如果您想创建一个可以从shell运行的可执行脚本,您需要解决这个问题。确实可以使用
php
命令运行脚本。但是,如果你想制作一个可执行脚本(
chmod+xyourscript.php
),你需要在脚本的第一行添加hashbang(#!)。我假设否决票是因为你所描述的(使文件可执行,并使用shebang行)是提问者已经在做的事情。除此之外,他有时还通过Web服务器调用同一个文件。因此,在浏览器中,shebang行打印。他要求解决这个问题。输出缓冲黑客似乎是唯一的方法。是的,他不应该这么做。最好让可执行CLI脚本包含在另一个具有实际逻辑的文件中,并让他的网页PHP执行相同的操作,这样它们就共享相同的代码,而且shebang不会显示使用该建议更新您的答案,这可能是解决问题的一种方法(并不是说似乎有人会检查人们是否修正了他们所选的答案……叹气)
#!/usr/bin/php
<?php if (ob_get_level()) { ob_end_clean(); ob_start(); }
...
#!/usr/bin/php
<?php
if (ob_get_level()) {
    $buf = ob_get_clean();
    ob_start();
    // Refill the buffer, but without the shebang line:
    echo substr($buf, 0, strpos($buf, file(__FILE__)[0]));
} // else { out of luck... }