MySQL / PDO FOUND_ROWS () иногда ложно возвращает 0

У нас есть приложение laravel 4.1, которое раньше работало под PHP 5.4, однако после обновления до 5.6.13 (а сегодня до 5.6.14) я заметил, что запросы начали иногда возвращать 0 для FOUND_ROWS(), В некоторых наших запросах это кажется прерывистым, а в других — постоянным вопросом.

Наибольшее влияние оказали наборы с подзапросами.

Мы используем PDO (мы не используем модели laravel, просто взаимодействуем напрямую с его объектом PDO). MySQL также не был изменен в этот период времени.

Пробовал все виды — одним из предложений было установить режим трассировки на 0, но это не помогло. Я пробовал настройку PDO::MYSQL_ATTR_USE_BUFFERED_QUERY в false, однако это приводит к ошибке PDO при попытке выбрать FOUND_ROWS() (Не могу получить точное сообщение прямо сейчас).

Если не считать отката до 5,4 (пожалуйста, Боже, нет), я полностью застрял …

Выполнение этих запросов непосредственно в MySQL, а затем запуск FOUND_ROWS() всегда возвращает правильные результаты.

9

Решение

Новое приложение Relic имеет некоторые проблемы. NewRelic Application Monitoring Daemon или расширение вмешивается в результаты FOUND_ROWS()

Текущий обходной путь =>

newrelic.transaction_tracer.explain_enabled = false

Пока не ясно, каковы ваши запросы sql PDO. Все еще пытаюсь мой способ использования FOUND_ROWS() с PDO. Проверьте, используете ли вы таким же образом, или укажите несколько запросов, которые вы пытаетесь использовать.

$db = new PDO(DSN...);
$db->setAttribute(array(PDO::MYSQL_USE_BUFFERED_QUERY=>FALSE));
$rs  = $db->query('SELECT SQL_CALC_FOUND_ROWS * FROM table LIMIT 5,15');
$rs1 = $db->query('SELECT FOUND_ROWS()');
$rowCount = (int) $rs1->fetchColumn();
5

Другие решения

Ну, оказывается, это было связано с плагином New Relic PHP. Отключение этого сразу исправило проблемы для всех FOUND_ROWS() запросы, которые возвращали ноль.

0

Об этом New Relic недавно сообщили, так что теперь это проблема, поданная разработчикам.

Вы можете просто отключить объяснение_планов в конфигурации newrelic.ini, и это позволит вам решить вашу проблему и сохранить отчеты APM из New Relic, не удаляя их полностью, тогда вы потеряете планы объяснения только на странице отчета с медленным запросом, в противном случае вы должны иметь все новые функции Relic, пока мы не выпустим агент, который включает исправление.

Если вы столкнетесь с проблемой, которая, по вашему мнению, потребует полного удаления New Relic, свяжитесь с нами через support.newrelic.com, если вы являетесь клиентом New Relic, или в пробной версии, или обсудите с Следите за нашими публичными форумами и участвуйте в них и, при необходимости, доводите их до сведения наших разработчиков.

Спасибо за всю полезную информацию в этой теме, я верну все это, чтобы помочь найти основную причину и решить эту проблему.

0

Просто чтобы вы знали. Я столкнулся с той же проблемой, и я могу подтвердить, что проблема исправлена ​​в / после PHP Agent 6.6.0.169 (Новая Реликвия). Я сейчас пользуюсь PHP Agent 6.7.0.174 и это работает просто отлично с точки зрения FOUND_ROWS () вопрос.

Ура!

0
По вопросам рекламы [email protected]