首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >php-amqplib -致命错误:对资源调用成员函数basic_get()

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

Stack Overflow用户
提问于 2019-01-23 03:59:05
回答 1查看 275关注 0票数 0

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

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

除了(2)之外,我们几乎所有的API调用都在运行,我们试图找出原因。当我们通过相同的脚本手动运行它们时,它们可以完美地工作。真奇怪。只有在通过cron对所有其他请求运行时才会失败。

在任何情况下,夜间日志都会多次显示以下致命错误。也许这就是罪魁祸首。无法确定导致此问题的原因。如果我手动终止AMQP连接,我会得到一个不同的错误,所以我知道$ch和$conn在某个API调用中没有被覆盖。

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

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

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

发布于 2019-01-25 22:08:35

因为您显示的代码不在任何函数中,所以变量都是全局的。任何其他全局代码都可以很容易地覆盖这些变量,特别是使用$ch这样的缩写名称。

我的猜测是,在代码内部,您正在设置一个Curl连接,并调用"curl handle“$ch,这会意外地覆盖现有的变量。(它可以是任何其他名称,但这是一个通用变量名,并将为您提供一个resource。)然后,当while循环下一次检查它的条件时,它会看到这个新的$ch值,而不是您想要的“通道”。

修复基本上是更多地关注代码样式:

  • 使用更具描述性的变量名称,这样就不太可能发生冲突。
  • 将较长的代码块分解为函数,以便您可以一次查看所有函数,并利用局部变量。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54315596

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档