PHP 시 뮬 레이 션 POST 요청 의 curl 기본 사용
먼저 c URL 을 소개 하 겠 습 니 다.
cURL 은 HTTP 헤더 정보 에 따라 브 라 우 저 전송 데 이 터 를 모 의 합 니 다.FTP,FTPS,HTTP,HTTPS,DICT,FILE 등 프로 토 콜 을 지원 합 니 다.HTTPS 인증,HTTPPOST 방법,HTTPPUT 방법,FTP 업로드,HTTP 업로드,프 록 시 서버,cookies,사용자 이름/비밀번호 인증 등 기능 이 있 습 니 다.c URL 은 웹 페이지,POST 데이터 등 을 캡 처 하 는 기능 을 실현 하 는 이기 라 고 할 수 있다.
cURL 함 수 를 사용 하 는 것 은 주로 네 부분 으로 나 뉜 다.
1.c URL 을 초기 화 합 니 다.
2.cURL 변 수 를 설정 합 니 다.이것 은 cRUL 의 핵심 이 고 확장 기능 은 모두 이 단계 에 달 려 있 습 니 다.
3.cURL 을 실행 하여 결 과 를 가 져 옵 니 다.
4.연결 을 닫 고 자원 을 회수 합 니 다.
$ch = curl_init();//1
curl_setopt($ch, CURLOPT_URL, "http://localhost");//2
$output = curl_exec($ch);//3
curl_close($ch);//4
또한,우 리 는 curl 도 사용 할 수 있다.getinfo($ch)함수 가 curl 에서 실 행 된 정 보 를 가 져 옵 니 다.그 결 과 는 배열 입 니 다.$info 배열 의 내용 은 다음 과 같은 내용 을 포함 합 니 다.
다음은 curl 이 두 번 째 단 계 를 사용 할 때 자주 사용 하 는 변수 설정 을 상세 하 게 소개 합 니 다.curl 함 수 를 사용 할 때 다양한 수요 에 따라 설정 할 수 있 습 니 다.
기본 정보 설정:
curl_setopt($ch,CURLOPT_URL,$string);//curl 디 렉 터 리 주소 설정
curl_setopt($ch,CURLOPT_PORT,$port);//연결 포트 를 설정 합 니 다.기본 값 80 은 설정 하지 않 습 니 다.
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);//결과 흐름 을 되 돌려 줍 니 다.출력 이 후속 처 리 를 기다 리 는 것 이 아니 라 이 항목 을 설정 합 니 다.나중에 캡 처 한 정 보 를 직접 출력 하 는 것 이 아 닙 니 다.
POST 데이터 정보 설정:
curl_setopt($ch,CURLOPT_POST,1);//POST 로 전송 데이터 설정
curl_setopt($ch,CURLOPT_POSTFIELDS,$string);//전송 할 데이터 설정
인증 정보 설정:
curl_setopt($ch,CURLOPT_COOKIE,$string);//curl 실행 시 가지 고 있 는 쿠키 정보 설정
curl_setopt($ch,CURLOPT_USERAGENT,$string);//curl 시 뮬 레이 션 브 라 우 저 정보 설정
curl_setopt($ch,CURLOPT_REFERER,$string);//헤더 에 있 는 referer 를 설정 하면 도 난 방지 체인 을 풀 수 있 습 니 다.
curl_setopt($ch,CURLOPT_USERPWD,$string);//연결 에 필요 한 사용자 이름과 비밀 번 호 를 전달 합 니 다.형식 은"[username]:[password]"입 니 다.
curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);//서버 방향 변경 허용 설정
강화 정보 설정:
curl_setopt($ch,CURLOPT_NOBODY,1);//HTML 바디 출력 을 허용 하지 않 습 니 다.페이지 제목 등 정 보 를 캡 처 할 때 이 설정 을 사용 하면 속도 가 크게 빨 라 집 니 다.
curl_setopt($ch,CURLOPT_TIMEOUT,$int);//실행 가능 한 최 장 초(시간 초과)를 설정 합 니 다.설정 수치 가 작 을 때 CURL 은 실행 시간 이 긴 페이지 를 포기 합 니 다.
curl_setopt($ch,CURLOPT_HEADER,1);//대상 을 읽 을 때 발생 하 는 헤더 파일 을 출력 흐름 에 포함 시 킬 수 있 도록 설정 합 니 다.
cURL 일괄 처리 기능 의 기본 사용
물론 cURL 의 기능 은 여기에 그 치지 않 습 니 다.매 뉴 얼 에서 더 많은 변수 설정 을 찾 을 수 있 습 니 다.그리고 cURL 의 가장 강력 한 부분 은 일괄 처리 기능 입 니 다.
cURL 의 일괄 처리 도 이해 하기 쉬 운 것 같 습 니 다.다음은 일반적인 절차 입 니 다.
1.$mh=curl_multi_init();//일괄 처리 핸들 을 초기 화 합 니 다.
2.curl_multi_add_handle($mh,$ch);//일괄 처리 핸들 에 설 정 된$ch 핸들 을 추가 합 니 다.
3.curl_multi_exec($mh,$running);//$mh 핸들 을 실행 하고$mh 핸들 의 실행 상 태 를$running 변수 에 기록 합 니 다.
4.$running 이 true 일 때 curl 반복 실행multi_close()함수
5.순환 이 끝 난 후$mh 핸들 을 옮 겨 다 니 며 curlmulti_getcontent()첫 번 째 핸들 의 반환 값 가 져 오기
6.curl 로multi_remove_handle()에서$mh 의 핸들 을 제거 합 니 다.
7.curl 로multi_close()$mh 일괄 처리 핸들 을 닫 습 니 다.
코드 는 다음 과 같 습 니 다:
<?php
$chArr=[];
for($i=0;$i<50;$i++){
$chArr[$i]=curl_init("http://www.baidu.com");
curl_setopt($chArr[$i],CURLOPT_RETURNTRANSFER,1);
}
$mh = curl_multi_init(); //1
foreach($chArr as $k => $ch){
curl_multi_add_handle($mh,$ch); //2
}
$running = null;
do{
curl_multi_exec($mh,$running); //3
}while($running > 0); //4
foreach($chArr as $k => $ch){
$result[$k]= curl_multi_getcontent($ch); //5
curl_multi_remove_handle($mh,$ch);//6
}
curl_multi_close($mh); //7
?>
질문그러나 대량의 핸들 을 실행 할 때 우 리 는 매우 심각 한 문 제 를 발견 할 수 있다.그것 은 실행 할 때 시스템 CPU 의 점용 률 이 거의 100%이 고 거의 다운 상태 이다.그 이 유 는$running>0 에서 curl 을 수행 하기 때 문 입 니 다.multi_exec($mh,$running)전체 일괄 처리 핸들 이 모두 실행 되 지 않 았 을 때 시스템 은 curl 을 계속 실행 합 니 다.multi_exec()함수.우 리 는 실험 으로 증명 한다.
우 리 는 순환 중 curlmulti_exec($mh,$running)문장 앞 에 echo"a"를 추가 합 니 다.라 는 문구 가 적 혀 있다.우리 의 목적 은 바 이 두 에 대한 50 차례 의 방문 을 실행 한 후에 결 과 를 보 는 것 이다.
그림 에서 스크롤 바 의 크기(스크롤 바 가 최소 상태)를 보면 출력 a 의 개 수 를 대충 볼 수 있 고 500 개 도 그 치지 않 기 때문에 우 리 는 CPU 를 차지 하 는 원인 을 찾 을 수 있 습 니 다.
cURL 일괄 처리 시 메모리 최적화 방안
변경 하 는 방식 은 curl 함수 라 이브 러 리 의 curl 을 응용 하 는 것 입 니 다.multi_select()함수,그 함수 원형 은 다음 과 같 습 니 다.
intcurl_multi_select(resource$mh[,float$timeout=1.0])
cURL 일괄 처리 연결 에 활성 연결 이 있 을 때 까지 차단 합 니 다.성공 시 설명자 집합 에서 설명자 의 수 를 되 돌려 줍 니 다.실패 할 때 select 가 실 패 했 을 때-1 을 되 돌려 줍 니 다.그렇지 않 으 면 시간 초과(바 텀 selection 시스템 에서 호출)를 되 돌려 줍 니 다.
저 는 여러분 curlmulti_select()함 수 는 읽 을 프로그램 이 없 으 면 막 히 는 목적 을 달성 합 니 다.
우 리 는 일괄 처리 의 3,4 단계 에 대해 최적화 시 키 고 다 중 스 레 드 를 이용 하여 병행 절 차 를 모 의 한다.
많은 친구 들 이 매 뉴 얼 에 제 공 된 코드 에 대해 의문 을 가지 고 있 습 니 다.
$running = null;
do {
$mrc = curl_multi_exec($mh, $running);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
// $mh $ch , $mh $running, CURLM_CALL_MULTI_PERFORM , , , $ch , CURLM_OK, , 。
//$running true, $mh $ch ,$mrc==CURLM_OK, $ch 。
while ($running && $mrc == CURLM_OK) {
if (curl_multi_select($mh) != -1) {//$mh $ch ,curl_multi_select($mh) != -1 。
do { // $ch 。
$mrc = curl_multi_exec($mh, $running);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
}
이렇게 실행 하면$mh 일괄 처리 중$ch 핸들 이 데 이 터 를 읽 거나 기록 한 후($mrc==CURLMOK),curl 입장multi_select($mh)의 차단 단 계 는 전체$mh 일괄 처리 가 실 행 될 때 curl 을 계속 실행 하지 않 습 니 다.multi_exec,CPU 자원 낭비.cURL 일괄 처리 메모리 최적화 결과
전체 코드 는 다음 과 같 습 니 다:
<?php
$chArr=[];
for($i=0;$i<50;$i++){
$chArr[$i]=curl_init("http://www.baidu.com");
curl_setopt($chArr[$i],CURLOPT_RETURNTRANSFER,1);
}
$mh = curl_multi_init();
foreach($chArr as $k => $ch)
curl_multi_add_handle($mh,$ch);
$running = null;
do {
$mrc = curl_multi_exec($mh, $running);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
while ($running && $mrc == CURLM_OK) {
if (curl_multi_select($mh) != -1) {
do {
$mrc = curl_multi_exec($mh, $running);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
}
foreach($chArr as $k => $ch){
$result[$k]= curl_multi_getcontent($ch);
curl_multi_remove_handle($mh,$ch);
}
curl_multi_close($mh);
?>
우 리 는 다시$mrc=curlmulti_exec($mh,$running)문장 앞 에 echo"a"를 추가 합 니 다.결 과 는 다음 그림 과 같다.50 회 에 그 치지 않 았 지만 최적화 되 지 않 기 전보 다 CPU 사용률 이 크게 달 라 졌 다.
curl 함수 가 매우 강하 지만 우 리 는 다른 함 수 를 사용 하여 POST 요청 을 보 낼 기회 가 있 습 니 다.또한 더 밑 에서 curl 함 수 를 이해 할 수 있 기 때문에 본 집 은 다른 함수 에 도 많은 폭 을 사용 합 니 다.
이상 은 PHP 시 뮬 레이 션 으로 POST 요청 을 보 내 는 curl 의 기본 사용 에 대한 상세 한 내용 입 니 다.더 많은 PHP 시 뮬 레이 션 으로 POST 요청 을 보 내 는 curl 의 기본 사용 에 관 한 자 료 는 다른 관련 글 을 주목 하 시기 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Laravel - 변환된 유효성 검사 규칙으로 API 요청 제공동적 콘텐츠를 위해 API를 통해 Laravel CMS에 연결하는 모바일 앱(또는 웹사이트) 구축을 고려하십시오. 이제 앱은 CMS에서 번역된 콘텐츠를 받을 것으로 예상되는 다국어 앱이 될 수 있습니다. 일반적으로 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.