OK、私はtrying PHPシェルスクリプトを使用する電子メールロガーを作成します。スクリプトに電子メールをパイプするようにCPanelを設定しました。これは間違いありませんはすべて正しく構成されていますが、スクリプトから問題があります。シェルからスクリプトを実行すると、問題が発生します。
ここに例があります。
#!/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です。これには本当に困っています。
やってみました:
_#!/usr/local/bin/php
_
つまり_-q
_部分なし?これが、「入力ファイルを開けませんでした:-q」というエラーメッセージの意味です。オプションのように見えない場合のphp
の最初の引数は、PHP実行するファイルの名前であり、_-q
_はCGIのみです。
編集:いくつかの(関連しない)ヒント:
?>
_で終了する必要はありません。実際には、そうしない方がよい場合がよくあります。STDIN
をfopen("php://stdin", "r")
に定義します。_"php://stdin"
_を開く代わりに、時間:_$fd = STDIN;
_この問題が発生しました。間違ったディレクトリからスクリプトを実行しようとしたためです。それは私たちの最高のものに起こります。
Php CLI引数を使用する場合、引数-qは存在しません。
Windows(Eclipse)でスクリプトを作成したときも同じ問題があり、Linuxで実行してみました。 Windowsからのファイルのすべての行は、\ r\nで終了します。パーサーパスを含む最初の行の\ rを削除する必要がありました。
\ rが最初の行から削除されたとき(mceditは\ rが^ Mとして表示されます)、スクリプトは正しく実行されました。
「入力ファイルを開けませんでした」エラーの解決策を検索したところ、このページが表示されました。これがこのエラーの私の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
"?"
スペースあり" "
。
Windows文字エンコードの問題
私は同じ問題を抱えていました。 Windows上のPDT Eclipseでファイルを編集し、WinSCPで上書きしていました。内容をコピーしてnanoウィンドウに貼り付けて保存したところ、動作しました。間違いなくWindowsの文字エンコーディングの問題であり、Shebangsやインタープリターフラグの問題ではありません。
私にとっての問題は、/usr/bin/php-cgi
コマンドだけではなく/usr/bin/php
php-cgiは、Webブラウザーからアクセスしたときに実行されるコマンドです。
phpはCLIコマンドラインコマンドです。
Php cliが機能しない理由はわかりませんが、php-cgiで実行すると問題が解決しました。
Windowsのエンコードの問題により
この「入力ファイルを開けませんでした」というエラーが発生しました。次に、wget
を使用して別のLinuxシステムからファイルを取得しましたが、エラーは発生しませんでした。
エラーは、ファイルがWindowsを通過したときにのみ発生しました。