ホームページ  >  記事  >  バックエンド開発  >  PHP_PHP チュートリアルでのcurl、fsocket、file_get_contentの使用の比較

PHP_PHP チュートリアルでのcurl、fsocket、file_get_contentの使用の比較

WBOY
WBOYオリジナル
2016-07-13 10:30:10977ブラウズ

リモートコンテンツをキャプチャするには、以前からfile_get_content関数を使用していました。curlなどの優れた機能の存在は知っていましたが、実際に見てみると、使い方がかなり複雑であると感じました。 file_get_content ほど単純ではないし、需要も大きくないので、curl の使い方を学びませんでした。
最近まで、Web 泥棒プログラムを作成しようとしていたときに、file_get_content ではニーズを満たせないことがわかりました。リモート コンテンツを読み取る場合、file_get_content はcurl よりも使いやすい点を除けば、curl ほど優れたものではないと思います。

phpのcurlとfile_get_contentの比較

主な違い:

勉強した結果、curl は FTP、FTPS、HTTP、HTTPS、GOPHER、TELNET、DICT、FILE、LDAP などの多くのプロトコルをサポートしていることがわかりました。つまり、file_get_content では実行できない多くのことが実行できます。 Curl は、PHP でのコンテンツのリモート取得と収集を実現できます。PHP Web バージョンの FTP アップロードとダウンロードを実装します。インターフェイス ドッキング (API) を実装し、データ転送をシミュレートします。機能は非常に強力です。

curl の基本的な使い方をいくつか理解した後、いくつかの設定パラメータを覚えるのは少し難しいだけですが、一般的に使用されるパラメータをいくつか覚えておくだけで十分であることがわかりました。

カールを有効にする:

PHP はデフォルトではcurl関数をサポートしていないため、curlを使用したい場合は、まずphp.iniでこの関数を有効にする必要があります。つまり、;extension= php_curl.dllの前のセミコロンを削除してから保存し、 Apache/iisを再起動してください。

基本構文:

コードをコピー コードは次のとおりです:

$my_curl =curl_init() //curl オブジェクトを初期化します
curl_setopt($my_curl, CURLOPT_URL, "http://www.jb51 .net" ; =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://***): ストリームを開けませんでした…


今度は、curl ライブラリを使用して、関数の置換を書きました:

functioncurl_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,_REFERER_);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$r =curl_exec($ch);
curl_close ($ch );
$r を返す;
}

したがって、実際のネットワークの問題以外の問題はなくなりました。

これは他の人が行ったcurlとfile_get_contentsに関するテストです:

file_get_contentsがgoogle.comをクロールするのにかかる秒数:

2.31319094

2.30374217

2.21512604
3.30553889
2.30124092

カールの使用時間:

0.68719101

0.64675593

0.64326
0.81983113
0.63956594

大きなギャップはありますか?あはは、私の経験から言えば、これら 2 つのツールは速度が異なるだけでなく、安定性も異なります。

ネットワーク データ キャプチャの安定性に対する要求が高い友人には、上記のcurl_file_get_contents関数を使用することをお勧めします。安定して高速なだけでなく、ブラウザを偽装してターゲット アドレスを偽装することもできます。

方法 1: file_get_contents を使用して get モードでコンテンツを取得します

コードをコピーします コードは次のとおりです:
$url='http://www.domain.com/';
$html = file_get_contents($url);
エコー $html
?>


方法 2: fopen を使用して URL を開き、get メソッドを使用してコンテンツを取得します

コードをコピー コードは次のとおりです:
$fp = fopen($url, 'r');
stream_get_meta_data($fp);
while(!feof($fp) )) {
$result .= fgets($fp, 1024);
}
echo "url body: $result";
fclose($fp);
?>


方法 3: file_get_contents 関数を使用して投稿モードで URL を取得します

コードをコピーします コードは次のとおりです:

$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を打ち、ヘッダーとボディを含む完全なデータを取得します

复制代码代码如下:

