Мы используем индексы реального времени Sphinx и разговариваем с ними через PHP-драйвер mysqli. Одиночные запросы работают нормально, но мы пытаемся реализовать пакетный процесс обновления с помощью multi_query.multi_query не работает в mysqli для обновления индекса sphinx в реальном времени с помощью sphinxql
Запросы выглядеть следующим образом:
UPDATE rt SET rank = 1 WHERE id = 881523;
UPDATE rt SET rank = 2 WHERE id = 881727;
UPDATE rt ...
(это после того, как взрывается с точкой с запятой, разрывы строк добавлены для удобства чтения)
И ошибки мы получаем:
sphinxql: syntax error, unexpected ';', expecting $end near ';UPDATE rt SET rank = 2 WHERE id = 881727'
Если я копирую/вставляю запрос в клиент CLI mysql, нет проблем:
mysql> UPDATE rt SET rank = 1 WHERE id = 881523;UPDATE rt SET rank = 2 WHERE id = 882884;UPDATE rt SET rank = 3 WHERE id = 881727;
Query OK, 1 row affected (0.01 sec)
Query OK, 1 row affected (0.01 sec)
Query OK, 1 row affected (0.01 sec)
Вот код PHP. $conn
является экземпляром класса Connection из http://foolcode.github.io/SphinxQL-Query-Builder/, но мы работаем с базовой связью Mysqli непосредственно с помощью $conn->getConnection()
:
$query = implode(';', $queries);
if($conn->getConnection()->multi_query($query)) {
do { }
while($conn->getConnection()->next_result());
}
if($conn->getConnection()->error) {
error_log("query: " . $query);
error_log($conn->getConnection()->error);
die();
}
Я попытался с помощью multiQuery()
функции из соединения класса SphinxQL Query Builder с такие же результаты.
Сообщение об ошибке, указывающее на точку с запятой, неожиданно кажется самой странной для меня частью. Если он хочет $ end, значит ли это, что он не поддерживает несколько запросов? Почему бы и нет, если он хочет взять тот же запрос через клиент mysql?
$php -v
PHP 5.5.20 (cli) (built: Dec 29 2014 18:02:29)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies
with Zend OPcache v7.0.4-dev, Copyright (c) 1999-2014, by Zend Technologies
Я вижу, что вы используете 'implode()', но после взлома вы добавляете '' 'в конце' $ query' для завершения строки SQL? –
Я пробовал с и без, никакой разницы в любом случае. Я заметил, что пример кода в ряде мест не стал добавлять его в конец, поэтому я считаю его необязательным. –
Рассматривали ли вы использование подготовленного заявления и просто повторение обновлений? Я предполагаю, что вы получите лучшую производительность таким образом, так как запрос не нужно перепланировать каждый раз. –