好吧,我 * 尝试 * 创建一个电子邮件记录器,使用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我真的被难住了。
9条答案
按热度按时间yruzcnhs1#
我刚刚经历了这个问题,这是因为我试图运行一个脚本从错误的目录。。doh!它发生在我们最好的。
fnx2tebb2#
您是否尝试过:
即没有
-q
部分?这就是错误消息"无法打开输入文件:如果php
的第一个参数看起来不像选项,那么它就是要执行的PHP文件名,-q
只是CGI。1.您不需要使用
?>
终止PHP的最后一个块,实际上,通常最好不要这样做。1.当在命令行执行时,PHP将全局常量
STDIN
定义为fopen("php://stdin", "r")
。您可以使用它来代替再次打开"php://stdin"
:$fd = STDIN;
ldfqzlk83#
我在搜索**“无法打开输入文件”**错误的解决方案时,来到了这个页面。下面是我对这个错误的2美分。
我遇到了同样的错误,而因为我使用参数在我的php文件路径,像这样:
但我发现这不是正确的方法,正确的发送参数的方法是这样的:
只需将
"?"
替换为空格" "
即可。e7arh2l64#
Windows字符编码问题
我也遇到了同样的问题。我在Windows上的PDT Eclipse中编辑文件,然后用WinSCPing将它们复制过来。我只是将内容复制并粘贴到一个nano窗口中,保存,现在它们就可以工作了。肯定是一些Windows字符编码问题,而不是Shebangs或解释器标志的问题。
hiz5n14c5#
当您使用php CLI参数-q不存在。
当我在Windows(eclipse)中编写脚本并尝试在Linux上运行它们时,我遇到了同样的问题。Windows文件中的每一行都以\r\n结尾。我必须删除\r包含解析器路径的第一行:
从第一行删除时(mcedit显示为^M),\r脚本运行正常。
s4n0splo6#
由于Windows编码问题
我遇到了这个“无法打开输入文件”错误。然后我使用
wget
从另一个Linux系统获得了这个文件,错误没有发生。该错误仅在文件通过Windows传输时发生。
7jmck4yq7#
我知道这很愚蠢,但在我的情况下,我是我的项目文件夹外,我没有Spark文件。
7cwmlq898#
对我来说,问题是我必须使用
/usr/bin/php-cgi
命令,而不仅仅是/usr/bin/php
php-cgi是通过Web浏览器访问时运行的命令。
php是CLI命令行命令。
不知道为什么php cli不工作,但运行php-cgi代替修复了我的问题。
iezvtpos9#
真正的根本原因是第一行“q”前面的连字符实际上不是标准的ASCII连字符(U+002D),而是一个短破折号(U+2013)。PHP报告的带滑稽帽子的“a”是第一个线索,然后如果你仔细看,“破折号”太大了。这是字处理器编码时做的事情。