'프로그래밍.../PHP'에 해당되는 글 1

  1. 2009.12.28 cURL 이란??? (PHP)
프로그래밍.../PHP | Posted by 고기킬러 2009. 12. 28. 13:52

cURL 이란??? (PHP)

차례
1. cURL이란?
2. cURL의 장점
3. cURL의 함수 설명
4. 기초사용법
5. 옵션 설명
6. cURL의 활용




1. cURL이란?

- cURL = Client URL
- cURL은 아래와 같은 프로토콜 등에 의해 전송되는 파일들을 위한 command line tool이다.
   FTP, FTPS, HTTP, HTTPS, SCP, SFTP, TFTP, TELNET, DICT, LDAP, LDAPS, FILE
-  SSL, HTTP POST, HTTP PUT, FTP uploading, HTTP form기반의 upload, proxies, cookies, user+password인증도 제공한다.
- cURL은 무료이며, 많은 운영체제에서 컴파일되고 동작하는 open software이다.
- command line tool을 이용하거나
- libCURL을 이용할 수 있다.

아래는 원문이다.
 curl is a command line tool for transferring files with URL syntax, supporting FTP, FTPS, HTTP, HTTPS, SCP, SFTP, TFTP, TELNET, DICT, LDAP, LDAPS and FILE. curl supports SSL certificates, HTTP POST, HTTP PUT, FTP uploading, HTTP form based upload, proxies, cookies, user+password authentication (Basic, Digest, NTLM, Negotiate, kerberos...), file transfer resume, proxy tunneling and a busload of other useful tricks.

Curl is free and open software that compiles and runs under a wide variety of operating systems.

 Use the cURL command line tool or use libcurl from within your own programs.

