2011-04-06 3 views
3

약 30,000 개의 전자 메일 메시지를 보내는 배치 전자 메일 프로세스가 있습니다. 나는 이상한 문제에 직면하여 프로세스가 85 % 완료되고 메시지가 나타나기 시작한다. Could not execute: /usr/sbin/sendmail PHPMailer 1.73이라는 라이브러리를 사용하고 있으며 오류 메시지의 출처가 관련 코드 인PHP의 popen 명령이 실패하는 이유

if([email protected]$mail = popen($sendmail, "w")) 
{ 
    $this->SetError($this->Lang("execute") . $this->Sendmail); 
    return false; 
} 

$sendmail의 값의 형식은 : /usr/sbin/sendmail -oi -f [email protected] -t

나는 set_time_limit(0); 때문에 스크립트 시간 초과되지 않습니다 있습니다.

어쨌든 갑자기 popen()이 실패하기 시작하는 이유를 알아낼 수 있습니까? OS에서 파일 설명자가 부족하거나 다른 한계에 도달했을 수 있습니까?

어떻게 해결해야합니까? 내가 잠을 자고 실패하기 전에 popen()을 몇 번 다시 시도해야합니까?

업데이트 : 나는 proc_open documentation에이 FALSE를 반환하는 경우는 아마 당신이 파일 기술자의 부족이나 메모리가 부족하다는 것을 의미하는 댓글을 발견 proc_open()을 확인하는 마르코의 제안에 감사합니다. 내 과정에서 메모리가 20G 인 것으로 나타났습니다. 그러나 memory_limit64M으로 설정하면 얼마나 많은 메모리가 필요합니까? 자, exec(), popen() 또는 proc_open()의 외부 프로그램을 실행하는 것은 PHP의 메모리 제한에 포함되지 않습니다. 그것에 대한 자세한 내용은이 질문을 참조하십시오. Debugging memory usage in mod_php. 나는 아직도 어떻게 이런 일이 일어나고 있는지 확신 할 수 없지만 어떤 종류의 메모리 누수가 의심된다.

요약하면 파일 설명이 없거나 메모리가 부족한 경우 popen()proc_open()FALSE을 반환 할 수 있습니다.

+0

서버가 시간당 최대 smtp 릴레이로 구성되어 있습니까? 스크립트 실행 시간 초과는 어떻게 설정됩니까? – 65Fbef05

+0

PID가 부족할 수도 있습니다. 구형 유닉스 박스 (특히 리눅스)의 천정은 2^16이다. 정기적 인 시스템 프로세스가 포함 된 상태에서 30,000 개의 이메일이 가까이 다가오고있는 것처럼 들립니다. 하지만, 30,000 개가 넘는 센드 메일 인스턴스가 쫓겨나면서 시스템 부하가 어떻게 될지 싫어합니다. –

답변

1

대신 proc_open을 사용하는 것이 좋습니다. 사용하기가 약간 더 복잡하지만 stdout 및 stderr에 액세스 할 수 있습니다. 이 두 파이프의 메시지는 많은 디버깅 시간을 절약 해줍니다.

사용 방법, PHP 설명서에서 예제와 주석을 읽으십시오.

관련 문제