【问题标题】:PHP cli script does not output anythingPHP cli脚本不输出任何东西
【发布时间】:2014-10-09 10:29:30
【问题描述】:

所以我有一个使用以下命令执行的 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 连接中尝试。

有趣的地方在于:它实际上在不同的终端中工作。它按预期做所有事情。

那么有没有人知道可能是什么导致了这种情况,或者我应该尝试什么来确定问题?

编辑:

“不同的终端”还是终端应用,只是一个新的。

我有足够的权限来执行该文件,但即使我没有,它也会吐出一条消息说我没有。

我故意引入语法错误,希望能让 PHP 吐出解析错误。还是没有输出。

【问题讨论】:

  • Banging my head on a wall in frustration 你是否有足够的 SSH 访问权限来执行 php 命令?
  • 文件是否存在语法错误并终止? - 尝试发出php -l < my_script.php
  • 权限问题?你可以在文件上做一个chmod +x以防万一
  • 当您说它在不同的终端中工作时,您是指不同的终端应用程序还是在同一终端的另一个实例中?
  • php -d display_errors=1 -f my_script.php myArguments

标签: php output command-line-interface


【解决方案1】:

display_errors 可能在运行前被禁用。您可以使用-d switch 手动打开它:

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

【讨论】:

  • 这对我帮助很大。我有一个旧的 php.ini,其中 allow_call_time_pass_reference 设置为 On,但由于它不再可用,cli 运行的每个脚本都失败而没有输出。使用 -d display_errors=1 throw: PHP Fatal error: Directive 'allow_call_time_pass_reference' is no longer available in PHP in Unknown on line 0,通过从 php.ini 中删除该行来帮助我修复错误。谢谢先生
【解决方案2】:

我遇到了同样的问题,没有任何强制 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 时遇到了问题,或者您(或其他人)可能使用了 @ 并没有意识到它在调试时会导致严重(令人沮丧且耗时)的后果

【讨论】:

    【解决方案3】:

    由于内存限制问题,我遇到了 PHP CLI 在一个好的脚本上静默失败。尝试:

    php -d memory_limit=512M script.php
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-31
      • 1970-01-01
      • 1970-01-01
      • 2022-10-13
      相关资源
      最近更新 更多