2015-06-07 4 views
0

При использовании соединения в качестве поля класса, наследующего от \ Thread, я получаю следующая ошибка при вызове $ this-> connection-> channel():fwrite() ожидает, что параметр 1 будет ресурсом, целое число, указанное в PhpAMQP, когда доступ переместился из локальной переменной в поле объекта, наследующего от Thread

Предупреждение: fwrite() ожидает, что параметр 1 будет ресурсом, целое число задано в/var/content-generator/PHP/vendor/videlalvaro/php- amqplib/PhpAmqpLib/Wire/IO/StreamIO.php в строке 65

Если я использую локальную varaible, все работает нормально, но я получаю сообщение об ошибке, как только я перехожу к вызовам поля.

В противном случае код:

public function run() 
{ 
    $this->run = true; 
    echo ' Thread-'.$this->ThreadId." including", "\n"; 
    require_once($this->loader); 
    $this->connection = GetRabbitConnection(); 
    echo ' Thread-'.$this->ThreadId." opening channel", "\n"; 
    $this->channel = $this->connection->channel(); 
    echo ' Thread-'.$this->ThreadId." getting queue data", "\n"; 

    $RedisClient = GetRedisClient(); 

    $ScrapeExchange = $RedisClient->get(Scrape.":".Exchange); 
    $ScrapeQueue = $RedisClient->get(Scrape.":".Queue); 

    $this->OutboundExchange = $RedisClient->get(Extract.":".Exchange); 
    $this->OutboundRoutingKey = $RedisClient->get(Extract.":".RoutingKey); 

    $RedisClient = null; 

    echo ' Thread-'.$this->ThreadId." consuming", "\n"; 

    $this->channel->basic_qos(0,1,false); 
    $this->channel->basic_consume($ScrapeQueue, $ScrapeExchange, false, true, false, false, array($this, 'ProcessMessage')); 

    while($this->run) { 
     $this->channel->wait(); 
    } 

    $this->channel->close(); 
} 

Рабочий код:

public function run() 
{ 
    echo ' Thread-'.$this->ThreadId." including", "\n"; 
    require_once($this->loader); 
    echo ' Thread-'.$this->ThreadId." building connection", "\n"; 
    $connection = GetRabbitConnection(); 
    echo ' Thread-'.$this->ThreadId." opening channel", "\n"; 
    $channel = $connection->channel(); 

    echo ' Thread-'.$this->ThreadId." getting queue data", "\n"; 

    $RedisClient = GetRedisClient(); 

    $ScrapeExchange = $RedisClient->get(Scrape.":".Exchange); 
    $ScrapeQueue = $RedisClient->get(Scrape.":".Queue); 

    $this->OutboundExchange = $RedisClient->get(Extract.":".Exchange); 
    $this->OutboundRoutingKey = $RedisClient->get(Extract.":".RoutingKey); 

    $RedisClient = null; 

    echo ' Thread-'.$this->ThreadId." consuming", "\n"; 

    $channel->basic_consume($ScrapeQueue, $ScrapeExchange, false, true, false, false, array($this, 'ProcessMessage')); 

    while(true) { 
     $channel->wait(); 
    } 

    $channel->close(); 
    $connection->close(); 
} 

Что мне не хватает? Есть ли какой-то кусок \ Thread или pthreads, который мне не хватает?

ответ

1

Ресурсы официально не поддерживаются, и эти объекты зависят от ресурсов.

Вы уже нашли решение: используйте переменные области действия метода, вы также можете использовать переменные области действия static (class).

0

PHP-файлы PThreads имеют проблемы с тем, как он перемещает объектные переменные между созданием и запуском. Я закончил использование объекта, созданного в функции run(), которая содержала переменные объекта для выполнения работы вместо того, чтобы пытаться использовать сам объект потока, и с тех пор не было никаких проблем.