7

どの MX レコードがメール アドレスに属しているかを確認するスクリプトがあります。チェックするメールは約 30 万件あります。そのため、シングル スレッド プロセスには長い時間がかかります。

私はキューを持つbeanstalkdを持っており、phpはファイル経由でそれに電子メールを送信しています。ただし、キューを実行するワーカーは 1 つだけです。私は現在、プロセスのために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();

監視設定:

[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
4

1 に答える 1

0

Centos 6 には以下が付属しています。

beanstalkd 1.4.6 スーパーバイザー 2.1.8

スーパーバイザー 3.0 にアップグレードする必要がありました。

今、私は複数のワーカー機能を持っています。

于 2013-05-02T06:03:49.030 に答える