Heim > php教程 > PHP开发 > Verwenden Sie die drei Methoden Curl, Socket und file_get_contents im POST, um Daten zu übermitteln

Verwenden Sie die drei Methoden Curl, Socket und file_get_contents im POST, um Daten zu übermitteln

高洛峰
Freigeben: 2016-12-23 15:16:27
Original
1618 Leute haben es durchsucht

Um Remote-Inhalte zu erfassen, habe ich die Funktion file_get_content bereits verwendet. Ich wusste zwar, dass es so etwas Gutes wie Curl gibt, aber nachdem ich einen Blick darauf geworfen habe, habe ich das Gefühl, dass seine Verwendung ziemlich kompliziert ist ist nicht so einfach wie file_get_content und es gibt keine großen Anforderungen, daher muss man nicht lernen, wie man Curl verwendet.
Bis vor kurzem, als ich versuchte, ein Web-Diebstahlprogramm zu erstellen, stellte ich fest, dass file_get_content die Anforderungen überhaupt nicht erfüllen konnte. Ich denke, dass file_get_content beim Lesen von Remote-Inhalten zwar bequemer zu verwenden ist als Curl, aber nicht so gut wie Curl.

Einige Vergleiche zwischen Curl und file_get_content in PHP

Hauptunterschiede:

Nach dem Studium habe ich herausgefunden, dass Curl viele Protokolle unterstützt, darunter FTP, FTPS, HTTP, HTTPS, GOPHER , TELNET, DICT, FILE und LDAP, das heißt, es kann viele Dinge tun, die file_get_content nicht kann. Curl kann eine Remote-Erfassung und -Sammlung der PHP-Webversion implementieren; eine simulierte Anmeldung (API) implementieren, eine simulierte Übertragung von Cookies implementieren; Die Funktion ist sehr mächtig.

Nachdem ich einige grundlegende Anwendungen von Curl verstanden hatte, stellte ich fest, dass es nicht schwierig ist, sich einige der Einstellungsparameter zu merken, aber wir können uns nur an einige häufig verwendete erinnern.

Curl aktivieren:

Da PHP die Curl-Funktion standardmäßig nicht unterstützt, müssen Sie diese Funktion zunächst in php.ini aktivieren, d. h. entfernen, wenn Sie Curl verwenden möchten. extension= php_curl. Das Semikolon vor der DLL, dann speichern und Apache/iis neu starten.

Grundsätzliche Syntax:

$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请求
Nach dem Login kopieren

In letzter Zeit muss ich Musikdaten von den Websites anderer Leute abrufen. Ich habe die Funktion file_get_contents verwendet, bin aber immer auf das Problem gestoßen, dass ich sie nicht abrufen konnte. Obwohl ich das Timeout gemäß den Beispielen im Handbuch eingestellt habe, hat es die meiste Zeit nicht funktioniert:

$config[. 'context'] = stream_context_create(array ('http' => array('method' => "GET",
'timeout' => 5//Dieses Timeout ist instabil und funktioniert oft nicht
)
));

Wenn ich mir jetzt den Verbindungspool des Servers ansehe, werde ich eine Reihe ähnlicher Fehler finden, die mir Kopfschmerzen bereiten:
file_get_contents(http:/ /***): Fehler beim Öffnen des Streams…

Jetzt verwende ich die Curl-Bibliothek und schreibe einen Funktionsersatz:
function curl_file_get_contents($durl){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $durl) ;
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
curl_setopt($ch, CURLOPT_USERAGENT, _USERAGENT_);
curl_setopt($ch, CURLOPT_REFERER,_REFER ER_ );
curl_setopt($ch, CURLOPT_RETUR NTRANSFER, 1);
$r = curl_exec($ch);
curl_close($ch);
return $r;
}

Also, abgesehen von echten Netzwerkproblemen, keine Probleme mehr.
Dies ist ein von anderen durchgeführter Test zu Curl und file_get_contents:
Die Anzahl der Sekunden, die file_get_contents benötigt, um google.com zu crawlen:

2.31319094
2.30374217
2.21512604
3,30553889
2,30124092

Von Curl verbrauchte Zeit:

0,68719101
0,64675593
0,64326
0,81983113
0,63956 594

Gibt es eine große Lücke? ? Haha, meiner Erfahrung nach unterscheiden sich diese beiden Tools nicht nur in der Geschwindigkeit, sondern auch in der Stabilität.

Es wird empfohlen, dass Freunde, die hohe Anforderungen an die Stabilität der Netzwerkdatenerfassung haben, die obige Funktion „curl_file_get_contents“ verwenden. Sie ist nicht nur stabil und schnell, sondern kann auch den Browser fälschen, um die Zieladresse zu fälschen!

Methode 1: Verwenden Sie file_get_contents, um den Inhalt in der get-Methode abzurufen

<?php
$url=&#39;http://www.domain.com/&#39;;
$html = file_get_contents($url);
echo $html;
?>
Nach dem Login kopieren

Methode 2: Öffnen Sie die URL mit fopen und rufen Sie den Inhalt in der get-Methode ab

<?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);
?>
Nach dem Login kopieren

Methode 3: Verwenden Sie die Funktion „file_get_contents“, um die URL im Post-Modus abzurufen.

<?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;
?>
Nach dem Login kopieren

Methode 4: Verwenden Sie die Funktion „fsockopen“, um die URL zu öffnen und die vollständigen Daten im Abrufmodus abzurufen, einschließlich Header und Text

<?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;
}
?>
Nach dem Login kopieren

Methode 5: Verwenden Sie die fsockopen-Funktion, um die URL zu öffnen und die vollständigen Daten im POST-Modus zu erhalten, einschließlich Header und Text

<?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;
}
?>
Nach dem Login kopieren

Methode 6: Verwenden Sie die Curl-Bibliothek. Bevor Sie die Curl-Bibliothek verwenden, müssen Sie möglicherweise überprüfen, ob php.ini mit der Curl-Erweiterung geöffnet wurde.

<?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;
?>
Nach dem Login kopieren

Die drei Funktionen Curl, fsockopen und file_get_contents in PHP können die Sammlung simulierter Sprache realisieren . Was ist der Unterschied zwischen den drei oder gibt es eine Besonderheit?

Zhao Yongbin:
Manchmal, wenn file_get_contents() zum Aufrufen externer Dateien verwendet wird, kann es im Laufe der Zeit leicht zu einem Fehler kommen. Ändern Sie es einfach in „Curl“. Der genaue Grund ist unklar.
Curl ist effizienter als file_get_contents() und fsockopen(), da CURL DNS-Informationen automatisch zwischenspeichert (das Highlight ist für mich persönlicher Test)

Fan Jiapeng:
file_get_contents curl fsockopen
Selektiver Betrieb unter der aktuell angeforderten Umgebung, keine Verallgemeinerung:
Basierend auf der von unserem Unternehmen entwickelten KBI-Anwendung:
Am Anfang: file_get_contents
Später übernommen: fsockopen
Zuletzt übernommen: Curl

(远程)我个人理解到的表述如下(不对请指出,不到位请补充)
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; 
} 
?>
Nach dem Login kopieren


更多php中使用Curl、socket、file_get_contents三种方法POST提交数据相关文章请关注PHP中文网!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Empfehlungen
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage