PHP shell脚本的问题:“无法打开输入文件”

bqucvtff  于 2023-02-11  发布在  PHP
关注(0)|答案(9)|浏览(250)

好吧,我 * 尝试 * 创建一个电子邮件记录器,使用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执行脚本时,我收到以下错误:无法打开输入文件:阿
所以我又一次认为那是脚本告诉我的,那是不能从STDIN读取的
所以我尝试了一个简单的脚本。

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

同样的事情:无法打开输入文件:阿
所以PHP程序告诉我它无法打开脚本?脚本位于$HOME/mail/forward(CHMOD 755),脚本本身是CHMOD 755,以及文件mail.txt是CHMOD 755我真的被难住了。

yruzcnhs

yruzcnhs1#

我刚刚经历了这个问题,这是因为我试图运行一个脚本从错误的目录。。doh!它发生在我们最好的。

fnx2tebb

fnx2tebb2#

您是否尝试过:

#!/usr/local/bin/php

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

    • 编辑:**一些(不相关的)提示:

1.您不需要使用?>终止PHP的最后一个块,实际上,通常最好不要这样做。
1.当在命令行执行时,PHP将全局常量STDIN定义为fopen("php://stdin", "r")。您可以使用它来代替再次打开"php://stdin"$fd = STDIN;

ldfqzlk8

ldfqzlk83#

我在搜索**“无法打开输入文件”**错误的解决方案时,来到了这个页面。下面是我对这个错误的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

只需将"?"替换为空格" "即可。

e7arh2l6

e7arh2l64#

Windows字符编码问题

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

hiz5n14c

hiz5n14c5#

当您使用php CLI参数-q不存在。
当我在Windows(eclipse)中编写脚本并尝试在Linux上运行它们时,我遇到了同样的问题。Windows文件中的每一行都以\r\n结尾。我必须删除\r包含解析器路径的第一行:
从第一行删除时(mcedit显示为^M),\r脚本运行正常。

s4n0splo

s4n0splo6#

由于Windows编码问题

我遇到了这个“无法打开输入文件”错误。然后我使用wget从另一个Linux系统获得了这个文件,错误没有发生。
该错误仅在文件通过Windows传输时发生。

7jmck4yq

7jmck4yq7#

我知道这很愚蠢,但在我的情况下,我是我的项目文件夹外,我没有Spark文件。

7cwmlq89

7cwmlq898#

对我来说,问题是我必须使用/usr/bin/php-cgi命令,而不仅仅是/usr/bin/php
php-cgi是通过Web浏览器访问时运行的命令。
php是CLI命令行命令。
不知道为什么php cli不工作,但运行php-cgi代替修复了我的问题。

iezvtpos

iezvtpos9#

真正的根本原因是第一行“q”前面的连字符实际上不是标准的ASCII连字符(U+002D),而是一个短破折号(U+2013)。PHP报告的带滑稽帽子的“a”是第一个线索,然后如果你仔细看,“破折号”太大了。这是字处理器编码时做的事情。

相关问题