У меня периодически возникают проблемы с довольно сложной поисковой системой. Время от времени я писал PHP-демон, который добавляет новый контент в нашу базу данных, а RT-индекс для sphinx создает загадочное исключение.
Сообщение просто «Заявление не может быть выполнено».
Код, который вызывает это (обрезается):
<?php
$itemIds = Array( 79555 );
$index = 'doc';
$adapter = $this->dbAdapter;
$qi = function($name) use ($adapter) {
return $adapter->platform->quoteIdentifier($name);
};
$checkSql = '
SELECT * FROM
'. $qi( $index ) . '
WHERE
id = ' . (int)$itemIds[0];
$checkStatement = $this->dbAdapter->query($checkSql);
$result = $checkStatement->execute();
Похоже, что исключение не возникает ни при каком конкретном триггере, но сохраняется с момента его первого запуска до момента, когда я перезапускаю демон. Я вывел sql, сгенерированный Zend \ DB \ Adapter, и идентификаторы баров были разными, похоже, в запросах нет различий между запросами, которые выполняются успешно, и запросами, которые не выполняются.
Там нет связанной ошибки в журналах sphinx (что я вижу), и если я загружаю нейтрон / sphinxsearch-api / sphinxapi.php и запускаю GetLastError()
он возвращает пустую строку.
Я думаю, что это ошибка соединения — или, возможно, неправильная конфигурация с конфигурацией sphinx, делающей его тайм-аут, но я не уверен.
Похоже, вы используете постоянные соединения. Иногда соединение может быть сброшено, но ваш код этого не учитывает и все еще пытается использовать соединение, которое было закрыто. Может быть, попробуйте проверить на наличие ошибки, и, если она возникнет, переподключится.
Короче говоря, сделайте код устойчивым к соединению, которое иногда закрывается.
Других решений пока нет …