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;
}
'$ PDFLogFile'には何がありますか?また、 '$ bytes == false'のときに例外をスローし、どのファイルでこの問題が発生するかを知ろうとします。 –
$ PDFLogFileは電子メールのIDとトランザクションハッシュです。つまり、例 "1345234-sadfafgasdfasgdsfhggaghf"です。それらは常に存在し、常にユニークです。 –
fopenでflockを使用していた場合は、最後のユーザーが完了するのを待っていました。 file_get_contentsは待たず、残念ながら、そこに書いている別のユーザがいます。後で試してみてください。その場合は、コードを後で試してみる必要があります。どこかの一時ストレージにデータを入れてから、スケジュールされたジョブを使ってその一時的なキューからデータをポップしてみてください。 – WEBjuju