最近、Web 泥棒プログラムに取り組んでいたとき、file_get_content ではニーズを満たせないことがわかりました。
リモートコンテンツを読むとき、file_get_content は、curl よりも使いやすいという点を除けば、curl ほど良くないと思います
リモートコンテンツをキャプチャするには、以前からfile_get_content関数を使用していました。curlなどの優れた機能の存在は知っていましたが、実際に見てみると、使い方がかなり複雑であると感じました。 file_get_content ほど単純ではないし、需要も大きくないので、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://bbs.it-home.org") // クロールに必要なものを設定しますURL
- curl_setopt($my_curl,CURLOPT_RETURNTRANSFER,1); //結果を文字列に保存するか画面に出力するかを設定します
- $str =curl_exec($curl); Execute Request
- echo $str; //クロールした結果を出力
- curl_close($curl); //URL requestをクローズ
-
-
コードをコピー
最近、他の人のWebサイトから音楽データを取得する必要があります。 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, _Userager _); exec ($ ch);
- CURL_CLOSE ($ ch);
-
-
- コードをコピー
-
-
- したがって、実際のネットワークの問題以外には問題はありません。
これは、他の人が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関数を使用することをお勧めします。これは、安定して高速であるだけでなく、ブラウザを偽装してターゲット アドレスを偽装することもできます。
-
- curl と file_get_contents の使用法については、以前の記事で説明されています。参考として推奨されるいくつかの優れた記事を以下に示します。
PHP file_get_contentsのタイムアウト処理の設定方法
PHP file_get_contents が文字化けした Gzip Web ページを取得する問題の解決策
phpのfile_get_contentsタイムアウト問題の解決策
PHP file_get_contents タイムアウトを設定する方法
php file_get_content互換性検出の例-
ページ情報を取得するphp file_get_contentsコード-
ページ情報を取得するphp file_get_contents関数コード-
- 方法 1: file_get_contents を使用して取得モードでコンテンツを取得する
-
-
- $url='http://www.domain.com/';
$html = file_get_contents($url);echo $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[パス]."?".$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 .= "接続: 閉じる";
- 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);
- // 必要なポートを調べます – 指定されていない場合は標準を使用します(=80)
- if(!isset($URL_Info["port"]))
- $URL_Info["port"]=80;
- // ビルド POST-request:
- $request.="POST ".$URL_Info[ "パス"]." HTTP/1.1n";
- $request.="ホスト: ".$URL_Info["host"]."n";
- $request.="リファラー: $referern";
- $request. ="Content-type: application/x-www-form-urlencodedn";
- $request.="Content-length: ".strlen($data_string)."n";
- $request.="接続: closen";
- $request.="Cookie: $cookien";
- $request.="n";
- $request.=$data_string."n";
- $fp = fsockopen($URL_Info["host"],$URL_Info[ "ポート"]);
- fputs($fp, $request);
- while(!feof($fp)) {
- $result .= fgets($fp, 1024);
- }
- fclose($fp);
- return $result;
- }
- ?>
-
コードをコピー
方法 6:curl ライブラリを使用するcurl ライブラリを使用する前に、php.ini でcurl 拡張機能がオンになっているかどうかを確認する必要がある場合があります。
-
- $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つの違いや注意点はありますか?
趙永斌:
file_get_contents() を使用して外部ファイルを呼び出すと、タイムアウトによるエラーが報告されやすくなることがあります。これをcurlに変更するだけです。具体的な理由は不明です。
その理由は、CURL が DNS 情報を自動的にキャッシュするためです (ハイライトは私が個人的にテストするためのものです)。
ファン・ジアペン:
file_get_contentsカールfsockopen
一般化せずに、現在要求されている環境での選択的な操作:
当社が開発した KBI アプリケーションを見てみましょう。
使い始めたばかり: file_get_contents
後に採用された: fsockopen
現在まで最後に使用されたもの:curl
(リモート)私の個人的な理解は以下の通りです(間違っていたらご指摘ください、違っていたら追記してください)
file_get_contents は php.ini のallow_url_fopen を有効にする必要があります。 http をリクエストする場合は、keeplive.curl を知らなくても大丈夫です。
file_get_contents() は 1 回の実行効率が高く、ヘッダーのない情報を返します。
通常のファイルを読み取る場合には問題ありませんが、リモート ファイルを読み取る場合には問題が発生します。
継続的に接続したい場合は、複数のページを複数回リクエストしてください。その場合、file_get_contents と fopen に問題が発生します。
取得した内容が正しくない場合もあります。したがって、同様の収集作業を行う場合、必ず問題が発生します。
Sock は比較的低レベルで、設定が面倒で、操作も困難です。 完全な情報を返します。
潘少寧-テンセント:
file_get_contents は、特定の URL のコンテンツを取得できますが、post get はできません。
カールは、投稿したり入手したりすることができます。頭部情報も取得可能
ソケットは下位レベルです。 UDP または TCP プロトコルに基づいて対話するように設定可能
file_get_contents とcurl がそれを実行できる場合は、socket も実行できます。
ソケットでできることは、curl ではできない場合があります。
file_get_contents は、多くの場合、データを取得するだけです。より効率的でシンプルです。
私も Zhao の状況に遭遇し、CURL を介してホストを設定しましたが、問題ありませんでした。 これにはネットワーク環境が関係しています。
以上、PHP における url、fsocket、file_get_content 関数の使用法の類似点と相違点を例を通して紹介しました。
|