약 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_limit
을 64M
으로 설정하면 얼마나 많은 메모리가 필요합니까? 자, exec()
, popen()
또는 proc_open()
의 외부 프로그램을 실행하는 것은 PHP의 메모리 제한에 포함되지 않습니다. 그것에 대한 자세한 내용은이 질문을 참조하십시오. Debugging memory usage in mod_php. 나는 아직도 어떻게 이런 일이 일어나고 있는지 확신 할 수 없지만 어떤 종류의 메모리 누수가 의심된다.
요약하면 파일 설명이 없거나 메모리가 부족한 경우 popen()
및 proc_open()
은 FALSE
을 반환 할 수 있습니다.
서버가 시간당 최대 smtp 릴레이로 구성되어 있습니까? 스크립트 실행 시간 초과는 어떻게 설정됩니까? – 65Fbef05
PID가 부족할 수도 있습니다. 구형 유닉스 박스 (특히 리눅스)의 천정은 2^16이다. 정기적 인 시스템 프로세스가 포함 된 상태에서 30,000 개의 이메일이 가까이 다가오고있는 것처럼 들립니다. 하지만, 30,000 개가 넘는 센드 메일 인스턴스가 쫓겨나면서 시스템 부하가 어떻게 될지 싫어합니다. –