好的,我尝试创建一个使用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 我真的很难过。
答案 0 :(得分:9)
我刚刚遇到过这个问题,那是因为我试图从错误的目录运行脚本.. doh!它发生在我们最好的人身上。
答案 1 :(得分:6)
你试过了吗?
#!/usr/local/bin/php
即。没有-q
部分?这就是错误消息“无法打开输入文件:-q”的意思。 php
的第一个参数,如果它看起来不像一个选项,则是要执行的PHP文件的名称,而-q
只是CGI。
编辑:一些(非相关)提示:
?>
终止最后一个PHP块。事实上,通常最好不要这样做。STDIN
定义为fopen("php://stdin", "r")
。您可以使用它而不是第二次打开"php://stdin"
:$fd = STDIN;
答案 2 :(得分:4)
当您使用php CLI参数时,-q不存在。
当我在Windows(eclipse)中编写脚本时我遇到了同样的问题,我尝试在Linux上运行它们。来自Windows的文件中的每一行都以\ r \ n结束。我不得不删除包含解析器路径的第一行中的\ r:
当\ r \ n从第一行删除时(mcedit显示\ r \ n为^ M)脚本正确运行。
答案 3 :(得分:2)
Windows字符编码问题
我遇到了同样的问题。我正在Windows上的PDT Eclipse中编辑文件并将它们WinSCP。我只是将内容复制并粘贴到纳米窗口中,保存,现在他们工作了。绝对是一些Windows字符编码问题,而不是Shebangs或解释器标志。
答案 4 :(得分:2)
我在搜索“无法打开输入文件”错误的解决方案时登陆此页面。这是我的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
只需将"?"
替换为空格" "
。
答案 5 :(得分:0)
由于我的Windows编码问题
我遇到了“无法打开输入文件”错误。然后我从另一个Linux系统使用wget
获取了该文件,并且没有发生错误。
当文件通过Windows传输时,只会出现错误。
答案 6 :(得分:0)
对我来说问题是我必须使用/usr/bin/php-cgi
命令而不仅仅是/usr/bin/php
php-cgi是通过网络浏览器访问时运行的命令。
php是CLI命令行命令。
不确定为什么php cli不起作用,但是用php-cgi运行而不是为我解决了这个问题。
答案 7 :(得分:0)
我知道它很愚蠢,但就我而言,我不在项目文件夹中,没有火花文件。