2011-02-03 10 views
1

나는 안정적인 메일 링 시스템을 구축하여 어떤 문제를 일으키고 일반적으로 신뢰할만한 것은 아닙니다.큰 요청에 대해 cURL 사용

현재 저는 PEAR mail_queue를 사용하여 MySQL 데이터베이스로 보낼 메일을 추가하고 다른 하나는 PEAR 및 cron 작업을 사용하여 메일을 보내도록 전용 PHP 스크립트가있는 전용 서버를 보유하고 있습니다. 이 모든 것이 잘 작동합니다.

내가 고심하는 비트는 뉴스 레터가 전송되는 사이트를 무너 뜨리지 않고 데이터베이스를 채우는 것입니다.

뉴스 레터는 공유 서버에서 개최되는 사이트 백엔드의 관리자 패널에서 설정 및 전송됩니다. 뉴스 레터 보내기 버튼을 클릭하면 cURL 요청이 전용 서버로 전송되어 DB를 채 웁니다. 그러나 구독자가 600 명이 넘는 뉴스 레터를 보내면 전체 사이트가 중단되고 프로세스가 완료 될 때까지 반환되지 않습니다.

배경 또는 비동기 적으로 실행될 수있는 cURL 또는 다른 요청을 설정하거나 사이트를 죽이지 않는 설정은 어떻게 설정합니까? 이 실행

$hCurl = curl_init(); 

$curl_options = array(CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_URL => "http://DOMAIN/PATH/SCRIPT", CURLOPT_POSTFIELDS => "VARIABLE TO SEND"); 

curl_setopt_array($hCurl, $curl_options); 

$sResp = curl_exec($hCurl); 
curl_close($hCurl); 

스크립트가 유효한 이메일을이고 상태와 유효하지 않은 이메일을 반환 확인 후 mail_queue에 가입자를 추가

는 여기에 몇 가지 코드입니다. 나는 MySQL 데이터베이스에 600 개 이상의 이메일을 추가하는 것이 이것에 대한 많은 작업이라고 생각한다.

도움을 주시면 감사하겠습니다.

+0

그 cURL 요청은 차례로 메일을 보내는 원격 스크립트를 시작해야합니까? 어쨌든 cURL 함수는 자체적으로 백그라운드 프로세스를 시작할 수 없습니다. 무인 사이드 작업을 시작하려면'exec ("nohup curl http : // www/&")'와 같은 것을 가지고있을 것입니다. 응답에 대해 – mario

+0

주셔서 감사합니다. cURL 요청은 db에 메일을 채워 보내는 것입니다. 이메일은 cron 작업을 사용하여 간격을두고 발송되어 smtp 서버의 부하를 줄이는 데 도움이됩니다. 이는 문제의 한 부분이었습니다. 백그라운드 프로세스에 도움이되는지 확인하려면 exec()를 살펴 봐야 할 것입니다. – andyface

답변

0

이론 상으로는 (CLI 외부에서 작동하는지 잘 모르겠지만) 아마도 포크 할 수 있습니다. 그러나 그것이 작동하더라도, 아파치에서 실행중인 경우에는 디버깅을 거의 할 수 없으므로 아마 가치가있는 것보다 더 혼란 스러울 것입니다. 따라서 최선의 방법은 전달해야하는 데이터를 직렬화하고 파일에 덤프하고 exec()를 사용하여 다른 PHP 스크립트를 호출 한 다음 serialize 된 데이터를 처리하고 나머지 마법을 비동기 적으로 수행하는 것입니다. 물론 스크립트 호출은 백그라운드로 밀어 넣어야 할 것이므로 직렬화 된 데이터가 들어있는 파일의 이름을 전달해야합니다.

원유 골격은 다음과 같이 보일 것입니다 : do_the_curly.php이 bascially 그 앞에 추가 직렬화 된 데이터를 읽고에 대한 비트와 원래 스크립트 코드를 포함 할

$fname=tempnam("/tmp","curl_"); 
$fp=fopen($fname,'w'); 
fputs($fp,serialize("VARIABLE TO SEND")); 
fclose($fp); 
exec("php do_the_curly.php $fname &"); 

.

관련 문제