>  기사  >  백엔드 개발  >  PHP 논블로킹 모드에 대한 자세한 설명

PHP 논블로킹 모드에 대한 자세한 설명

*文
*文원래의
2017-12-29 18:03:361868검색

비차단 모드는 소켓 이벤트를 사용하는 메시징 메커니즘을 의미합니다. 이 기사에서는 관심 있는 친구들이 함께 배울 수 있는 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 기본 지원을 이해하지 못합니다

http://nikic.github.io/2012/12/22/Cooperative-multitasking- using-coroutines-in-PHP.html


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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.