2

fsockopen()とfread()を使用してURLを読み取り、次の種類のデータを取得します。

      <li
10 
></li>
      <li
9f 
>asd</li>

d  
          <li
92 

これは完全にめちゃくちゃですO_O

-

file _ get _ contents()関数を使用している間、私はこの種のデータを取得します。

<li></li>
      <li>asd</li>

どちらが正しい!それで、地獄は何が間違っているのですか?WindowsサーバーとLinuxサーバーで試してみましたが、どちらも同じように動作します。そして、彼らは同じPHPバージョンさえ持っていません。

-

私のPHPコードは次のとおりです。

$fp = @fsockopen($hostname, 80, $errno, $errstr, 30);
if(!$fp){
    return false;
}else{
    $out = "GET /$path HTTP/1.1\r\n";
    $out .= "Host: $hostname\r\n";
    $out .= "Accept-language: en\r\n";
    $out .= "Connection: Close\r\n\r\n";
    fwrite($fp, $out);

    $data = "";
    while(!feof($fp)){
        $data .= fread($fp, 1024);
    }
    fclose($fp);

どんな助け/ヒントもありがたいです、今この一日中疑問に思っています:/

ああ、スクリプトを実行するサーバーでfopenラッパーが有効になっていないため、fopen()またはfile _ get _ contents()を使用できません> __ <

好奇心のために、これを修正する方法を本当に知りたいです。とにかく、このサーバーで追加のライブラリを使用できるとは思いません。

4

3 に答える 3

1

fsockopen()を使用すると、HTTPコンテンツではなく、生のTCPデータを取得します。HTTPヘッダーも表示されていると思いますよね?チャンクエンコーディングの場合は、すべてのチャンクヘッダーを取得します。

これは既知の問題です。誰かがチャンクヘッダーを削除する方法についてここに解決策を投稿しました。

于 2009-08-14T19:57:01.403 に答える
1

おそらくcURLを使用したいと思うでしょう。

<?php
// create a new cURL resource
$ch = curl_init();

// set URL and other appropriate options
curl_setopt($ch, CURLOPT_URL, "http://www.example.com/");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

// grab URL and pass it to the browser
$output = curl_exec($ch);

// close cURL resource, and free up system resources
curl_close($ch);
?>
于 2009-08-14T19:14:39.883 に答える
1

「奇妙なデータ」の問題については、データを要求しているサーバーがデータをチャンク モードで転送していることが原因である可能性があります。

ブラウザで同じ URL を呼び出すときに、HTTP ヘッダーを確認できます。これらのヘッダーの 1 つは次のようになります。

Transfer-encoding: chunked


その件に関するウィキペディアの記事を 引用すると:

空でない各チャンクは、埋め込むデータのオクテット数 (サイズは 16 進数で記述) で始まり、その後に CRLF (キャリッジ リターンとライン フィード)、およびデータ自体が続きます。その後、チャンクは CRLF で閉じられます。一部の実装では、チャンクサイズと CRLF の間に空白文字 (0x20) が埋め込まれます。

最後のチャンクは 1 行で、チャンク サイズ (0)、いくつかのオプションのパディング ホワイト スペース、および終端の CRLF で構成されています。その後にデータは続きませんが、メッセージ ヘッダーと同じ構文を使用してオプションのトレーラーを送信できます。

メッセージは、最終的な CRLF の組み合わせによって最終的に閉じられます。

これはあなたが得ているものに近いように見えます...だから、これが問題だと思います。


私が覚えている限りでは、curl はそれに対処する方法を知っています。したがって、簡単な方法はfsockopen などの代わりにcurlを使用することです。

また、多くの場合、curl を使用する方がソケットを使用するよりも優れています。これにより、遭遇する可能性のある多くの問題に対処できます。このように ;-)


サーバーでcurlが有効になっていない場合の別のアイデアは、 fsockopen に基づいた既存のライブラリを使用することです.

たとえば、私はスヌーピーと何度か仕事をしたことがあります。多分それはすでにそれに対処する方法を知っていますか?
(確かではありません: 自分でテストする必要があります -- または、ドキュメントを参照して、これで問題ないかどうかを確認してください)
それでも、HTTP プロトコルの謎に自分で対処したい場合は...まあ、私はあなたの幸運を祈ります !

于 2009-08-14T19:25:34.587 に答える