2013-05-01 16 views
6

Ho uno script che controlla quale record MX appartiene a un indirizzo email. Ho ricevuto circa 300k email da controllare. Quindi un processo a thread singolo richiederà molto tempo.PHP/Beanstalkd: spawning Più lavoratori in parallelo

Ho beanstalkd con una coda e php sta inviando e-mail ad esso tramite un file. Tuttavia, sto sempre ottenendo un solo lavoratore per eseguire la coda. Sono attualmente in perdita per spawn dire più di 10 lavoratori per un processo.

Corro do_job_mx.php che apre un file che contiene solo e-mail e li passa in coda.

il codice PHP di prendere messaggi di posta elettronica da un file e mettere in coda - do_job_mx.php:

require_once('pheanstalk_init.php'); 

$pheanstalk = new Pheanstalk_Pheanstalk('127.0.0.1:11300'); 

$filename = '_blank.txt'; 
$filename = dirname(__FILE__) . '/in/' . $filename; 

foreach (file($filename, FILE_SKIP_EMPTY_LINES) as $line) 
{ 
    $json = json_encode(array("email" => trim($line))); 

    $pheanstalk 
     ->useTube('process_mx') 
     ->put($json); 
} 

il codice PHP per il lavoratore - do_worker_process_mx.php:

class Worker 
{ 
    public function __construct() 
    { 
     $this->log('worker process - starting'); 

     require_once('pheanstalk_init.php'); 
     $this->pheanstalk = new Pheanstalk_Pheanstalk('127.0.0.1:11300'); 
    } 

    public function __destruct() 
    { 
     $this->log('worker process - ending'); 
    } 

    public function run() 
    { 
     $this->log('worker process - starting to run'); 

     while(1) 
     { 
      $job = $this->pheanstalk 
       ->watch('process_mx') 
       ->ignore('default') 
       ->reserve(); 

      $data = json_decode($job->getData(), true); 

      $this->process_mx($data); 

      $this->pheanstalk->delete($job); 
     } 
    } 

    private function process_mx($data) 
    { 
     $domain = explode("@", $data['email']); 

     dns_get_mx($domain[1], $mx_records); 

     $mx_array = explode(".", strtolower($mx_records[0])); 

     $mx = array_slice($mx_array, -2, count($mx_array)); 

     $mx_domain = implode(".", $mx); 

     echo $data['email'] . "\n"; 

     $this->write_file($mx_domain, $data['email']); 
    }  

    private function write_file($mx, $email) 
    { 
     $filename = fopen(dirname(__FILE__) . "/out/" . $mx . ".txt", 'ab+'); 

     fwrite($filename, $email . "\n"); 

     fclose($filename); 
    } 

    private function log($txt) 
    { 
     echo $txt . "\n"; 
    } 
} 

$worker = new Worker(); 
$worker->run(); 

Supervisord conf :

[program:do_worker_process] 
command=/usr/bin/php /srv/www/mydev/public_html/esp/do_worker_process_mx.php 
numprocs=10 
numprocs_start=10 
autostart=true 
autorestart=true 
stopsignal=QUIT 
log_stdout=true 
logfile=/var/log/supervisor/worker_process_mx.log 

sono attualmente in perdita per deporre le uova dire 10+ lavoratori per un processo.

Numero di processi in esecuzione:

# supervisorctl status 

do_worker_process RUNNING pid 44343, uptime 1:46:11 

risposta

0

CentOS 6 è dotato di:

beanstalkd 1.4.6 supervisore 2.1.8

Avevo solo bisogno di effettuare l'aggiornamento a supervisore 3.0.

Ora ho la struttura per più lavoratori.

Problemi correlati