2013-05-01 1 views
6

У меня есть скрипт, который проверяет, какая запись MX принадлежит адресу электронной почты. У меня есть 300 тысяч электронных писем для проверки. Таким образом, процесс с одним потоком займет много времени.PHP/Beanstalkd: Нерест Несколько рабочих параллельно

У меня есть beanstalkd с очередью, а php отправляет ему сообщения через файл. Однако я только получаю один рабочий, чтобы выполнить очередь. Я в настоящее время не могу сказать, что 10% рабочих для процесса.

Запуск do_job_mx.php, который затем открывает файл, который просто содержит электронные письма и передает их в очередь.

РНР код принимать сообщения электронной почты из файла и поместить в очередь - 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); 
} 

РНР код работника - 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 конф :

[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 

В настоящее время я не могу сказать, что 10% рабочих для процесса.

Количество процессов, запущенных:

# supervisorctl status 

do_worker_process RUNNING pid 44343, uptime 1:46:11 

ответ

0

Centos 6 поставляется с:

beanstalkd 1.4.6 супервизора 2.1.8

мне просто нужно обновить супервизора 3.0.

Теперь у меня есть несколько рабочих объектов.