0

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

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

除了 (2) 之外,我们几乎所有的 API 调用都在运行,我们正试图找出原因。当我们通过相同的脚本手动运行它们时,它们可以完美运行。奇怪的。只有通过 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
4

1 回答 1

0

由于您显示的代码不在任何函数中,因此变量都是全局的。任何其他全局代码都可以轻松覆盖这些变量,尤其是使用$ch.

我的猜测是,在代码中,您正在设置一个 Curl 连接,并调用“curl 句柄” $ch,这会意外覆盖现有变量。(它可以是其他任何东西,但这是一个通用变量名,并且会给你一个resource.)然后while循环检查它的条件时,它会看到这个新值$ch,而不是你想要的“通道”。

修复基本上是更加注重代码风格:

  • 使用不太可能发生冲突的更具描述性的变量名称。
  • 将长代码块分解为函数,这样您就可以一口气看到它们,并利用局部变量。
于 2019-01-25T14:08:35.360 回答