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]);//
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Laravel - 변환된 유효성 검사 규칙으로 API 요청 제공동적 콘텐츠를 위해 API를 통해 Laravel CMS에 연결하는 모바일 앱(또는 웹사이트) 구축을 고려하십시오. 이제 앱은 CMS에서 번역된 콘텐츠를 받을 것으로 예상되는 다국어 앱이 될 수 있습니다. 일반적으로 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.