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
, а не "канал", который вы намеревались.
Исправление в основном состоит в том, чтобы уделять больше внимания стилю кода:
- Используйте более описательные имена переменных, которые с меньшей вероятностью столкнутся.
- Разбейте длинные блоки кода на функции, чтобы вы могли видеть их все за один раз и использовать преимущества локальных переменных.