2011-11-07 9 views
1

受信した電子メールを処理するための簡単なスクリプトがあります。テストされたシナリオは次のとおりです。PHPスクリプトは電子メール配管でファイルに書き込むことができません

A.スクリプト機能は、電子メールをパイプで受信したことを示す電子メールを送信することです。 CLIによって-tested成功

- - ブラウザによって-tested

成功は

配管によって-tested - 成功

B.スクリプト機能を解析し、フォルダにファイルを書き込み、電子メールを送信することである 指示された電子メールがパイプで送られたアドレスで受信されました

ブラウザでテストされたファイルと電子メールが送信されました。

CLIでテスト済み - 書き込み済みの電子メールが送信されました。

パイプでテスト済み - ファイルは書き込まれませんが、電子メールは送信されます。

私は、スクリプトをパイプメッセージの読み書きの基本機能に単純化しました。私はこの問題が許可の問題だと思っていますが、私は裏付けのある証拠を見つけることができません。

私はCLIに慣れていませんが、何らかのタスクを実行できます。パイプされたシナリオのログファイルをどこで探すかわかりません。

パイピングは、テストされたすべてのシナリオでうまく機能します。配管で呼び出されると失敗する単純化されたコードを次に示します。

#!/usr/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("/my/folder/mail.txt", "w"); 
fwrite($fdw, $email); 
fclose($fdw); 
/* Script End */ 

ありがとうございました。

するように修正コード:

#!/usr/bin/php -q 
<?php 
/* Read the message from STDIN */ 
$email = file_get_contents('php://stdin'); 

/* Saves the data into a file */ 
$fdw = fopen("/Volumes/Cobra/Sites/email/mail.txt", "w+"); 
if (! $fdw) { 
    error_log("Unable to open mail.txt for output.", 1, "[email protected]", "From: [email protected]"); 
} else { 
    fwrite($fdw, $email); 
} 

fclose($fdw); 

/* Script End */ 

エラーメッセージが電子メールで送られました。それで?パイプで呼び出されるスクリプトはどのユーザーが実行しますか?

+1

は、エラーログを有効にし、警告や通知など、すべてのエラーを記録します。次に、パイプを呼び出した後にエラーログをチェックします。それはあなたが持っているエラーを示しています。エラーメッセージを理解できない場合は、質問に追加し、理解していないことを尋ねます。 http://php.net/error-reporting – hakre

+0

私の無知を許してください...私はエラー報告をしていますが、ブラウザでこれをテストするとエラーは発生しません。 Snow Leopard Serverを実行しているXserveがあります。私が見るログファイルはウェブサイトだけです。私が見ることができるどこかのPHPログがありますか? – vmaxheli

+0

はいPHPには独自のログがあります。PHPエラーログを設定していれば(以前のコメントのリンクを参照してください。スクロールすると、エラー処理に関するPHPのすべての設定がそのページにあります)。設定すると、そのエラーログを確認できます。 – hakre

答えて

0

権限の問題の場合、fopenは失敗した場合にFALSEを返します。あなたはその事件をチェックしておらず、すべてが成功したと仮定します。試してみてください(どちらでもない)場合は、アクセス許可の問題ではありません。 1つの文体の事として

あなたの実際のコードは、はるかに複雑であり、チャンクで標準入力を処理したいんしない限り、あなただけ行うことができます:

$email = file_get_contents('php://stdin'); 
+0

私はdie()条件を追加しました。これは私が紛失した場所です... "出力用にmail.txtを開くことができません"というメッセージをどこで探しますか? – vmaxheli

+0

cronジョブは、実行したアカウントに出力を電子メールで送信します。あなたは 'error_log( '...')'のようなものを使ってPHPにメッセージを書き込ませることもできますが、同じボートに入っています。エラーログファイルに書き込めない場合は、メッセージを受け取れません。 –

+0

エラーログを書き込めない場合は、syslog(一時的)に設定します。 http://php.net/manual/en/function.error-log.php - 参照先パラメータを参照してください。 – hakre

関連する問題