이전 글에서 PHP 멀티스레딩 구현 방법을 소개해드렸으니, 오늘은 PHP가 비동기 멀티스레딩을 구현하는 방법을 자세히 소개해 보도록 하겠습니다. 이 글을 통해 더욱 발전하시길 바랍니다. PHP 멀티스레딩에 대한 이해!
예를 들어 추천 이메일이 1000명의 사용자에게 전송되는 시나리오가 있습니다. 사용자가 이메일 계정을 입력하거나 가져와 서버에 제출하여 전송을 실행합니다. 이 코드의 사용자 경험은 실제로 사용할 수 없습니다. 우선 너무 많은 이메일을 보내면 서버가 시간 초과될 수 있습니다. 실제로 긴 사용자 대기 시간으로 인해 사용자는 의심을 갖게 되고 신뢰를 잃게 됩니다. 시스템 제품. 그러나 사용자는 이메일을 성공적으로 제출하기 전에 1,000개의 이메일이 모두 전송될 때까지 기다릴 필요가 없습니다. 백그라운드로 제출한 후 사용자에게 이메일을 하나씩 자동으로 보내도록 직접 메시지를 보낼 수 있습니다. .
두 번째 해결책:
우리는 "비동기 실행" 기술을 사용하여 코드를 실행하려고 합니다. 비동기 실행의 특징은 사용자가 실행 결과를 기다릴 필요가 없다는 것입니다. 비동기 실행 사용의 이점:
1. 단일 작업에 대한 애플리케이션 의존성을 제거합니다.
2. 프로그램의 실행 효율성을 향상합니다.
4. 특정 시나리오에서 사용자 경험을 개선합니다
5. PHP는 다중 스레딩을 지원하지 않기 때문에 프로그램의 병렬 실행 효과를 얻기 위해 비동기 호출을 사용합니다. 요청하면 시스템 오버헤드가 크게 증가합니다. 사용자 경험: 사용자 대기 - >전송 완료
그런 다음 이메일 전송 작업은 편지 전송을 별도로 처리하는 PHP 프로그램으로 전송됩니다. 사용자에게 "전송 완료"가 표시되면 편지가 전송됩니다. 아직 전송되지 않았습니다. 백그라운드에서 이메일 보내기 프로그램이 작동 중입니다. 하나씩 편지를 보냅니다.<?php $count=count($emailarr); for($i=0;$i<$count;$i ) { sendmail(.....);//发送邮件 } ?>
세 번째 방법:
1. 클라이언트에 반환된 HTML 코드에서 또는img 태그
를 포함하면 src는 실행되는 데 시간이 많이 걸리는 스크립트를 가리킵니다.이 방법이 가장 간단하고 빠릅니다. 서버는 호출을 할 필요가 없습니다.
그러나 단점은 일반적으로 Ajax가 onLoad 후에 트리거되어야 한다는 것입니다. 즉, 사용자가 페이지를 클릭한 다음 닫으면 백그라운드 스크립트가 트리거되지 않습니다.
status 열에는 항상 로드 중이라는 메시지가 표시됩니다. 물론 스크립트 태그 등 유사한 원리를 가진 다른 방법을 사용할 수도 있습니다.
네 번째 방법:
popen()
<?php $domain="www.***.com"; $url="/system_mail.php"; $par="email=".implode(',',$emailarr)."&........"; $header = "POST $url HTTP/1.0rn"; $header .= "Content-Type: application/x-www-form-urlencodedrn"; $header .= "Content-Length: " . strlen($par) . "rnrn"; $fp = @fsockopen ($domain, 80, $errno, $errstr, 30); fputs ($fp, $header . $par); fclose($fp); echo ''发送完毕'; ?> system_mail.php <?php ini_set("ignore_user_abort",true); ignore_user_abort(true);//此处的代码需要php.ini开启相关的选项,保证php执行不超时的,不明白,参考我的另一篇文章 “关闭浏览器后,php脚本会不会继续运行” //获取email地址,发信,此处为发信代码 ?>//주어진 명령 실행을 분기하여 생성된 프로세스를 가리키는 파이프를 엽니다. 주어진 명령을 생성한 명령을 실행하여 생성된 프로세스에 대한 파이프를 엽니다.
그래서 호출할 수 있지만 출력은 무시하세요.
resource popen ( string command, string mode );
이 방법은 첫 번째 방법의 단점을 피하고 속도도 빠릅니다. 하지만 문제는 이 메서드가 HTTP 프로토콜을 통해 다른 WebService를 요청할 수 없고 로컬 스크립트 파일만 실행할 수 있다는 것입니다. 그리고 한 방향으로만 열 수 있으며 호출된 스크립트에 많은 수의 매개변수를 전달할 수 없습니다.
그리고 방문 횟수가 매우 높을 경우 많은 수의 프로세스가 생성됩니다. 외부 리소스를 사용하는 경우 경쟁을 직접 고려해야 합니다.
5번째 방법:
이 방법은 CUROPT_TIMEOUT을 1로 설정합니다(최소값은 1, 우울함). 즉, 클라이언트는 최소 1초를 기다려야 합니다.
pclose(popen("/home/xinchen/backend.php &", 'r'));
fsockopen 사용
이 방법이 가장 완벽해야 하지만 단점은 HTTP 헤더 부분을 직접 작성해야 한다는 것입니다.
$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);
위의 6가지 메소드는 PHP의 다중 스레드 비동기 호출의 예입니다. 각 메소드는 자신의 필요에 따라 적합한 메소드를 선택할 수 있습니다.
관련 권장 사항;
PHP 멀티 스레드 시뮬레이션 구현의 세 가지 방법 소개
위 내용은 PHP에서 다중 스레드의 비동기 호출을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!