Maison >php教程 >PHP开发 >Utilisez Curl, socket, file_get_contents trois méthodes dans POST pour soumettre des données

Utilisez Curl, socket, file_get_contents trois méthodes dans POST pour soumettre des données

高洛峰
高洛峰original
2016-12-23 15:16:271620parcourir

Pour capturer du contenu distant, j'ai déjà utilisé la fonction file_get_content. En fait, je connaissais l'existence d'une chose aussi bonne que curl, mais après y avoir jeté un coup d'œil, j'ai l'impression que son utilisation est assez compliquée. n'est pas aussi simple que file_get_content, et il n'y a aucune exigence Big, donc pas d'apprentissage à utiliser curl.
Jusqu'à récemment, alors que j'essayais de créer un programme de voleur de Web, j'ai découvert que file_get_content ne pouvait plus répondre aux besoins. Je pense que lors de la lecture de contenu distant, sauf que file_get_content est plus pratique à utiliser que curl, il n'est pas aussi bon que curl.

Quelques comparaisons entre curl et file_get_content en php

Principales différences :

Après avoir étudié, j'ai découvert que curl supporte de nombreux protocoles, notamment FTP, FTPS, HTTP, HTTPS, GOPHER , TELNET , DICT, FILE et LDAP, c'est-à-dire qu'il peut faire beaucoup de choses que file_get_content ne peut pas faire. Curl peut réaliser l'acquisition et la collecte de contenu à distance en PHP ; implémenter le téléchargement et le téléchargement FTP de la version Web de PHP ; implémenter la connexion d'interface simulée (API), la transmission de données ; implémenter la reprise du point d'arrêt de téléchargement de fichiers simulés ; la fonction est très puissante.

Après avoir compris quelques utilisations de base de curl, j'ai trouvé que ce n'est pas difficile. Il est juste un peu plus difficile de se souvenir de certains paramètres de réglage, mais nous pouvons simplement nous souvenir de quelques-uns de ceux couramment utilisés.

Activer curl :

Étant donné que PHP ne prend pas en charge la fonction curl par défaut, si vous souhaitez utiliser curl, vous devez d'abord activer cette fonction dans php.ini, c'est-à-dire la supprimer ; extension= php_curl. Le point-virgule devant la dll, puis enregistrez et redémarrez apache/iis.

Syntaxe de base :

$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请求

Récemment, j'ai besoin d'obtenir des données musicales sur les sites Web d'autres personnes. J'ai utilisé la fonction file_get_contents, mais j'ai toujours rencontré le problème d'échec pour l'obtenir. Même si j'ai défini le délai d'attente selon les exemples du manuel, cela n'a pas fonctionné la plupart du temps :

$config[. 'context'] = stream_context_create(array ('http' => array('method' => "GET",
'timeout' => 5//Ce délai d'attente est instable et ne fonctionne souvent pas
)
));

En ce moment, si je regarde le pool de connexions du serveur, je trouverai un tas d'erreurs similaires, ce qui me donne mal à la tête :
file_get_contents(http:/ /***) : échec d'ouverture du flux…

Maintenant, j'utilise la bibliothèque curl et j'écris une fonction de remplacement :
function curl_file_get_contents($durl){
$ch = curl_init();
curl_setopt ($ ch, curlopt_url, $ duurl);
curl_setopt ($ ch, curlopt_timeout, 5);
curl_setopt ($ ch, curlopt_useragent, _useragent _);
curl_setopt ($ ch, curloplage_referer, _refer_ );
curl_setopt($ch, CURLOPT_RETUR NTRANSFER, 1);
$r = curl_exec($ch);
curl_close($ch);
return $r;
}

Donc, hormis de vrais problèmes de réseau, plus de problèmes.
Il s'agit d'un test effectué par d'autres à propos de curl et file_get_contents :
Le nombre de secondes nécessaires à file_get_contents pour explorer google.com :

2,31319094
2,30374217
2,21512604
3.30553889
2.30124092

Temps utilisé par curl :

0.68719101
0.64675593
0.64326
0.81983113
0.63956 594

Y a-t-il un grand écart ? Haha, d'après mon expérience, ces deux outils sont non seulement différents en termes de vitesse, mais aussi en termes de stabilité.

Il est recommandé aux amis qui ont des exigences élevées en matière de stabilité de la capture de données réseau d'utiliser la fonction curl_file_get_contents ci-dessus. Elle est non seulement stable et rapide, mais peut également simuler le navigateur pour usurper l'adresse cible !

Méthode 1 : utilisez file_get_contents pour obtenir le contenu par la méthode get

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

Méthode 2 : utilisez fopen pour ouvrir l'URL et obtenir le contenu par la méthode 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);
?>

Méthode 3 : utilisez la fonction file_get_contents pour obtenir l'URL en mode publication

<?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;
?>

Méthode 4 : utilisez la fonction fsockopen pour ouvrir l'URL et obtenir les données complètes en mode obtenir, y compris l'en-tête et le corps

<?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;
}
?>

Méthode 5 : Utilisez la fonction fsockopen pour ouvrir l'url et obtenir les données complètes en mode POST, y compris l'en-tête et le corps

<?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;
}
?>

Méthode 6 : Utiliser la bibliothèque curl Avant. en utilisant la bibliothèque curl, vous devrez peut-être vérifier si php.ini a été ouvert. Avec l'extension curl

<?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;
?>

les trois fonctions curl, fsockopen et file_get_contents en php peuvent réaliser la collection de parole simulée. Quelle est la différence entre les trois, ou y a-t-il une particularité ?

Zhao Yongbin :
Parfois, lorsque file_get_contents() est utilisé pour appeler des fichiers externes, il est facile de signaler une erreur au fil du temps. Changez-le simplement en curl. La raison spécifique n'est pas claire
curl est plus efficace que file_get_contents() et fsockopen() car CURL mettra automatiquement en cache les informations DNS (le point culminant est que je teste personnellement)

Fan Jiapeng :
file_get_contents curl fsockopen
Opération sélective dans l'environnement actuel demandé, pas de généralisation :
Basé sur l'application KBI développée par notre société :
Au début : file_get_contents
Adopté plus tard : fsockopen
Dernièrement adopté : 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; 
} 
?>


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

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn