[함수] CURL 로 멀티 쓰레드 날리기
정리가 필요하지만 일단 급한대로 만들었습니다.
쓰레드는 $remote_url 을 기준으로 생성이 됩니다.
즉, remote_url 에 배열로 특정 url을 명시해주면
해당 URL 갯수만큼 $_files 와 $_array 를 $_type 방식으로 날려줍니다.
사용법 :
$_result = curl_msocket(
array('http://a.com/a.php',
'http://b.com/b.php') ,
array('file1' => 'aa.jpg',
'file2' => 'bb.jpg' ,
... 쭈욱~),
array('action' =>'upload',
...~쭈욱~),
"POST");
위의 예제코드로 설명하면 첫번째 URL 갯수만큼 쓰레드를 생성하며, file 설정 및 변수 설정이 있으면 해당 파일들과
변수들을 해당 URL로 전송해 줍니다.
결과 :
var_dump($_result);
--소스코드
/*
제작자 : 돌을든남자
설 명 : CURL 기반 병렬 소켓접속 처리.
사용법 : $_result = curl_msocket(array('http://a.com/a.php', 'http://b.com/b.php'), array('file1' => 'aa.jpg', 'file2' => 'bb.jpg'), array('action' =>'upload'), "POST")
결과 : var_dump($_result);
*/
function curl_msocket($remote_url, $_files, $_arrays, $_type = "POST"){
// 파일은 무조껀 POST 전송, 만약 배열타입이라면 다중파일이라 판단한다.
if($_files){
if(is_array($_files))
{
/* 멀티파일 업로드에 대하여 CURL 타입으로 변수를 재조합해 준다. */
foreach($_files as $_fKey => $_fVal)
{
/* 실제 전송할 파일이 존재할 경우만 처리함. */
if(file_exists($_fVal))
{
$postData[$_fKey]= "@".$_fVal;
} // end of if
} // end of foreach
} else {
if(file_exists($_fVal))
{
$postData['upfile']= "@".$_files;
} // end of if
} // end of else
} // 파일 변수가 존재하는지 확인함
// 변수 넘김 처리.
foreach($_arrays as $_pKey => $_pVal)
{
$postData[$_pKey] = $_pVal;
}
// 소켓 처리.
$_minit = curl_multi_init();
$_resource = array(); // 반환값 저장
/* foreach */
foreach($remote_url as $_mkey => $_url)
{
// CURL 세션을 초기화함.
${"init".$_mkey} = curl_init();
curl_setopt(${"init".$_mkey} , CURLOPT_HEADER , 0);
curl_setopt(${"init".$_mkey} , CURLOPT_USERAGENT , "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)");
curl_setopt(${"init".$_mkey} , CURLOPT_RETURNTRANSFER , 1); // 결과값 받을지 결정.
// curl_setopt(${"init".$_mkey} , CURLOPT_TIMEOUT , 10); // 타임아웃은 10 초로 설정 -- microtime 단위가 아님..
/* 타입에 따른 데이터 처리 */
switch(strtolower($_type))
{
case "post":
curl_setopt(${"init".$_mkey}, CURLOPT_POST , true);
curl_setopt(${"init".$_mkey}, CURLOPT_URL , $_url);
curl_setopt(${"init".$_mkey}, CURLOPT_POSTFIELDS , $postData);
break;
case "put":
curl_setopt(${"init".$_mkey}, CURLOPT_PUT , true);
curl_setopt(${"init".$_mkey}, CURLOPT_URL , $_url);
curl_setopt(${"init".$_mkey}, CURLOPT_POSTFIELDS , http_build_query($postData));
break;
case "get":
curl_setopt(${"init".$_mkey}, CURLOPT_URL , $_url."?".http_build_query($_arrays));
curl_setopt(${"init".$_mkey}, CURLOPT_HTTPGET, TRUE);
break;
case "delete":
curl_setopt(${"init".$_mkey}, CURLOPT_URL , $_url);
curl_setopt(${"init".$_mkey}, CURLOPT_POSTFIELDS , $postData);
curl_setopt(${"init".$_mkey}, CURLOPT_CUSTOMREQUEST , "DELETE");
break;
}
// HTTPS 또는 HTTP에 따른 처리
if(substr(strtolower($_url), 0, 5) == "https"){
curl_setopt(${"init".$_mkey}, CURLOPT_SSL_VERIFYPEER , FALSE);
curl_setopt(${"init".$_mkey}, CURLOPT_SSL_VERIFYHOST , 0);
// curl_setopt(${"init".$_mkey}, CURLOPT_SSLVERSION , 3); // SSL 버젼 (https 접속시에 필요)
}
curl_multi_add_handle($_minit , ${"init".$_mkey}); // CURL 핸들 넣기.
}
// 소켓 접속 실행.
$running = NULL; // 리턴값의 초기화
do {
usleep(1000000); // 1초..
curl_multi_exec($_minit, $running);
} while ($running > 0);
// 컨텐츠 펌질후 완료된 소켓은 종료함.
foreach($remote_url as $_mkey => $_url)
{
$_resource[$_mkey] = curl_multi_getcontent(${"init".$_mkey});
curl_multi_remove_handle($_minit , ${"init".$_mkey});
}
curl_multi_close($_minit); // 소켓종료..
return $_resource;
}
'개발-PHP' 카테고리의 다른 글
[함수] 이미지정보추출 (0) | 2016.03.30 |
---|---|
[함수] iconv 언어셋 옵션 //TRANSLIT , //IGNORE (0) | 2016.03.30 |
[함수] 다중(타)디비 컨넥 이용하기 (php클래스) (0) | 2016.03.30 |
[함수] EUC-KR 환경에서 유니코드 문자 손상 없이 (0) | 2016.03.30 |
[함수] 구글 번역 API를 이용한 파일 번역 php (0) | 2016.03.30 |