У меня есть скрипт, который проверяет, какая запись 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