PHP에서 비동기 호출 메서드를 구현하는 방법

小云云
풀어 주다: 2023-03-21 22:54:02
원래의
8456명이 탐색했습니다.

브라우저와 서버 간의 연결 및 통신은 HTTP 프로토콜을 통해 이루어집니다. 이는 요청 및 응답 모델을 기반으로 하는 프로토콜입니다. 브라우저는 URL을 통해 서버에 대한 요청을 시작하고 웹 서버는 요청을 수신하고 프로그램을 실행한 다음 해당 HTML 코드를 클라이언트에 전송하여 응답합니다.

웹 서버에서 프로그램을 실행할 때 몇 밀리초 안에 완료될 수도 있고, 몇 분 내에 완료되지 않을 수도 있습니다. 프로그램이 느리게 실행되면 사용자는 더 이상 기다리지 못하고 브라우저를 닫을 수 있습니다.

때때로 우리는 이러한 시간이 많이 걸리는 스크립트의 반환 결과에 대해 신경 쓰지 않지만, 다음 단계를 계속하려면 스크립트의 실행이 끝나고 반환될 때까지 기다려야 합니다. 그렇다면 이러한 시간이 많이 걸리는 스크립트 호출을 간단히 트리거한 후 다음 단계를 계속하여 이러한 시간이 많이 걸리는 스크립트가 서버 측에서 천천히 실행될 수 있도록 하는 방법이 있습니까?

테스트 후 몇 가지 방법을 요약하여 공유합니다. 1. 가장 간단한 방법은 클라이언트에 반환된 HTML 코드에 AJAX 호출을 포함하거나 실행될 시간이 많이 걸리는 스크립트를 가리키는 src가 포함된 img 태그를 포함하는 것입니다. 이 방법이 가장 간단하고 빠릅니다. 서버는 호출을 할 필요가 없습니다. 그러나 단점은 일반적으로 Ajax가 onLoad 후에 트리거되어야 한다는 것입니다. 즉, 사용자가 페이지를 클릭한 다음 닫으면 백그라운드 스크립트가 트리거되지 않습니다. img 태그를 사용하는 경우 이 메서드는 엄밀한 의미에서 비동기 실행이라고 할 수 없습니다. 사용자 브라우저는 PHP 스크립트 실행이 완료될 때까지 오랜 시간 동안 기다립니다. 즉, 사용자 브라우저의 상태 표시줄에는 항상 로드 중이라는 메시지가 표시됩니다. 물론 스크립트 태그 등 비슷한 원리를 가진 다른 방법도 사용할 수 있습니다.

2.popen()

resource popen(문자열 명령, 문자열 모드); //주어진 명령 실행을 분기하여 생성된 프로세스에 대한 파이프를 엽니다. 주어진 명령 명령의 실행을 분기하여 생성된 프로세스에 대한 파이프를 엽니다.

그냥 호출해도 되고 출력은 무시해도 됩니다.

pclose(popen("/home/xinchen/backend.php &", 'r'));
로그인 후 복사

이 방법은 첫 번째 방법의 단점을 피하고 속도도 빠릅니다. 하지만 문제는 이 메서드가 HTTP 프로토콜을 통해 다른 WebService를 요청할 수 없고 로컬 스크립트 파일만 실행할 수 있다는 것입니다. 그리고 한 방향으로만 열 수 있으며 호출된 스크립트에 많은 수의 매개변수를 전달할 수 없습니다.
그리고 방문수가 많으면 많은 프로세스가 생성됩니다. 외부 리소스를 사용하는 경우 경쟁을 직접 고려해야 합니다.

3. CURL
메서드를 사용하고 CUROPT_TIMEOUT을 1로 설정합니다(최소값은 1, 우울함). 즉, 클라이언트는 최소 1초를 기다려야 합니다.

$ch = curl_init();
 
$curl_opt = array(CURLOPT_URL, 'http://www.example.com/backend.php',
                            CURLOPT_RETURNTRANSFER, 1,
                            CURLOPT_TIMEOUT, 1,);
 
curl_setopt_array($ch, $curl_opt);
 
curl_exec($ch);
 
curl_close($ch);
로그인 후 복사

4. fsockopen 사용
이 방법이 가장 완벽해야 하지만 단점은 HTTP 헤더 부분을 직접 작성해야 한다는 것입니다.

$fp = fsockopen("www.example.com", 80, $errno, $errstr, 30);
if (!$fp) {
    echo "$errstr ($errno)<br />\n";
} else {
    $out = "GET /backend.php  / HTTP/1.1\r\n";
    $out .= "Host: www.example.com\r\n";
    $out .= "Connection: Close\r\n\r\n";
 
    fwrite($fp, $out);
    /*忽略执行结果
    while (!feof($fp)) {
        echo fgets($fp, 128);
    }*/
    fclose($fp);
}
로그인 후 복사

그래서 전체적으로 가장 좋고 간단한 방법은 첫 번째 방법입니다.
가장 완벽한 것은 마지막이어야 하는데 더 복잡합니다.

관련 권장 사항:

JavaScript 비동기 호출 예제 분석

비동기 호출 멀티스레딩을 구현하는 PHP 메서드

JavaScript 비동기 호출 메서드 정보

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

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