비차단 모드는 소켓 이벤트를 사용하는 메시징 메커니즘을 의미합니다. 이 기사에서는 관심 있는 친구들이 함께 배울 수 있는 PHP 비차단 모드를 소개합니다. 그것이 모두에게 도움이 되기를 바랍니다.
PHP가 백엔드 프로세스로 일부 장기 처리를 완료해야 하는 경우 결과 반환을 판단하지 않고 페이지 요청에 신속하게 응답하려면 다음 조치를 취할 수 있습니다.
1. 사용하는 경우 FastCGI 모드입니다. fastcgi_finish_request()를 사용하면 세션이 즉시 종료되지만 PHP 스레드는 계속 실행됩니다.
echo "program start."; file_put_contents('log.txt','start-time:'.date('Y-m-d H:i:s'), FILE_APPEND); fastcgi_finish_request(); sleep(1); echo 'debug...'; file_put_contents('log.txt', 'start-proceed:'.date('Y-m-d H:i:s'), FILE_APPEND); sleep(10); file_put_contents('log.txt', 'end-time:'.date('Y-m-d H:i:s'), FILE_APPEND);이 예제의 출력 결과는 출력 프로그램 시작에서 볼 수 있습니다. 세션이 반환되므로 디버그 출력 브라우저는 이를 수신할 수 없으며 log.txt 파일은 세 가지 완료 시간을 완전히 수신할 수 있습니다. .
2. fsockopen 및 cUrl의 비차단 모드를 사용하여 다른 URL을 요청하세요.
$fp = fsockopen("www.example.com", 80, $errno, $errstr, 30); if (!$fp) die('error fsockopen'); stream_set_blocking($fp,0); $http = "GET /save.php / HTTP/1.1\r\n"; $http .= "Host: www.example.com\r\n"; $http .= "Connection: Close\r\n\r\n"; fwrite($fp,$http); fclose($fp);cURL에서 컬_multi_* 함수를 사용하여 비동기 요청을 보내세요
$cmh = curl_multi_init(); $ch1 = curl_init(); curl_setopt($ch1, CURLOPT_URL, "http://localhost:6666/child.php"); curl_multi_add_handle($cmh, $ch1); curl_multi_exec($cmh, $active); echo "End\n";
3. Gearman, Swoole 확장 사용
Gearman은 대규모 비동기 작업을 처리할 수 있는 PHP 확장이 포함된 분산 비동기 처리 프레임워크입니다.Swoole은 많은 비동기 방식으로 최근 매우 인기가 있으며 사용하기 쉽습니다. (Chenyuan의 참고 사항: PHP를 재정의하고 NodeJS를 완전히 스프레이한다고 주장합니다. Swoole 도구는 좋지만 확장 자체는 NodeJS와 비교할 수 없다고 생각합니다.)
4. Redis 및 기타 캐시와 대기열을 사용하여 작성합니다. 데이터를 캐시에 저장하려면 백그라운드 예약 작업을 사용하여 데이터의 비동기 처리를 구현하세요.
이 방법은 트래픽이 많은 일반적인 아키텍처에서 매우 일반적이어야 합니다.5. 극단적인 경우 시스템 명령을 호출하고 데이터를 백그라운드 작업으로 전달하여 실행될 수 있다고 개인적으로 생각합니다. 매우 효율적입니다.
$cmd = 'nohup php ./processd.php $someVar >/dev/null &'; `$cmd`
6. 그링고의 큰 행보, PHP 기본 지원을 이해하지 못합니다
7. pcntl 확장을 설치하고 pcntl_fork를 사용하여 작업을 비동기적으로 실행하는 하위 프로세스를 생성하는 것이 개인적으로 가장 편리하다고 생각합니다. 좀비 프로세스.
if (($pid = pcntl_fork()) == 0) { child_func(); //子进程函数,主进程运行 } else { father_func(); //主进程函数 } echo "Process " . getmypid() . " get to the end.\n"; function father_func() { echo "Father pid is " . getmypid() . "\n"; } function child_func() { sleep(6); echo "Child process exit pid is " . getmypid() . "\n"; exit(0); }
관련 권장 사항:
php는 swoole을 사용하여 클라이언트 데이터를 실시간으로 업데이트합니다.
Swoole을 사용하여 웹 페이지를 비동기적으로 크롤링하는 실용적인 공유
php CGI , FastCGI , APACHE2HANDLER, CLI 작동 모드에 대한 자세한 설명
위 내용은 PHP 논블로킹 모드에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!