php-amqplib - фатальная ошибка: вызов функции-члена basic_get() для ресурса

Использование системы очередей для обработки заданий. Мы запускаем cron один раз каждое утро в 1:00, и он публикует все наши необходимые вызовы API. У нас есть другой потребительский cron, который запускается каждые пять минут и обрабатывает запросы в очереди.

Мы находимся в общей среде, и сценарии, вызываемые через cron, завершаются через 15 минут. Поэтому, чтобы защитить себя, мы изящно завершаем наш скрипт через 9 минут.

Почти все наши вызовы API выполняются, за исключением (2), который мы пытаемся выяснить, почему. Когда мы запускаем их вручную через один и тот же скрипт, они работают отлично. Странный. Ошибка только при запуске через cron со всеми другими запросами.

В любом случае ночные журналы показывают следующую фатальную ошибку, возникающую несколько раз. Может быть, это виновник. Невозможно определить, что является причиной этого. Если я вручную уничтожаю соединения AMQP, я получаю другую ошибку, поэтому я знаю, что $ch и $conn не переопределяются где-то в одном из вызовов API.

Неустранимая ошибка: вызов функции-члена basic_get() для ресурса в /........../consume_requests.php в строке 116

Ниже приведена наша инициализация 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 ответ

Поскольку код, который вы показываете, не находится ни в одной функции, все переменные являются глобальными. Любой другой глобальный код может легко перезаписать эти переменные, особенно с таким сокращенным именем, как $ch,

Я предполагаю, что внутри кода вы устанавливаете соединение Curl и вызываете "ручку завитка" $ch, который случайно перезаписывает существующую переменную. (Это может быть что-нибудь еще, но это обычное имя переменной, которое даст вам resource.) Тогда в следующий раз while цикл проверяет свое состояние, он видит это новое значение $ch, а не "канал", который вы намеревались.

Исправление в основном состоит в том, чтобы уделять больше внимания стилю кода:

  • Используйте более описательные имена переменных, которые с меньшей вероятностью столкнутся.
  • Разбейте длинные блоки кода на функции, чтобы вы могли видеть их все за один раз и использовать преимущества локальных переменных.
Другие вопросы по тегам