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

Использование системы очередей для обработки заданий. Мы запускаем 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 Ответ

0 голосов
/ 25 января 2019

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

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

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

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