PHP 비동기 실행 에 대한 자세 한 설명

5233 단어 php비동기 실행
웹 서버 에서 PHP 스 크 립 트 를 실행 합 니 다.실행 결 과 를 되 돌려 주 는 데 시간 이 오래 걸 릴 때 도 있 습 니 다.뒤의 스 크 립 트 는 오래 기 다 려 야 계속 실 행 될 수 있 습 니 다.실행 결 과 를 기다 리 지 않 고 스 크 립 트 만 간단하게 실행 하려 면 다음 작업 을 수행 하 십시오.fscokopen 함 수 를 통 해 이 루어 질 수 있 습 니 다.PHP 는 socket 프로 그래 밍 을 지원 합 니 다.fscokopen 함 수 는 원 격 호스트 로 연 결 된 핸들 을 되 돌려 줍 니 다.fopen 으로 되 돌아 오 는 핸들 처럼 fwrite,fgets,fread 등 을 할 수 있 습 니 다.fsockopen 을 사용 하여 로 컬 서버 에 연결 하고 스 크 립 트 실행 을 촉발 한 후 즉시 돌아 갑 니 다.스 크 립 트 실행 이 완료 되 기 를 기다 리 지 않 으 면 비동기 실행 PHP 효 과 를 실현 할 수 있 습 니 다.예제 코드 는 다음 과 같 습 니 다.

