2016-11-23 1 views
0

twig/email의 출력을 합법적 인 목적으로 저장해야하는 tmp 파일로 복사하는 스크립트가 있습니다. 먼저 fopen, fwrite, close를 사용하여이 작업을 수행했습니다. 그것은 수년간 일해, 갑자기 멈추어 서서 파일과 작업을 중단했습니다.file_put_contents가 항상 작동하지 않는 경우가 있습니다.

그런 다음 file_put_contents를 사용하도록 변경했습니다. 그러나 같은 상황이 발생합니다. 빠른 대다수의 파일이 생성되지만 15-25 %의 파일은 콘텐츠가있는 동안 로컬에 저장되지 않습니다.

$ bytes는 file_put_contents가 실패 할 때 아무 것도 출력하지 않습니다. 오류 로그에 아무 것도 표시되지 않습니다. 현재 폴더에 324.000 개의 파일이 있으며 최대 10,000 개까지 가져옵니다.

무엇이 잘못 되었나요? 아니면 누군가 다른 디버그 방식을 가르쳐 줄 수 있습니까? 아래 코드를 참조하십시오.

추가 정보, 파일이 저장된 폴더에 올바른 권한이 있습니다. 스크립트는 cronjob에 의해 실행됩니다. 해당 파일이 이미 존재하거나 있는지 확인하여 시작할 수 있습니다 그리고

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); 

: -

$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

직전에 그것은 당신이 무엇을 결정하는 데 도움이됩니다 쓸 수 없다.

+0

귀하의 스크립트를 구현했습니다. 일부 전자 메일은 FILE WRRITING ERROR와 함께 수신되었습니다. 이상하게도 파일이 작성되었습니다. –

+0

"tailing"파일이 결과를 알려줍니다. 디스크가 사용 중이므로 파일을 쓸 수 없다는 것을 의미 할 수 있습니까? –

+0

아, file_put_contents는 is_writable 블록 안에 있어야합니다 - 내 오류. 여전히 마이크로 초의 범위 내에서 쓰기가 가능하지 않고 쓰기가 가능하다는 점이 흥미 롭습니다. 파일을 쓰기 불가능하게 만들 수있는 것은 무엇이든 될 수 있습니다. 그게 완벽하게 작동했다면 왜 fopen으로 돌아 가지 않을까요? – WEBjuju

관련 문제