2016-11-23 25 views
0

twig/emailの出力を法的な目的で保存する必要のあるtmpファイルにコピーするスクリプトがあります。まず、これはfopen、fwrite、closeを使って行いました。それは何年も働いていたが、突然それが作業とファイルを停止した。file_put_contentsが動作することはありますが、必ずしもそうではありません

次に、file_put_contentsを使用するように変更しました。しかし、それは同じ状況を引き起こす。高速多数決が作成されますが、内容がある間はファイルの15〜25%がローカルに保存されません。

$ bytesは、file_put_contentsが失敗したときに何も出力しません。エラーログには何も表示されません。現在、フォルダには324.000個のファイルがありますが、これを10.000以下にしています。

何がうまくいかないのですか、誰かが別のデバッグ方法を指摘できますか?以下のコードを参照してください。

追加情報、ファイルが保存されているフォルダには正しいアクセス許可があります。スクリプトはcronジョブで実行されます。

$bytes = file_put_contents($serverSettings['root'].'my/tmp/emaillogs/'.$PDFLogFile.'.html', $Contents); 

このコードを入れ

try { 
    $Contents = $twig->render(stripslashes($TemplateDetails['templateHTML']), $EmailData); 
    $Subject = $twig->render(stripslashes($TemplateDetails['templateSubject']), $EmailData); 

    $bytes = file_put_contents($serverSettings['root'].'my/tmp/emaillogs/'.$PDFLogFile.'.html', $Contents); 

    /* 
    $WriteFile = fopen($serverSettings['root'].'my/tmp/emaillogs/'.$PDFLogFile.'.html','w'); 
    $bytes = fwrite($WriteFile, $Contents); 
    fclose($WriteFile); 
    */ 

    echo $Output->getColoredString('Wrote '.$bytes.' to file '. $serverSettings['root'].'my/tmp/emaillogs/'.$PDFLogFile.'.html')."\n"; 

    // Create the Mailer using your created Transport 
    $mailer = Swift_Mailer::newInstance($transport); 

    $logger = new \Swift_Plugins_Loggers_ArrayLogger(); 
    $mailer->registerPlugin(new \Swift_Plugins_LoggerPlugin($logger)); 

    $message = Swift_Message::newInstance($Subject) 
     ->setFrom(array($ResultSelectEmails[$key]['fromEmail'] => $ResultSelectEmails[$key]['fromName'])) 
     ->setTo(array($ResultSelectEmails[$key]['toEmail'])) 
     ->setBody($Contents, 'text/html', 'UTF-8') 
    ; 

    if (!$mailer->send($message, $errors)) { 
     // Dump the log contents 
     // NOTE: The EchoLogger dumps in realtime so dump() does nothing for it. We use ArrayLogger instead. 
     echo $Output->getColoredString(" - [ERROR] " . $logger->dump(), "red") . "\n"; 
    }else{ 
     echo $Output->getColoredString('- [SEND] '.date('Y-m-d H:i:s'), 'green') . "\n"; 
    } 


}catch (\Exception $exc) { 

    $body = "TemplateId: ".$ResultSelectEmails[$key]['template']."\n"; 
    $body .= "ShopId: ".$ResultSelectEmails[$key]['shopId']."\n"; 
    $body .= "--------------------------------------------------------\n"; 
    $body .= "String Error: ". $exc->getTraceAsString()."\n"; 
    $body .= "Line: ".$exc->getLine()."\n"; 
    $body .= "File: ".$exc->getFile()."\n"; 

    mail('[email protected]', 'TEMPLATE ERROR: '.$ResultSelectEmails[$key]['template'],$body); 

    exit; 

} 
+0

'$ PDFLogFile'には何がありますか?また、 '$ bytes == false'のときに例外をスローし、どのファイルでこの問題が発生するかを知ろうとします。 –

+0

$ PDFLogFileは電子メールのIDとトランザクションハッシュです。つまり、例 "1345234-sadfafgasdfasgdsfhggaghf"です。それらは常に存在し、常にユニークです。 –

+0

fopenでflockを使用していた場合は、最後のユーザーが完了するのを待っていました。 file_get_contentsは待たず、残念ながら、そこに書いている別のユーザがいます。後で試してみてください。その場合は、コードを後で試してみる必要があります。どこかの一時ストレージにデータを入れてから、スケジュールされたジョブを使ってその一時的なキューからデータをポップしてみてください。 – WEBjuju

答えて

1

直前に - それはあなたが次第です何を判断するのに役立ちます:

if (is_writable($serverSettings['root'].'my/tmp/emaillogs/'.$PDFLogFile.'.html')) { 
    // no worries, just keep trucking 
    // echo 'The file is writable'; 
} else { 
    $body = "Error writing file: ".$serverSettings['root'].'my/tmp/emaillogs/'.$PDFLogFile.'.html'."\n"; 
    $body .= "Date Time: ".date('Y-m-d H:i:s')."\n"; 
    $body .= "--------------------------------------------------------\n"; 
    $body .= "Data to have been written: ".$Contents."\n"; 

    mail('[email protected]', 'FILE WRITING ERROR', $body); 
} 
$bytes = file_put_contents($serverSettings['root'].'my/tmp/emaillogs/'.$PDFLogFile.'.html', $Contents); 

を次にそのファイルがすでに存在しているかであるかどうかをチェックすることによって開始することができます書き込むことはできません。

+0

私はあなたのスクリプトを実装しました。 FILE WRITING ERRORで一部のメールを受信しました。不思議なことに、ファイルが書き込まれています。 –

+0

"tailing"ファイルは私に結果を与えます。それは、ディスクがビジーであるという事実のためにファイルを書き込めないことを意味しますか? –

+0

ああ、file_put_contentsはis_writableブロック内にあります。私のエラーです。興味深いことに、それはマイクロ秒の間に書き込み可能ではなく書き込み可能になるということです。ファイルを書き込み不可能にするものであれば何でもかまいません。それが完璧に機能していたら、なぜfopenに戻っていないのですか? – WEBjuju

関連する問題