[what can curl do]의 내용을 참조하기 바란다.(http://curl.haxx.se/docs/features.html)


2. cURL의 장점
- cURL의 PHP설정의 allow_url_fopen옵션과 상관 없이 작동한다.
- Proxy, Cookie, Header등을 손쉽게 세팅할 수 있다.
- 다양한 프로토콜의 사용이 가능하여 개발의 범위가 넓다.
- 핸들러 하나로 여러개의 접속을 할 수 있기 때문에 코딩을 단순화 할 수 있다.

3. cURL의 함수 설명
 
-curl_close —URL handle  을 닫습니다.
-curl_copy_handlecURL handle 을 속성채로 복사합니다.
-curl_errno에러번호를 리턴합니다.
-curl_error  에러메세지를 리턴합니다.
-curl_exec  설정된옵션으로 실행합니다.
-curl_getinfo통신의 정보를 표시합니다.
-curl_initcURL handle 을 생성합니다.
-curl_multi_add_handle  handle  배열에 cURL handle  을 추가합니다
-curl_multi_closecURL handle 배열 전체를 닫습니다.
-curl_multi_exec  여러 개의 설정된옵션으로 실행합니다.
-curl_multi_getcontent  통신결과 컨텐츠를 표시합니다.
-curl_multi_info_read통신 정보들을 표시합니다.
-curl_multi_init여러 개의 handle 을 생성합니다.
-curl_multi_remove_handle여러 개의 handle  을 삭제합니다.
-curl_multi_select  여러 개의 handle  중 사용할 handle  을 선택합니다.
-curl_setopt_array옵션을 배열로 한번에 설정합니다.
-curl_setopt한가지의 옵션을 설정합니다.
-curl_version  cURL의 버젼정보를 가져옵니다.


4. 기초사용법

<?php
//핸들을 생성한다.
$ch = curl_init();


//URL을 설정한다.
curl_setopt($ch, CURLOPT_URL, http://www.naver.com/);

//실행한다.
$html = curl_exec($ch);

//핸들을 닫는다.
curl_close($ch);
?>


5. 옵션 설명

옵션 설명을 시작하기 전에...

sample.php
<?
if($a != "x")
header("Location:sample.php?a=x");
else{
?>
<pre>
webTech입니다.
<? print_r($_SERVER); ?>
<? print_r($_COOKIE); ?>
</pre>
<?
}
?>


출력 결과(IE)
webTech입니다.
Array
(
    [HTTP_ACCEPT] => image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */*
    [HTTP_ACCEPT_LANGUAGE] => ko
    [HTTP_ACCEPT_ENCODING] => gzip, deflate
    [HTTP_USER_AGENT] => Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; GTB6; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; InfoPath.2; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
    [HTTP_HOST] => 192.168.0.43
    [HTTP_CONNECTION] => Keep-Alive
    [PATH] => /usr/local/bin:/usr/bin:/bin
    [SERVER_SIGNATURE] => 
Apache/2.2.11 (Ubuntu) PHP/5.2.6-3ubuntu4.2 with Suhosin-Patch Server at 192.168.0.43 Port 80
[SERVER_SOFTWARE] => Apache/2.2.11 (Ubuntu) PHP/5.2.6-3ubuntu4.2 with Suhosin-Patch [SERVER_NAME] => 192.168.0.43 [SERVER_ADDR] => 192.168.0.43 [SERVER_PORT] => 80 [REMOTE_ADDR] => 192.168.0.59 [DOCUMENT_ROOT] => /var/www/web_index [SERVER_ADMIN] => webmaster@localhost [SCRIPT_FILENAME] => /home/bridge/public_html/sample.php [REMOTE_PORT] => 5576 [GATEWAY_INTERFACE] => CGI/1.1 [SERVER_PROTOCOL] => HTTP/1.1 [REQUEST_METHOD] => GET [QUERY_STRING] => a=x [REQUEST_URI] => /~bridge/sample.php?a=x [SCRIPT_NAME] => /~bridge/sample.php [PHP_SELF] => /~bridge/sample.php [REQUEST_TIME] => 1257858849 [argv] => Array ( [0] => a=x ) [argc] => 1 ) Array ( )
5.1 CURLOPT_FOLLOWLOCATION
 
CURLOPT_FOLLOWLOCATION의 값을 TRUE로 설정하면 서버가 HTTP 헤더로 보내는 "Location :"헤더의 내용을 추한다. (이것은 반복적으로 수행됩니다. CURLOPT_MAXREDIRS가 지정되지 않은 경우, 보내는 "Location : "헤더의 내용을 계속 추적 함에 주의해야 한다.)

sample2.php
echo("기본형");
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, http://localhost/sample.php);
$html = curl_exec($ch);


echo("return " . $html);

curl_close($ch);

결과
기본형
return 1

위의 소스는 sample.php의 소스에서 [sample.php?a=x]로 이동하라고 되어 있지만, 이동하지 않는 다는 것을 알 수 있다.

그럼 CURLOPT_FOLLOWLOCATION옵션을 TRUE로 설정 해보면...

sample3.php
echo("CURLOPT_FOLLOWLOCATION 옵션 예제");
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, http://localhost/sample.php);
curl_seropt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
$html = curl_exec($ch);


echo("return " . $html);

curl_close($ch);

결과
CURLOPT_FOLLOWLOCATION 옵션 예제
webTech입니다.
Array
(
    [HTTP_ACCEPT] => image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */*
    [HTTP_ACCEPT_LANGUAGE] => ko
    [HTTP_ACCEPT_ENCODING] => gzip, deflate
    [HTTP_USER_AGENT] => Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; GTB6; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; InfoPath.2; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
    [HTTP_HOST] => 192.168.0.43
    [HTTP_CONNECTION] => Keep-Alive
    [PATH] => /usr/local/bin:/usr/bin:/bin
    [SERVER_SIGNATURE] => 
Apache/2.2.11 (Ubuntu) PHP/5.2.6-3ubuntu4.2 with Suhosin-Patch Server at 192.168.0.43 Port 80
[SERVER_SOFTWARE] => Apache/2.2.11 (Ubuntu) PHP/5.2.6-3ubuntu4.2 with Suhosin-Patch [SERVER_NAME] => 192.168.0.43 [SERVER_ADDR] => 192.168.0.43 [SERVER_PORT] => 80 [REMOTE_ADDR] => 192.168.0.59 [DOCUMENT_ROOT] => /var/www/web_index [SERVER_ADMIN] => webmaster@localhost [SCRIPT_FILENAME] => /home/bridge/public_html/sample.php [REMOTE_PORT] => 5576 [GATEWAY_INTERFACE] => CGI/1.1 [SERVER_PROTOCOL] => HTTP/1.1 [REQUEST_METHOD] => GET [QUERY_STRING] => a=x [REQUEST_URI] => /~bridge/sample.php?a=x [SCRIPT_NAME] => /~bridge/sample.php [PHP_SELF] => /~bridge/sample.php [REQUEST_TIME] => 1257858849 [argv] => Array ( [0] => a=x ) [argc] => 1 ) Array ( )

return 1

위에 보는 것 처럼 [sample.php?a=x]로 이동한 것을 알 수 있다.

5.2 CURLOPT_AUTOREFERER
 CURLOPT_AUTOREFERER의 값을 TRUE로 설정하면, LOCATION: 리디렉션을 따라갈 때 자동으로 Referer:필드를 요청에 추가 한다.




[출처] 웹테크 - http://webtech.tistory.com