node.js와 같은 언어는 비동기 데이터베이스 쿼리 기능을 구현할 수 있습니다. SQL 문을 실행한 후 데이터베이스가 결과를 반환할 때까지 기다릴 필요가 없습니다. 계속해서 다른 코드를 실행합니다. 데이터베이스가 결과를 반환하면 페이지를 렌더링하고 HTML 페이지를 클라이언트에 보내는 등의 데이터가 처리됩니다. 이런 방식으로 애플리케이션은 전혀 차단하고 기다릴 필요가 없습니다. 이 방법은 매우 효율적으로 작동합니다.
PHP에서 유사한 비동기 비차단 MySQL 쿼리를 구현하는 것이 가능합니까? 이 기능을 수행하는 것으로 보이는 프로젝트(https://github.com/kaja47/async-mysql)를 검색하려면 github를 사용하세요. 코드는 React.PHP를 기반으로 합니다. 그러나 실제로는 비동기 SQL이 아닙니다. 구현 원리는 타이머를 설정하고 0.02초마다 폴링하는 것입니다. 사용할 수는 있지만 CPU 자원을 낭비하는 셈이다. 실제로는 비동기식 MYSQL이 아닙니다.
이제 Swoole1.6.2는 진정한 PHP 비동기 MySQL을 달성하는 데 사용할 수 있는 swoole_event_add 및 swoole_get_mysqli_sock라는 두 가지 새로운 기능을 제공합니다. 구체적인 구현에 대해 이야기해 보겠습니다.
코드:
$db = new mysqli
$db->connect('127.0.0.1', 'root', 'root', 'test' );
$db->query("테이블 표시", MYSQLI_ASYNC)
swoole_event_add(swoole_get_mysqli_sock($db), function($db_sock) {
global $db;
$res = $db->reap_async_query();
var_dump($res->fetch_all(MYSQLI_ASSOC));
swoole_event_exit();
}); 연결 명령문이 성공하려면 두 번째 매개변수에 MYSQLI_ASYNC를 지정하십시오. 이 쿼리가 비동기식임을 나타냅니다. 쿼리 함수는 즉시 반환되며, 현재로서는 mysqli_result를 얻지 못합니다.
그런 다음 swoole_get_mysqli_sock 함수를 호출하여 mysql 연결 소켓을 가져오고 swoole_event_add를 호출하여 swoole의 epoll 이벤트 루프에 추가합니다. 데이터베이스가 결과를 반환하면 방금 공식화한 함수가 다시 호출됩니다.
이때 mysqli_reap_async_query를 호출하여 결과를 가져오고, fetch_all 함수를 호출하여 데이터를 가져옵니다.
이 프로세스는 완전히 비동기식이며 논블로킹이며 CPU를 낭비하는 코드가 없습니다. 이 코드는 서버측 프로그램에서도 사용할 수 있습니다. 구체적인 코드 구현은 나중에 자세히 설명하겠습니다.