fwrite () ожидает, что параметр 1 будет ресурсом; целое число задается в PhpAMQP при перемещении доступа из локальной переменной в поле объекта, наследуемого от \ Thread

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

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

Если я использую local 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, который мне не хватает?

0

Решение

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

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

1

Другие решения

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

0