0

単純な AMQP クライアントをマルチスレッドにしようとしています。I が Publish with Thread を拡張しない場合、次のコードは機能します。

<?php

include ('../JS-amqp-include.php');

$mypid = getmypid();

echo "PID: $mypid\n";

class Publish extends Thread {

    private $co;// connection
    private $ch;// channel
    private $ex;// exchange
    private $mypid, $thread_id;

    public function __construct($connection = '') {
        $this->mypid = getmypid();

        $this->co = new AMQPConnection();
        $this->co->setHost(HOST);
        $this->co->setLogin(USER);
        $this->co->setPassword(PASS);
        $this->co->setVHost(VHOST);
        $this->co->connect();           // <-- Fail here!!!!

        $this->ch = new AMQPChannel($this->co);

        $this->ex = new AMQPExchange($this->ch);
        $this->ex->setName(X_DIR);
        $this->ex->setType(XT_DIR);
        $this->ex->setFlags(AMQP_DURABLE);
        $this->ex->declareExchange();
    }

    public function run($cycle = 10, $input = '') {
        for ($i = 1; $i <= $cycle; $i++) {
            $msg = $this->mypid.':'.$input.':'.$i;
            $this->ex->publish($msg);
        }
    }
}

$time_start = microtime(true);

$pub = new Publish();
$pub->run(100, 'thread');
$time_end      = microtime(true);
$time_duration = $time_end-$time_start;
echo "Duration: $time_duration Sec.\n";

?>;

以下はエラーのある出力です。

PID: 2276
PHP Fatal error:  Uncaught exception 'AMQPConnectionException' with message 'Socket error: could not connect to host.' in /home/john/rmq/php/Amqp/JS-amqp-publish-thread.php:24
Stack trace:
#0 /home/john/rmq/php/Amqp/JS-amqp-publish-thread.php(24): AMQPConnection->connect()
#1 /home/john/rmq/php/Amqp/JS-amqp-publish-thread.php(45): Publish->__construct()
#2 {main}
  thrown in /home/john/rmq/php/Amqp/JS-amqp-publish-thread.php on line 24

なぜこれが起こるのか、または修正方法を知っている人はいますか?

Rabbitmq は HOST で実行されています。

クラス Publish 宣言から「extends Thread」を削除すると、プログラムは完全に機能します。上記のコードはまだスレッドを使用していません。クラスを拡張するだけで壊れます。

システム情報

OS: Ubuntu 15.10

Rabbitmq-c (apt-get インストール)

librabbitmq-dev:amd64 0.5.2-2 C で記述された amd64 AMQP クライアント ライブラリ - Dev Files librabbitmq1:amd64 0.5.2-2 C で記述された amd64 AMQP クライアント ライブラリ

このリンクに従って、ZTS をサポートするように Ubuntu PHP パッケージを再コンパイルします。

PHP 5.6.11-1ubuntu3.2 (cli)

Copyright (c) 1997-2015 PHP グループ

Zend Engine v2.6.0、Copyright (c) 1998-2015 Zend Technologies with Zend OPcache v7.0.6-dev、Copyright (c) 1999-2015、Zend Technologies

PHP モジュール

amqp 1.6.0 安定版

pthreads 2.0.10 安定版

4

0 に答える 0