Выполнение Async подготовленных операторов в PHP с postgreSQL и игнорирование его результатов - PullRequest
2 голосов
/ 28 марта 2012

У меня есть какая-то (базовая) регистрация с действиями пользователя в базе данных postgreSQL. Чтобы повысить производительность, я выполняю все операции вставки журналов асинхронно, чтобы сценарий продолжался и не ждал, пока не будет создана запись журнала.

Я везде использую подготовленные операторы для предотвращения SQL-инъекций и загрузки их по мере необходимости.

Проблема возникает, когда ожидает результатов, которые нужно извлечь из предыдущего асинхронного запроса, когда я готовлю инструкцию. (PostgreSQL говорит, что есть ожидающие результаты, которые должны быть получены до подготовки нового оператора)

Так что в качестве обходного пути я собираю все ожидающие результаты (если таковые имеются) и игнорирую их, чтобы осчастливить PHP и PostgreSQL перед подготовкой любого оператора.

Но из-за этого обходного пути (как я его вижу) я скучаю по производительности, которую я мог бы получить, выполняя асинхронно, поскольку мне все равно приходится собирать результаты.

Есть ли способ асинхронно выполнить подготовленный оператор и преднамеренно сказать postgres игнорировать результаты?

Внутри моего класса PostgreSQL я вызываю подготовленные операторы с

pg_send_execute($this->resource, $name, $params);

и подготовить их к

//Just in case there are pending results (workarround)
while (pg_get_result($this->resource)!==FALSE);
$stmt = pg_prepare($this->resource, $stmtname, $query);

Любая помощь будет оценена.

ОБНОВЛЕНИЕ: Все асинхронные запросы, которые я использую, являются только INSERT, поэтому должно быть безопасно (теоретически) игнорировать их результаты.

1 Ответ

3 голосов
/ 05 мая 2012

Единственное, что асинхронно, - это ваше взаимодействие с сервером PostgreSQL - ваша база данных должна обрабатывать все последовательно.

Мое предложение:

Если вам нужно использовать PostgreSQL для ведения журнала, используйте отдельное соединение с базой данных для целей ведения журнала и получите пул соединений, расположенный между вашим сценарием и базой данных - аутентификация в PostgreSQL стоит дорого и занимает некоторое время, это сократит его. Получение второго соединения займет некоторое время, но если вы используете этот метод, оно будет быстрее, чем без подключения к пулу.

В зависимости от ваших требований к надежности вы должны использовать автокоммит (чтобы никогда не потерять запись журнала при сбое PHP). Возможно, вы захотите использовать таблицу UNLOGGED (доступную с PostgreSQL 9.1), если вас не заботит надежность на конце базы данных (более быстрые вставки, так как ваши данные пропускают WAL) или если вы не используете репликацию или вам не нужны журналы реплицировать.

В качестве оптимизации скорости ваша таблица журналов не должна иметь индексов, потому что они должны будут обновляться при каждой вставке. Если они вам нужны, создайте вторую таблицу и переместите данные в пакетном режиме (каждые Х минут или каждый час).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...