function get_url ($url,$cookie=false)
{
$url = parse_url($url);
$query = $url[path ]."?".$url[クエリ];
echo "クエリ:".$query;
$fp = fsockopen( $url[ホスト], $url[ポート]?$url[ポート]:80 , $errno , $errstr, 30);
if (!$fp) {
return false;
} else {
$request = "GET $query HTTP/1.1rn";
$request .= "ホスト: $url[host] rn";
$request .= "接続: 閉じるrn";
if($cookie) $request.="Cookie: $cookien";
$request.="rn";
fwrite($fp,$request);
while()) {
$result .= @fgets($fp, 1024);
}
fclose($fp);
return $result;
}
}
//获取urlのhtml部分、去掉ヘッダー
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形式で取得します

复制代码代码如下:

function HTTP_Post($URL,$data,$cookie, $referrer="")
{
// 指定された URL を解析します
$URL_Info= parse_url($URL);

// リファラーを構築する
if($referrer=="") // 指定されていない場合は、このスクリプトをリファラーとして使用します
$referrer="111″;

// $data から文字列を作成します
foreach($data as $key=>$value)
$values[]="$key=".urlencode($value);
$data_string=implode("&", $values);

// 必要なポートを調べます – 指定されていない場合は、standard (=80) を使用します
if(!isset($URL_Info["port"]))
$URL_Info["port"]=80;

// POST-request:
$request.="POST ".$URL_Info["path"]." HTTP/1.1n";
$request.="ホスト: ".$URL_Info["host"] を構築しています。 "n";
$request.="リファラー: $referern";
$request.="コンテンツ タイプ: application/x-www-form-urlencodedn";
$request.="コンテンツの長さ: ".strlen ($data_string)."n";
$request.="接続: クローズ";

$request.="クッキー: $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:curl を使用する、curl を使用する前に、次の php.ini が既に打开了しているかどうかを確認する必要がある可能性があります

复制代码代码如下:

$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のcurl、fsockopen、file_get_contentsの3つの関数はいずれも模擬音声の収集を実現できます。 3つの違いや注意点はありますか

Zhao Yongbin:
file_get_contents() を使用して外部ファイルを呼び出すと、タイムアウト エラーが報告されやすくなることがあります。これをcurlに変更するだけです。具体的な理由は不明です。Curlはfile_get_contents()やfsockopen()よりも効率的です。その理由は、CURLがDNS情報を自動的にキャッシュするためです(私が個人的にテストするためです)。
Fan Jiapeng:

file_get_contentscurl fsockopen

現在要求されている環境での選択的な操作、一般化なし:
弊社が開発した KBI アプリケーションに基づく:
使い始めたばかり: file_get_contents
後に採用: fsockopen
現在まで最終的に使用:curl

(リモート) 個人的に理解している表現は以下の通りです(間違っていたらご指摘ください、間違っていたら追記してください)

file_get_contentsはphp.iniのallow_url_fopenを有効にする必要があります httpリクエストの場合はhttp_fopen_wrapperを使用すればOKです。 keeplive.curl を知らない場合。

file_get_contents() は 1 回の実行効率が高く、ヘッダーなしで情報を返します。
通常のファイルを読み取る場合には問題ありませんが、リモートファイルを読み取る場合には問題が発生します。
継続的に接続したい場合は、複数のページを複数回リクエストしてください。その場合、file_get_contents と fopen に問題が発生します。
取得した内容が間違っている可能性もあります。したがって、同様の収集作業を行う場合、必ず問題が発生します。
sock は比較的低レベルであり、設定も操作も困難です。 完全な情報を返します。

Pan Shaoning-Tencent:

file_get_contents 特定の URL のコンテンツを取得することはできますが、投稿して取得することはできません。

カールは、投稿したり取得したりできます。ソケットが下位レベルにあるときにヘッド情報
を取得することもできます。 file_get_contents とcurl がそれを実行できる場合は、UDP または TCP プロトコルに基づいて対話するように設定できます。
socket でできることは、curl ではできない場合が多く、データを取得するだけです。より効率的でシンプルです。
私も Zhao の状況に遭遇しました。CURL を通じてホストを設定しましたが、問題ありませんでした。 これはネットワーク環境に関係があります



http://www.bkjia.com/PHPjc/767609.html

www.bkjia.com

http://www.bkjia.com/PHPjc/767609.html技術記事リモートコンテンツをキャプチャするには、以前から file_get_content 関数を使用していました。 実は、curl などの優れた関数の存在は知っていましたが、実際に見てみると、使い方がかなり複雑だと感じました。 ...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。