2013-05-01 6 views
6

में एकाधिक श्रमिकों को स्पॉइंग करना मुझे एक स्क्रिप्ट मिली है जो जांचता है कि कौन सा एमएक्स रिकॉर्ड किसी ईमेल पते से संबंधित है। मुझे जांचने के लिए लगभग 300k ईमेल मिल गए हैं। तो एक थ्रेडेड प्रक्रिया में काफी समय लग रहा है।PHP/Beanstalkd: समानांतर

मुझे एक कतार के साथ beanstalkd मिला है और php फ़ाइल के माध्यम से इसे ईमेल भेज रहा है। हालांकि मैं कतार को निष्पादित करने के लिए केवल एक कार्यकर्ता हूं। मैं वर्तमान में एक प्रक्रिया के लिए 10+ श्रमिकों को कहने के लिए एक नुकसान में हूं।

मैं do_job_mx.php चलाता हूं जो तब एक फ़ाइल खोलता है जिसमें केवल ईमेल होते हैं और उन्हें कतार में पास कर देते हैं।

एक फ़ाइल से ईमेल लेने के लिए 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); 
} 

के लिए कार्यकर्ता php कोड - 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 

मैं वर्तमान में प्रक्रिया के लिए 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 में अपग्रेड करने की जरूरत है।

अब मेरे पास एकाधिक कार्यकर्ता सुविधा है।