में एकाधिक श्रमिकों को स्पॉइंग करना मुझे एक स्क्रिप्ट मिली है जो जांचता है कि कौन सा एमएक्स रिकॉर्ड किसी ईमेल पते से संबंधित है। मुझे जांचने के लिए लगभग 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