>백엔드 개발 >PHP 튜토리얼 >PHP에서 비동기 호출을 구현하는 4가지 방법에 대한 자세한 설명

PHP에서 비동기 호출을 구현하는 4가지 방법에 대한 자세한 설명

WBOY
WBOY원래의
2016-07-29 08:58:39817검색

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

웹 서버에서 프로그램을 실행할 때 몇 밀리초 안에 완료될 수도 있고, 몇 분 안에 완료되지 않을 수도 있습니다. 프로그램이 느리게 실행되면 사용자는 더 이상 기다리지 못하고 브라우저를 닫을 수 있습니다. 그러면 시간이 많이 걸리는 스크립트 호출을 간단히 트리거한 후 다음 단계를 계속하여 시간이 많이 걸리는 스크립트가 서버 측에서 천천히 실행될 수 있도록 하는 방법이 있습니까?


테스트 후 몇 가지 방법을 요약하여 공유합니다.

1. 가장 간단한 방법은 클라이언트에 반환된 HTML 코드에 AJAX 호출을 삽입하거나 img를 삽입하는 것입니다. 태그, src는 실행될 시간이 많이 걸리는 스크립트를 가리킵니다.

이 방법이 가장 간단하고 빠릅니다. 서버는 호출을 할 필요가 없습니다.

그러나 단점은 일반적으로 Ajax가 onLoad 후에 트리거되어야 한다는 것입니다. 즉, 사용자가 페이지를 클릭한 다음 닫으면 백그라운드 스크립트가 트리거되지 않습니다.
img 태그를 사용하는 경우 이 메서드는 엄격한 의미에서 비동기 실행이라고 할 수 없습니다. 사용자 브라우저는 PHP 스크립트 실행이 완료될 때까지 오랜 시간 동안 기다립니다. 즉, 사용자 브라우저의 상태 표시줄에는 항상 로드 중이라는 메시지가 표시됩니다.
물론 스크립트 태그 등 비슷한 원리를 가진 다른 방법도 사용할 수 있습니다.

2.popen()

resource popen ( string command, string mode );
//打开一个指向进程的管道,该进程由派生给定的 command 命令执行而产生。打开一个指向进程的管道,该进程由派生给定的 command 命令执行而产生。

따라서 호출하여 전달할 수 있지만 출력은 무시됩니다.

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);
  }
그래서 전체적으로 가장 좋고 간단한 방법은 첫 번째 방법입니다. 가장 완벽한 것은 마지막이어야 하는데 더 복잡합니다.

위 내용은 PHP에서 비동기 호출을 구현하는 4가지 방법입니다. 모든 분들의 학습에 도움이 되기를 바랍니다.

이상에서는 PHP에서 비동기 호출을 구현하는 네 가지 방법을 관련 측면을 포함하여 자세히 소개했습니다. PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.

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