php-amqplib-致命错误:在资源上调用成员函数basic_get()

时间:2019-01-22 19:59:05

标签: php rabbitmq php-amqplib

使用队列系统来处理作业。我们的cron每天凌晨1点运行一次,它发布了所有必需的API调用。我们还有另一个消费者cron,它每五分钟运行一次,以解决队列中的请求。

我们处于共享环境中,通过cron调用的脚本在15分钟后终止。因此,为了保护自己,我们会在9分钟后优雅地终止脚本。

几乎所有我们的API调用都在运行,但(2)除外,我们试图找出原因。当我们通过相同的脚本手动运行它们时,它们可以完美运行。奇怪。仅在通过cron与其他所有请求一起运行时失败。

无论如何,夜间日志显示多次出现以下致命错误。也许这是罪魁祸首。无法确定是什么原因造成的。如果我手动终止AMQP连接,则会收到另一个错误,因此我知道$ ch和$ conn不会在其中一个API调用中被覆盖。

致命错误:在第116行的/........../consume_requests.php中的资源上调用成员函数basic_get()

以下是我们对phpamqplib的初始化。任何帮助将不胜感激。

require '/vendors/php-amqplib/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;

try {
    $queue = 'my_queue';
    $url = parse_url(URL);
    $conn = new AMQPStreamConnection(HOST, 5555, USER, PASS, PATH, 1));
    $ch = $conn->channel();
    $ch->queue_declare($queue, false, true, false, false);
    $ch->exchange_declare(EXCHANGE, 'direct', true, true, false);
    $ch->queue_bind($queue, EXCHANGE,$queue);
} catch(Exception $e) {
    echo $e->getMessage();
}


while($message_receipt = $ch->basic_get($queue)) {  //line 116

1 个答案:

答案 0 :(得分:0)

由于显示的代码没有任何功能,因此变量均为全局变量。任何其他全局代码都可以轻松覆盖这些变量,尤其是使用$ch这样的缩写名称。

我的猜测是,在代码内部,您正在建立一个Curl连接,并调用“ curl handle” $ch,这会意外覆盖现有变量。 (可以是其他任何名称,但这是一个公共变量名,并且会给您一个resource。)然后,下次while循环检查其条件时,它将看到{{1 }},而不是您想要的“渠道”。

基本上,该修补程序是要更加注意代码样式:

  • 使用更具描述性的变量名,避免发生冲突。
  • 将长代码块分解为函数,以便您可以一次查看所有代码,并利用局部变量。