1

PHPでファイルを読み取る最速の方法は何ですか? 具体的には、私はURLを読んでいます.fgetsを使ってファイルを読んでいます.URLのサイズは約1MBで、5つのURLを読むのに最大20秒かかりました. ファイルの最後の部分にある文字列の行のみを取得しています。私は実際に fseek を使用してポインターを URL の末尾に移動しましたが、ファイル (URL ではなく) でのみ機能します。素晴らしいアイデアはありますか?

ここに私のサンプルコードがあります

$fp=fopen("http://url.com", "r");
if(is_bool($fp)){
    exit;
}
while(!feof($fp)) {
    $data = fgets($fp);
    if($data=="this is what i've wanted")
    {
        // codes...
    }
}
fclose($fp);
4

3 に答える 3

2

この状況では、すべてのコンテンツをスキップすることはできません*。ネットワーク転送が機能する方法では、コンテンツの長さを定義し、必要な部分の前にすべてを読み取る必要があります。

要するに、スキップすることはできません。読んで、必要なものを手に入れて、人生を歩んでください。

*注: リソースが部分コンテンツと範囲要求をサポートしている場合は可能です。ありそうもない。

于 2012-08-29T02:23:47.947 に答える
1

再開ダウンロードをサポートする cUrl を使用して、ファイルの最後の部分のみを取得できます。

function retrieve_tail($remoteFile, $localFile = null, $bytes = 1000) {
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_RANGE, intval($bytes)."-");
  $fp = fopen($localFile, "w+");
  curl_setopt($ch, CURLOPT_FILE, $fp);
  $result = curl_exec($ch);
  curl_close($ch);
  fclose($fp);
  return $result;
}

次に呼び出します。

  $result = retrieve_tail("http://url.com", "local_copy.txt", 20000);
  print_r($result);

そして、指定したローカルファイルに必要なものがあります。また、設定することもできます

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

コンテンツを直接取得します。

于 2012-08-29T02:53:35.647 に答える
0

CURL を使用してリモート URL を取得します。

function curlRequest($url)
{

    $curl = curl_init();
    curl_setopt($curl,  CURLOPT_URL,                $url);
    curl_setopt($curl,  CURLOPT_RETURNTRANSFER,     true);
    curl_setopt($curl,  CURLOPT_FOLLOWLOCATION,     true);
    curl_setopt($curl,  CURLOPT_BINARYTRANSFER,     true);
    curl_setopt($curl,  CURLOPT_ENCODING,           true);
    curl_setopt($curl,  CURLOPT_HEADER,             false);

    $a = new stdclass;
    $a->body            = curl_exec         ($curl);
    $a->status          = curl_getinfo      ($curl,     CURLINFO_HTTP_CODE);
    $a->effectiveURL    = curl_getinfo      ($curl,     CURLINFO_EFFECTIVE_URL);

    curl_close ($curl);

    return $a;
}
于 2012-08-29T02:26:49.393 に答える