Может ли PHP выдавать несколько обработанных запросов MySQL в среде Apache? - PullRequest
6 голосов
/ 25 августа 2011

У меня есть один сервер баз данных с 4 ядрами и веб-сервер под управлением PHP. Я хочу, чтобы один сценарий PHP мог выдавать запросы к серверу базы данных таким образом, чтобы они выполнялись параллельно на сервере базы данных, по одному на каждый процесс mysqld. Обычно в PHP вы делаете это:

$sql = new mysqli( [insert connection parameters] );
$sql->query( "SELECT 'Complex Query A'" );
$sql->query( "SELECT 'Complex Query B'" );
$sql->query( "SELECT 'Complex Query C'" );
$sql->query( "SELECT 'Complex Query D'" );

Но они запускаются последовательно и используют только один процесс mysqld. В этом приложении каждый запрос (от A до D) обрабатывает отдельную часть данных, но работает с одним и тем же набором таблиц InnoDB.

Одно из возможных решений - сделать AJAX-вызовы apache, чтобы разбить его на подпрограммы, которые могут выполняться параллельно, но я предполагаю, что Apache будет обрабатывать эти ajax-вызовы последовательно с одним процессом httpd. за клиента.

Есть ли способ достичь этого? У кого-нибудь есть опыт работы с функциями mysqlnd MYSQLI_ASYNC? Могут ли они работать параллельно с одним сервером базы данных и подключением mysqli?

Цель: мы используем аналитические инструменты в реальном времени, которые генерируют графики, и я хотел бы воспользоваться вычислительной мощностью нашей базы данных для ускорения запросов, которые занимают время.

1 Ответ

6 голосов
/ 25 августа 2011

Что вам нужно, это асинхронное выполнение запроса. Это возможно, начиная с PHP 5.3, когда у вас есть новый драйвер mysqlnd - тогда вы можете передать флаг MYSQLI_ASYNC методу query(). Выполнение скрипта будет продолжено, не дожидаясь завершения вашего запроса. В комментариях к PHP приведен хороший пример использования метода poll() .

Вам потребуется отдельное соединение MySQL для каждого запроса, который вы хотите выполнить параллельно.

...