【问题标题】:Problems with a PHP shell script: "Could not open input file"PHP shell 脚本的问题:“无法打开输入文件”
【发布时间】:2011-06-01 20:20:17
【问题描述】:

好的,我正在尝试创建一个使用 PHP shell 脚本的电子邮件记录器。我已经设置了 CPanel 来将电子邮件传送到我的脚本。我确信这一切都配置正确。但是我遇到了脚本问题,以及从 shell 运行它时的任何脚本。

这是一个例子。

#!/usr/local/bin/php –q
<?php

/* Read the message from STDIN */
$fd = fopen("php://stdin", "r");
$email = ""; // This will be the variable holding the data.
while (!feof($fd)) {
$email .= fread($fd, 1024);
}
fclose($fd);
/* Saves the data into a file */
$fdw = fopen("mail.txt", "w+");
fwrite($fdw, $email);
fclose($fdw);
/* Script End */
?>

真的很简单,对吧?从 STDIN 读取并写入文件...我认为出了点问题,由于某种原因无法读取 STDIN。托管服务提供商允许它,allow_url_open 和allow_url_include 都打开。

通过 SSH 执行脚本时,出现以下错误: 无法打开输入文件:âq

所以我又一次认为这是脚本告诉我的,这是无法从 STDIN 读取的

所以我只尝试了一个简单的脚本。

#!/usr/local/bin/php –q
<?php
echo 'Hello World';
?>

同样的事情: 无法打开输入文件:âq

所以看来 PHP 程序告诉我它无法打开脚本?该脚本位于 $HOME/mail/forward (CHMOD 755),脚本本身为 CHMOD 755,文件 mail.txt 为 CHMOD 755 我真的很难过。

【问题讨论】:

  • php 代码用什么文本编辑器? “-q”中的“-”看起来像一个破折号而不是一个减号。

标签: php bash shell


【解决方案1】:

我知道这很愚蠢,但在我的项目文件夹之外,我没有 spark 文件。

【讨论】:

    【解决方案2】:

    对我来说,问题是我必须使用 /usr/bin/php-cgi 命令,而不仅仅是 /usr/bin/php

    php-cgi 是通过网络浏览器访问时运行的命令。

    php 是 CLI 命令行命令。

    不知道为什么 php cli 不起作用,但使用 php-cgi 运行解决了我的问题。

    【讨论】:

      【解决方案3】:

      我在搜索 “无法打开输入文件” 错误的解决方案时访问了此页面。这是我为这个错误支付的 2 美分。

      我遇到了同样的错误,因为我在我的 php 文件路径中使用参数,如下所示:

      /usr/bin/php -q /home/**/public_html/cron/job.php?id=1234
      

      但我发现这不是正确的方法。正确的参数发送方式是这样的:

      /usr/bin/php -q /home/**/public_html/cron/job.php id=1234
      

      只需将"?" 替换为空格" "

      【讨论】:

        【解决方案4】:

        由于我的 windows 编码问题

        我遇到了“无法打开输入文件”错误。然后我从另一个linux系统使用wget获取文件,没有出现错误。

        该错误仅在文件通过 windows 传输时发生。

        【讨论】:

          【解决方案5】:

          我刚刚遇到了这个问题,这是因为我试图从错误的目录运行脚本.. doh!它发生在我们最好的人身上。

          【讨论】:

            【解决方案6】:

            当你使用 php CLI 参数时 -q 不存在。

            当我在 Windows (eclipse) 中编写脚本并尝试在 Linux 上运行它们时,我遇到了同样的问题。 Windows 文件中的每一行都以 \r\n 结尾。我不得不删除包含解析器路径的第一行中的 \r:

            当 \r 从第一行删除时(mcedit 将 \r 显示为 ^M)脚本运行正确。

            【讨论】:

              【解决方案7】:

              Windows 字符编码问题

              我遇到了同样的问题。我在 Windows 上的 PDT Eclipse 中编辑文件,然后 WinSCPing 它们。我只是将内容复制并粘贴到纳米窗口中,保存,现在它们可以工作了。肯定是一些 Windows 字符编码问题,而不是 Shebangs 或解释器标志的问题。

              【讨论】:

              • 我在 Windows 10 上遇到了类似的问题。我最终在所有 \ 到 / 上执行了 str_replace。换句话说:str_replace('\\', '/', $filePath)
              【解决方案8】:

              你试过了吗:

              #!/usr/local/bin/php
              

              即没有-q 部分?这就是错误消息“无法打开输入文件:-q”的含义。 php 的第一个参数(如果它看起来不像一个选项)是要执行的 PHP 文件的名称,而 -q 只是 CGI。

              编辑:几个(不相关的)提示:

              1. 您不需要用?&gt; 终止PHP 的最后一个块。事实上,最好不要这样做。
              2. 在命令行上执行时,PHP 将全局常量STDIN 定义为fopen("php://stdin", "r")。您可以使用它而不是第二次打开"php://stdin"$fd = STDIN;

              【讨论】:

              • 谢谢,当我删除 -q 时,我收到另一个错误 fopen("mail.txt") 想要绝对路径 /home/user/mail/forward/mail.txt 我没有考虑一下,因为我不在我的 public_html 目录 php 需要一个绝对路径。我的问题是,如果不是 -q,我该如何抑制任何输出?如果发生错误,脚本输出任何内容,发送电子邮件的用户将得到退回,所以我在电子邮件管道上阅读的所有内容都希望您使用 -q
              • 要禁止对任何函数调用发出警告,您可以使用 at 符号:$fp = @fopen("mail.txt")
              • 所以没有 CLI 开关来抑制脚本的输出?
              • @Mike:如果你真的想禁用由警告、错误等引起的脚本输出,那么在你的脚本顶部,你只需调用值为0的error_reporting函数:@ 987654321@
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-04-22
              • 2021-07-16
              相关资源
              最近更新 更多