원격 콘텐츠를 캡쳐하기 위해 예전부터 file_get_content 함수를 사용해왔는데 사실 컬이라는 좋은 기능이 있다는 건 알고 있었는데, 살펴보니 사용법이 꽤 복잡하다는 걸 느꼈습니다. file_get_content만큼 간단하지 않으며 요구 사항도 크지 않으므로 컬 사용 방법을 배울 필요가 없습니다.
최근까지 웹 도둑 프로그램을 만들려고 할 때 file_get_content가 더 이상 요구 사항을 충족할 수 없다는 것을 발견했습니다. 원격 콘텐츠를 읽을 때 file_get_content가 컬보다 사용하기 편리한 점을 제외하면 컬만큼 좋지는 않다고 생각합니다.
PHP의 컬과 file_get_content 간의 비교
주요 차이점:
공부한 후에 컬이 FTP, FTPS, HTTP, HTTPS, GOPHER를 포함한 많은 프로토콜을 지원한다는 것을 발견했습니다. , TELNET , DICT, FILE 및 LDAP, 즉 file_get_content가 할 수 없는 많은 작업을 수행할 수 있습니다. Curl은 PHP에서 콘텐츠를 원격으로 획득하고 수집할 수 있으며, PHP 웹 버전의 FTP 업로드 및 다운로드를 구현하고, 인터페이스 도킹(API)을 구현하고, 시뮬레이션된 쿠키를 구현합니다. 기능은 매우 강력합니다.
curl의 몇 가지 기본적인 사용법을 이해한 후에는 설정 매개변수 중 일부를 기억하는 것이 어렵지 않다는 것을 알았습니다. 하지만 일반적으로 사용되는 몇 가지 매개변수만 기억하면 됩니다.
컬 활성화:
PHP는 기본적으로 컬 기능을 지원하지 않기 때문에 컬을 사용하려면 먼저 php.ini에서 이 기능, 즉 제거를 활성화해야 합니다. 확장명= php_curl.dll 앞에 세미콜론을 입력한 다음 apache/iis를 저장하고 다시 시작하세요.
기본 구문:
$my_curl = curl_init(); //初始化一个curl对象 curl_setopt($my_curl, CURLOPT_URL, "http://www.jb51.net"); //设置你需要抓取的URL curl_setopt($my_curl,CURLOPT_RETURNTRANSFER,1); //设置是将结果保存到字符串中还是输出到屏幕上,1表示将结果保存到字符串 $str = curl_exec($curl); //执行请求 echo $str; //输出抓取的结果 curl_close($curl); //关闭url请求
최근에 다른 사람의 웹사이트에서 음악 데이터를 가져와야 합니다. file_get_contents 함수를 사용했는데, 매뉴얼의 예시에 따라 시간 초과를 설정했지만 대부분 작동하지 않았습니다.
$config[ 'context'] = stream_context_create(array ('http' => array('method' => "GET",
'timeout' => 5//이 시간 제한은 불안정하며 종종 작동하지 않습니다
)
));
이때, 서버의 커넥션 풀을 보면 비슷한 오류가 많이 발견되는데, 머리가 아프네요:
file_get_contents(http:/ /***): 스트림을 열지 못했습니다…
이제 컬 라이브러리를 사용하고 함수 대체를 작성합니다:
function cur_file_get_contents($durl){
$ch = cur_init();
curl_setopt($ch, CURLOPT_URL, $durl) ;
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
curl_setopt($ch, CURLOPT_USERAGENT, _USERAGENT_);
curl_setopt($ch, CURLOPT_REFERER,_REFERER_ );
curl_setopt($ch, CURLOPT_RETUR NTRANSFER, 1);
$r = curl_exec($ch);
curl_close($ch);
return $r;
}
그래서 실제 네트워크 문제 외에는 더 이상 문제가 없습니다.
curl 및 file_get_contents에 대해 다른 사람들이 수행한 테스트입니다.
file_get_contents가 google.com을 크롤링하는 데 걸리는 시간(초):
2.31319094
2.30374217
2.21512604
3.30553889
2.30124092
curl에 사용되는 시간:
0.68719101
0.64675593
0.64326
0.81983113
0.639 56594
틈이 큰가요? ? 하하, 제 경험상 이 두 도구는 속도뿐 아니라 안정성에서도 다릅니다.
네트워크 데이터 캡처의 안정성에 대한 요구 사항이 높은 친구는 위의 cur_file_get_contents 기능을 사용하는 것이 좋습니다. 안정적이고 빠를 뿐만 아니라 브라우저를 위조하여 대상 주소를 스푸핑할 수도 있습니다!
방법 1: file_get_contents를 사용하여 get 메소드에서 콘텐츠 가져오기
<?php $url='http://www.domain.com/'; $html = file_get_contents($url); echo $html; ?>
방법 2: fopen으로 URL을 열고 get 메소드에서 콘텐츠 가져오기
<?php $fp = fopen($url, 'r'); stream_get_meta_data($fp); while(!feof($fp)) { $result .= fgets($fp, 1024); } echo "url body: $result"; fclose($fp); ?>
방법 3: post 모드에서 file_get_contents 함수를 사용하여 URL 가져오기
<?php $data = array ('foo' => 'bar'); $data = http_build_query($data); $opts = array ( 'http' => array ( 'method' => 'POST', 'header'=> "Content-type: application/x-www-form-urlencodedrn" . "Content-Length: " . strlen($data) . "rn", 'content' => $data ) ); $context = stream_context_create($opts); $html = file_get_contents('http://localhost/e/admin/test.html', false, $context); echo $html; ?>
방법 4: fsockopen 함수를 사용하여 URL을 열고 get 모드에서 헤더 및 본문을 포함한 전체 데이터 가져오기
<?php function get_url ($url,$cookie=false) { $url = parse_url($url); $query = $url[path]."?".$url[query]; echo "Query:".$query; $fp = fsockopen( $url[host], $url[port]?$url[port]:80 , $errno, $errstr, 30); if (!$fp) { return false; } else { $request = "GET $query HTTP/1.1rn"; $request .= "Host: $url[host]rn"; $request .= "Connection: Closern"; if($cookie) $request.="Cookie: $cookien"; $request.="rn"; fwrite($fp,$request); while()) { $result .= @fgets($fp, 1024); } fclose($fp); return $result; } } //获取url的html部分,去掉header function GetUrlHTML($url,$cookie=false) { $rowdata = get_url($url,$cookie); if($rowdata) { $body= stristr($rowdata,"rnrn"); $body=substr($body,4,strlen($body)); return $body; } return false; } ?>
방법 5: fsockopen 함수를 사용하여 URL을 열고 POST 모드에서 헤더와 본문을 포함한 전체 데이터를 가져옵니다.
<?php function HTTP_Post($URL,$data,$cookie, $referrer="") { // parsing the given URL $URL_Info=parse_url($URL); // Building referrer if($referrer=="") // if not given use this script as referrer $referrer="111″; // making string from $data foreach($data as $key=>$value) $values[]="$key=".urlencode($value); $data_string=implode("&",$values); // Find out which port is needed – if not given use standard (=80) if(!isset($URL_Info["port"])) $URL_Info["port"]=80; // building POST-request: $request.="POST ".$URL_Info["path"]." HTTP/1.1n"; $request.="Host: ".$URL_Info["host"]."n"; $request.="Referer: $referern"; $request.="Content-type: application/x-www-form-urlencodedn"; $request.="Content-length: ".strlen($data_string)."n"; $request.="Connection: closen"; $request.="Cookie: $cookien"; $request.="n"; $request.=$data_string."n"; $fp = fsockopen($URL_Info["host"],$URL_Info["port"]); fputs($fp, $request); while(!feof($fp)) { $result .= fgets($fp, 1024); } fclose($fp); return $result; } ?>
방법 6: 컬 라이브러리를 사용합니다. 컬 라이브러리를 사용하기 전에 php.ini가 열렸는지 확인해야 할 수도 있습니다. 컬 확장
<?php $ch = curl_init(); $timeout = 5; curl_setopt ($ch, CURLOPT_URL, 'http://www.domain.com/'); curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout); $file_contents = curl_exec($ch); curl_close($ch); echo $file_contents; ?>
php의 세 가지 컬, fsockopen 및 file_get_contents 기능을 사용하면 시뮬레이션된 음성 수집을 실현할 수 있습니다. . 세 가지의 차이점이나 특별한 점이 있나요?
조용빈:
때때로 file_get_contents()를 사용하여 외부 파일을 호출할 때 시간이 지남에 따라 오류를 보고하기 쉽습니다. 그냥 컬로 변경하세요. 구체적인 이유는 확실하지 않습니다
curl은 file_get_contents() 및 fsockopen()보다 효율적입니다. 왜냐하면 CURL이 자동으로 DNS 정보를 캐시하기 때문입니다(강요점은 제가 개인적으로 테스트한다는 것입니다)
Fan Jiapeng:
file_get_contents 컬 fsockopen
현재 요청된 환경에서 선택 작업, 일반화 없음:
당사에서 개발한 KBI 애플리케이션 기반:
초기: file_get_contents
나중에 채택: fsockopen
최종 채택: 컬
(远程)我个人理解到的表述如下(不对请指出,不到位请补充)
file_get_contents 需要php.ini里开启allow_url_fopen,请求http时,使用的是http_fopen_wrapper,不会keeplive.curl是可以的。
file_get_contents()单个执行效率高,返回没有头的信息。
这个是读取一般文件的时候并没有什么问题,但是在读取远程问题的时候就会出现问题。
如果是要打一个持续连接,多次请求多个页面。那么file_get_contents和fopen就会出问题。
取得的内容也可能会不对。所以做一些类似采集工作的时候,肯定就有问题了。
sock较底层,配置麻烦,不易操作。 返回完整信息。
潘少宁-腾讯:
file_get_contents 虽然可以获得某URL的内容,但不能post get啊。
curl 则可以post和get啊。还可以获得head信息
而socket则更底层。可以设置基于UDP或是TCP协议去交互
file_get_contents 和 curl 能干的,socket都能干。
socket能干的,curl 就不一定能干了
file_get_contents 更多的时候 只是去拉取数据。效率比较高 也比较简单。
赵的情况这个我也遇到过,我通过CURL设置host 就OK了。 这和网络环境有关系
<?php /** * Socket版本 * 使用方法: * $post_string = "app=socket&version=beta"; * request_by_socket('jb51.net','/restServer.php',$post_string); */ function request_by_socket($remote_server,$remote_path,$post_string,$port = 80,$timeout = 30){ $socket = fsockopen($remote_server,$port,$errno,$errstr,$timeout); if (!$socket) die("$errstr($errno)"); fwrite($socket,"POST $remote_path HTTP/1.0"); fwrite($socket,"User-Agent: Socket Example"); fwrite($socket,"HOST: $remote_server"); fwrite($socket,"Content-type: application/x-www-form-urlencoded"); fwrite($socket,"Content-length: ".strlen($post_string)+8.""); fwrite($socket,"Accept:*/*"); fwrite($socket,""); fwrite($socket,"mypost=$post_string"); fwrite($socket,""); $header = ""; while ($str = trim(fgets($socket,4096))) { $header.=$str; } $data = ""; while (!feof($socket)) { $data .= fgets($socket,4096); } return $data; } /** * Curl版本 * 使用方法: * $post_string = "app=request&version=beta"; * request_by_curl('http://jb51.net/restServer.php',$post_string); */ function request_by_curl($remote_server,$post_string){ $ch = curl_init(); curl_setopt($ch,CURLOPT_URL,$remote_server); curl_setopt($ch,CURLOPT_POSTFIELDS,'mypost='.$post_string); curl_setopt($ch,CURLOPT_RETURNTRANSFER,true); curl_setopt($ch,CURLOPT_USERAGENT,"Jimmy's CURL Example beta"); $data = curl_exec($ch); curl_close($ch); return $data; } /** * 其它版本 * 使用方法: * $post_string = "app=request&version=beta"; * request_by_other('http://jb51.net/restServer.php',$post_string); */ function request_by_other($remote_server,$post_string){ $context = array( 'http'=>array( 'method'=>'POST', 'header'=>'Content-type: application/x-www-form-urlencoded'."". 'User-Agent : Jimmy's POST Example beta'."". 'Content-length: '.strlen($post_string)+8, 'content'=>'mypost='.$post_string) ); $stream_context = stream_context_create($context); $data = file_get_contents($remote_server,FALSE,$stream_context); return $data; } ?>
更多php中使用Curl、socket、file_get_contents三种方法POST提交数据相关文章请关注PHP中文网!