PHP에서 비동기 처리를 구현하는 방법

小云云
풀어 주다: 2023-03-21 20:18:01
원래의
2321명이 탐색했습니다.

실제 프로덕션 환경에서는 PHP를 백엔드 인터페이스 서버로 사용하는 경우가 많습니다. 물론 PHP는 백엔드 서버로서의 장점도 있지만 클라이언트가 신경 쓰지 않는 일부 결과를 처리할 때 단점이 드러납니다. 아니요 - 비동기 실행을 위한 메커니즘이 없습니다. 예를 들어, 특정 클라이언트의 PHP 액세스 성능(시작 시간, 종료 시간, 결과 상태 등 포함)을 기록하려는 경우 클라이언트는 물론 PHP 처리가 가능한 한 빨리 응답할 수 있기를 원합니다. 결과를 얻으려면 기존 솔루션을 설치하는 경우 클라이언트는 결과를 얻기 전에 PHP가 성능 기록을 완료할 때까지 기다려야 합니다. 그것은 현재 잔고를 확인하기 위해 은행에 가는 것과 같으며, 창구 직원은 달려가서 다른 사람들과 잠시 대화를 나누지만, 그가 당신에게 말하러 오면 결과는 같습니다.

그래서 비동기 작업을 수행할 수 있는 PHP가 필요한 경우가 많습니다.

그렇다면 어떻게 비동기를 달성할 수 있을까요?

해결책 중 하나는 PHP 시스템 호출을 사용하여 이를 달성하기 위한 새로운 프로세스를 시작하는 것입니다.

php는 fsockopen 기능을 제공합니다. 이 기능의 기능은 지정된 호스트에 대한 소켓 연결을 초기화하는 것입니다. 기본적으로 소켓 연결은 차단 모드에서 열립니다. 물론 stream_set_blocking()을 통해 Non-Blocking 모드로 변환할 수 있습니다. 이것이 핵심입니다. 따라서 아이디어는 다음과 같습니다. 비차단 소켓을 열어 로컬 컴퓨터에 연결하면 로컬 컴퓨터는 이를 수신한 후 시간이 많이 걸리는 처리를 수행합니다.

다음과 같은 처리 코드(posttest.php 파일):

$fp = fsockopen($php_Path,80);
if (!$fp) {
    LMLog::error("fsockopen:err" );
} else {
    $out = "GET /album/action/album_write_friends_thread_record.php?key=&u=   HTTP/1.1\r\n";
    $out .= "Host: ".$php_Path."\r\n";
    $out .= "Connection: Close\r\n\r\n";
    stream_set_blocking($fp,true);
    stream_set_timeout($fp,1);
    fwrite($fp, $out);
    usleep(1000);
    fclose($fp);
}
로그인 후 복사

여기서 usleep(1000)은 매우 중요하며 이 요청이 전송될 수 있도록 보장합니다.

처리 코드 로직을 살펴봅니다(file album_write_friends_thread_record.php):

<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2016-09-23
 * Time: 09:26
 */
/**
 * 客户端调用服务器接口页面
 * user: guwen
 */
sleep(20);// 睡眠20s
?>实际上,我们服务器在执行fsockopen 那段程序时,就不会再等20s之后才能返回给客户端,而是发出这个请求之后,即返回客户端,销毁进程,
而把剩余的工作交由其他进程慢慢做去,这就实现了php的异步。
로그인 후 복사

관련 권장 사항:

PHP 비동기 처리 구현 계획

위 내용은 PHP에서 비동기 처리를 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