> php教程 > PHP开发 > 본문

POST에서 Curl, 소켓, file_get_contents 세 가지 메소드를 사용하여 데이터 제출

高洛峰
풀어 주다: 2016-12-23 15:16:27
원래의
1601명이 탐색했습니다.

원격 콘텐츠를 캡쳐하기 위해 예전부터 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=&#39;http://www.domain.com/&#39;;
$html = file_get_contents($url);
echo $html;
?>
로그인 후 복사

방법 2: fopen으로 URL을 열고 get 메소드에서 콘텐츠 가져오기

<?php
$fp = fopen($url, &#39;r&#39;);
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 (&#39;foo&#39; => &#39;bar&#39;);
$data = http_build_query($data);
$opts = array (
&#39;http&#39; => array (
&#39;method&#39; => &#39;POST&#39;,
&#39;header&#39;=> "Content-type: application/x-www-form-urlencodedrn" .
"Content-Length: " . strlen($data) . "rn",
&#39;content&#39; => $data
)
);
$context = stream_context_create($opts);
$html = file_get_contents(&#39;http://localhost/e/admin/test.html&#39;, 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, &#39;http://www.domain.com/&#39;);
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(&#39;jb51.net&#39;,&#39;/restServer.php&#39;,$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(&#39;http://jb51.net/restServer.php&#39;,$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,&#39;mypost=&#39;.$post_string); 
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true); 
curl_setopt($ch,CURLOPT_USERAGENT,"Jimmy&#39;s CURL Example beta"); 
$data = curl_exec($ch); 
curl_close($ch); 
return $data; 
} 
/** 
* 其它版本 
* 使用方法: 
* $post_string = "app=request&version=beta"; 
* request_by_other(&#39;http://jb51.net/restServer.php&#39;,$post_string); 
*/ 
function request_by_other($remote_server,$post_string){ 
$context = array( 
&#39;http&#39;=>array( 
&#39;method&#39;=>&#39;POST&#39;, 
&#39;header&#39;=>&#39;Content-type: application/x-www-form-urlencoded&#39;."". 
&#39;User-Agent : Jimmy&#39;s POST Example beta&#39;."". 
&#39;Content-length: &#39;.strlen($post_string)+8, 
&#39;content&#39;=>&#39;mypost=&#39;.$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中文网!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 추천
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