PHP命令行脚本没有输出任何内容。

27

我有一个 PHP 脚本,我使用以下命令来执行:

php -f my_script.php myArguments

这个脚本使用svn进行版本控制。我刚刚更新了它,将要运行的命令粘贴到终端中并执行。但是,没有任何输出。没有错误信息,没有任何打印内容,什么都没有。它看起来像从未开始一样。就像下面这样:

me:/srv/scripts# php -f my_script.php myArguments
me:/srv/scripts#
其他脚本可以正常运行。对于我来说,很难提供一个SSCCE,因为我实际上无法分享导致这种情况的代码,并且我没有能够有意地复制这种行为。然而,我已经看到了两次。如果我保存更改,还原文件,然后将它们粘贴回去,它就有很大的机会可以正常运行。
但是,我担心不知道是什么原因导致了这种奇怪的行为。是否有空格字符或其他内容告诉PHP不要启动或输出任何东西?
在看到这种行为之后,我尝试了以下方法:
- 修改脚本,使其简单地成为“echo 'hello'” - 在脚本开头放入无意义的内容,使其无法解析 - 粘贴来自工作脚本的代码 - 愤怒地撞在墙上 - 在另一个终端/putty ssh连接中尝试它
有趣的是:它实际上在另一个终端中工作。它按预期执行所有操作。
那么,是否有人有任何想法可能是什么原因导致这种情况,或者我应该尝试哪些方法以确定问题?

在沮丧中撞墙,您是否有足够的SSH访问权限来执行PHP命令? - iam-decoder
文件是否存在语法错误并直接终止执行?- 尝试通过发出php -l < my_script.php命令进行检查。 - MrTux
权限问题?你可以对文件执行 chmod +x 命令以防万一。 - DaGhostman Dimitrov
3
使用命令“php -d display_errors=1 -f my_script.php myArguments”,可以在运行名为“my_script.php”的PHP脚本时,打开错误输出并传递参数“myArguments”。 - Mike B
@MikeB 问题在于.ini文件中的display_errors被关闭了。我们看不到输出的脚本可能只是有语法错误。如果你想把它作为答案发布,我会接受它。 - MirroredFate
显示剩余9条评论
4个回答

30

display_errors 在运行时可能会被禁用。你可以使用-d 开关手动打开它:

php -d display_errors=1 -f my_script.php myArguments

1
这对我帮助很大。我有一个旧的php.ini文件,其中allow_call_time_pass_reference设置为On,但由于它不再可用,每个cli运行的脚本都没有输出。使用-d display_errors=1抛出了:PHP Fatal error: Directive 'allow_call_time_pass_reference' is no longer available in PHP in Unknown on line 0,帮助我通过从php.ini中删除该行来修复错误。谢谢您。 - Lorenzo Marcon
您可能还需要使用-d error_reporting=E_ALL - mwfearnley

22

我遇到了同样的问题,不管是强行让PHP display_errors 或用-l检查语法都无济于事。

最终,我解决了我们的问题,或许你能从这个解决方案中得到一些帮助。

在不使用php.ini的情况下测试你的代码:

php -n test_script.php

这将有助于你找出真正的原因 - PHP配置、其他人的代码,还是你自己的代码。

在我这个问题的情况下,是由于其他人添加了一个函数,该函数通过php.ini中的auto_prepend_file指令被调用。 (更具体地说,是在我不断加入调试代码并进行逐步排查时,发现几个文件和函数之后)。顺便说一句,当你尝试调试此类问题时,可能会发现使用fwrite(STDOUT, "debug text\n");非常有用。

某人添加了一个函数,该函数在调用特定函数时使用了@符号来抑制错误。(如果你的测试脚本中包含任何导入其他代码的包含文件,你可能会遇到类似但与php.ini无关的问题)。

该函数失败导致PHP悄然死亡,与我的测试脚本无关。

你会发现有各种警告,关于如何使用@符号会导致我遇到的问题,或许你也有类似的问题:http://php.net/manual/en/language.operators.errorcontrol.php

类似症状的复现:

在完全功能正常的PHP环境下,在你的脚本顶部添加以下内容会导致CLI输出错误:@xxx_not_a_real_function_name_xxx();

所以你可能只是遇到了php.ini的问题,或者你(或其他人)可能已经使用了@而没有意识到它在调试中造成的严重(令人沮丧和耗时)后果。


1
我无法形容这有多么有帮助。我已经使用PHP工作了18年,但我不知道php -n,并且它指引了我正确的方向。对我来说,它是在一个我故意使用的prepend文件中,但我们在那里进行了SSL检查,如果没有就转发到SSL。在PHP7中这很好用,但在PHP8中似乎会尝试重定向CLI。奇怪的是没有错误。非常感谢你。 - Andy Borgmann
我认为在许多情况下,-n 只能工作是因为 php.ini 限制了显示的错误数量。因此,更好的方法是使用 -d error_reporting=E_ALL。请注意,在 https://www.php.net/manual/en/errorfunc.constants.php 上有完整的错误类型列表。我的特定错误被 E_COMPILE_ERROR 捕获。 - mwfearnley

1

我最近也遇到了这个问题,原因是我没有在我的测试文件中使用<?php?>标签。


0

我曾经遇到过 PHP CLI 因为内存限制问题而默默地无法运行良好的脚本。请尝试以下方法:

php -d memory_limit=512M script.php

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