2011-08-25 9 views
6

Mam jeden serwer bazy danych z 4 rdzeniami i serwerem WWW z PHP. Chcę, aby jeden skrypt PHP był w stanie wydawać zapytania do serwera bazy danych, tak aby były wykonywane równolegle na serwerze bazy danych, po jednym na każdym procesie mysqld. Zazwyczaj w PHP robisz to:Czy PHP może przetwarzać wiele przetworzonych zapytań mysql w środowisku Apache?

$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'"); 

Ale te działają szeregowo i wykorzystują tylko jeden proces mysqld. W tej aplikacji każde zapytanie (od A do D) przetwarza inną część danych, ale działa na tym samym zestawie tabel InnoDB.

Jednym z możliwych rozwiązań jest, aby AJAX wzywa do apache rozbicie go na mniejsze skryptów potęga prowadzony równolegle, ale zgaduję, że Apache będzie przetwarzać te wywołania Ajax kolejno jeden proces httpd za klienta.

Czy istnieje sposób, aby to osiągnąć? Czy ktoś ma doświadczenie z funkcjami mysqlnd MYSQLI_ASYNC? Czy mogą pracować równolegle z jednym serwerem bazy danych i połączeniem mysqli?

Cel: uruchamiamy narzędzia analityczne działające w czasie rzeczywistym, które generują wykresy i chciałbym skorzystać z mocy obliczeniowej w naszej bazie danych, aby przyspieszyć zapytania wymagające czasu.

Odpowiedz

6

Potrzebne jest asynchroniczne wykonywanie zapytań. Możliwe jest, począwszy od PHP 5.3, kiedy masz nowy sterownik mysqlnd - wtedy możesz przekazać flagę MYSQLI_ASYNC do metody query(). Wykonanie skryptu będzie kontynuowane bez czekania na zakończenie zapytania. Jest ładny przykład użycia dostępny w podręczniku PHP w komentarzach do poll() method.

Będziesz potrzebować osobnego połączenia MySQL dla każdego zapytania, które chcesz wykonać równolegle.

+0

Zasugerowałem to również w moim pytaniu, ale czy na pewno działa to przy korzystaniu z jednego połączenia? Czy to nie wymaga wielu połączeń z dwoma lub więcej różnymi serwerami? – Toxikman

+0

Tak, wymaga wielu połączeń - po jednym dla każdego zapytania. Dodałem link do 'mysqli_poll()' dokumentów, które mają przykład. – Crack

Powiązane problemy