<?
function triggerRequest($url, $post_data = array(), $cookie = array()){
        $method = "GET";  // POST GET
        $url_array = parse_url($url); // URL
        $port = isset($url_array['port'])? $url_array['port'] : 80; 
        $fp = fsockopen($url_array['host'], $port, $errno, $errstr, 30);
        if (!$fp) {
                return FALSE;
        }
        $getPath = $url_array['path'] ."?". $url_array['query'];
        if(!empty($post_data)){
                $method = "POST";
        }
        $header = $method . " " . $getPath;
        $header .= " HTTP/1.1\r
";
        $header .= "Host: ". $url_array['host'] . "\r
"; //HTTP 1.1 Host
        /*
        $header .= "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13 \r
";
        $header .= "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,q=0.5 \r
";
        $header .= "Accept-Language: en-us,en;q=0.5 ";
        $header .= "Accept-Encoding: gzip,deflate\r
";
         */
        $header .= "Connection:Close\r
";
        if(!empty($cookie)){
                $_cookie = strval(NULL);
                foreach($cookie as $k => $v){
                        $_cookie .= $k."=".$v."; ";
                }
                $cookie_str =  "Cookie: " . base64_encode($_cookie) ." \r
"; // Cookie
                $header .= $cookie_str;
        }
        if(!empty($post_data)){
                $_post = strval(NULL);
                foreach($post_data as $k => $v){
                        $_post .= $k."=".$v."&";
                }
                $post_str  = "Content-Type: application/x-www-form-urlencoded\r
";
                $post_str .= "Content-Length: ". strlen($_post) ." \r
"; //POST
                $post_str .= $_post."\r
\r
"; // POST
                $header .= $post_str;
        }
        fwrite($fp, $header);
        //echo fread($fp, 1024); //
        fclose($fp);
        return true;
}  
이렇게 하면 fsockopen()함 수 를 통 해 PHP 스 크 립 트 의 실행 을 촉발 한 후에 함수 가 돌아 올 수 있 습 니 다.이어서 다음 조작 을 집행 했다.현재 문제 가 있 습 니 다.클 라 이언 트 가 연결 을 끊 으 면 triggerRequest 가 요청 을 보 낸 후 바로 연결 을 닫 으 면 서버 에서 실행 중인 스 크 립 트 가 종 료 될 수 있 습 니 다.PHP 내부 에서 시스템 이 연결 상 태 를 유지 하고 있 습 니 다.그 상 태 는 세 가지 가능 한 상황 이 있 습 니 다.*0 C NORMAL(정상)*1 C ABORTED(이상 종료)*2 C TIMEOUT(시간 초과)PHP 스 크 립 트 가 정상적으로 NORMAL 상 태 를 실행 할 때 연결 이 유효 합 니 다.클 라 이언 트 가 연결 을 중단 하면 ABORTED 상태의 태그 가 열 립 니 다.원 격 클 라 이언 트 연결 의 중단 은 보통 사용자 가 STOP 단 추 를 누 르 면 발생 합 니 다.연결 시간 이 PHP 시한 을 초과 하면(set 참조)time_limit()함수 일 때 TIMEOUT 상태의 태그 가 열 립 니 다.클 라 이언 트 가 연결 을 중단 할 때 스 크 립 트 를 종료 할 지 여 부 를 결정 할 수 있 습 니 다.원 격 브 라 우 저가 스 크 립 트 의 출력 을 받 아들 이지 않 아 도 스 크 립 트 를 완전 하 게 실행 하 는 데 많은 편 의 를 가 져 올 때 가 있 습 니 다.기본 적 인 상황 은 원 격 클 라 이언 트 연결 이 끊 겼 을 때 스 크 립 트 가 종 료 됩 니 다.이 처리 과정 은 php.ini 의 ignoreuser_abort 또는 Apache.conf 설정 에 대응 하 는"phpvalue ignore_user_abort"및 ignoreuser_abort()함수 로 제어 합 니 다.PHP 에 사용자 의 중단 을 무시 하 라 고 말 하지 않 으 면 스 크 립 트 가 중 단 됩 니 다.register 를 통과 하지 않 는 한.shutdown_function()에서 닫 기 트리거 함 수 를 설정 하 였 습 니 다.이 닫 기 트리거 함 수 를 통 해 원 격 사용자 가 STOP 단 추 를 누 르 면 스 크 립 트 가 다시 데 이 터 를 출력 하려 고 시도 할 때 PHP 는 연결 이 중단 되 었 음 을 감지 하고 닫 기 트리거 함 수 를 호출 합 니 다.스 크 립 트 도 내 장 된 스 크 립 트 타이머 에 의 해 중 단 될 수 있 습 니 다.기본 시간 제한 은 30 초 입 니 다.이 값 은 php.ini 의 max 를 설정 할 수 있 습 니 다.execution_time 또는 Apache.conf 설정 에 대응 하 는"phpvalue max_execution_time"인자 또는 settime_limit()함수 로 변경 합 니 다.카운터 가 시간 을 초과 할 때 스 크 립 트 는 상기 연결 이 끊 긴 것 과 유사 하 게 종 료 됩 니 다.이전에 등 록 된 닫 기 트리거 함수 도 이 때 실 행 됩 니 다.이 닫 기 트리거 함수 에서 connection 을 호출 할 수 있 습 니 다.status()함수 가 시간 초과 로 인해 트리거 함수 가 호출 되 었 는 지 확인 합 니 다.시간 이 초과 되 어 트리거 함수 호출 을 닫 으 면 이 함 수 는 2 로 돌아 갑 니 다.주의해 야 할 점 은 ABORTED 와 TIMEOUT 상태 가 동시에 유효 하 다 는 점 이다.이것 은 PHP 가 사용자 의 종료 동작 을 무시 할 때 가능 하 다 고 알려 줍 니 다.PHP 는 사용자 가 연결 을 중 단 했 지만 스 크 립 트 가 실행 중인 경우 에 도 주의 할 것 입 니 다.실행 시간 제한 이 되면 스 크 립 트 가 종료 되 고 설 정 된 닫 기 트리거 함수 도 실 행 됩 니 다.이 럴 때 함수 connectionstatus()를 3 으로 되 돌려 줍 니 다.그래서 실행 할 스 크 립 트 에서 가리 키 기:

<?
    ignore_user_abort(TRUE);// , abort
   set_time_limit(0);//
   :
<?
    register_shutdown_function(callback fuction[, parameters]);//

좋은 웹페이지 즐겨찾기