web-dev-qa-db-ja.com

file_get_contents():ストリームはシークをサポートしていません/いつPHPこの動作は変更されましたか?

いつPHPこれに関する動作が変更されましたか?

どちらのPHPバージョンですか?


警告:file_get_contents():ストリームは/simple_html_dom.phpでのシークをサポートしていません

警告:file_get_contents():/simple_html_dom.phpのストリームの位置-1へのシークに失敗しました


include('parser/simple_html_dom.php');
$url = "https://en.wikipedia.org/wiki/Stack_Overflow";
$html = file_get_html($url);
if ($html !== false) {
  foreach($html->find('div#mw-content-text') as $item){
    $item->plaintext;
  }
}
16
re1

file_get_contents():ストリームはPHPのシークをサポートしません を参照してください

リモートファイルを使用しています。シークはローカルファイルでのみサポートされます。

おそらく、file_get_htmlを使用する前に、ファイルをローカルファイルシステムにコピーする必要があります。ローカルホストで正常に動作するはずです。

2
le_m

あるシステムから別のシステムに移動したときにページで同じ問題が発生しました。オフセット参照を削除することでsimple_html_dom.phpファイルを変更できました(これ以上問題は発生しませんでした)。

simple_html_dom.phpの75行目:

$contents = file_get_contents($url, $use_include_path, $context, $offset);

$offsetへの参照を削除しました:

$contents = file_get_contents($url, $use_include_path, $context);

いいえ、私のページは正常に動作しません。それが破る他のものに対して責任を負わない! :)

95
Rmj86

変化する

function file_get_html(..., $offset = -1,...)

function file_get_html(..., $offset = 0,...)

simple_html_dom.php

18
Neibce

ベンダーファイルを編集する必要はありません。リクエストを次から変更してください:

$html = HtmlDomParser::file_get_html( "https://www.google.com/");

に:

$html = HtmlDomParser::file_get_html( "https://www.google.com/", false, null, 0 );

問題は、Simple HTML DOMが使用するデフォルトのオフセットが「-1」で、「0」にすることです。幸いなことに、それはパラメーターとして受け入れられます。つまり、Simple HTML DOMソースを変更する必要なく、簡単に変更できます。

注:この互換性の問題はv1.7 +で修正されました

14
Chuck Le Butt

simple_html_dom.phpファイルで、$offsetを検索して削除します。75行目と76行目にあるはずです。すべて正常に機能します。

4
ahmed.soli

他の人はソリューションを共有していますが、誰もその理由を共有していません。なぜこれがPHP 7.0と7.1で異なるのかはわかりませんが、 この関数のPHP.netドキュメント と言うと:

シーク(オフセット)は、リモートファイルではサポートされていません。非ローカルファイルをシークしようとすると、小さなオフセットで動作する場合がありますが、バッファされたストリームで動作するため、これは予測できません。

75行目のfile_get_contentsのオフセットパラメータの削除が機能すること、および/または70行目のfile_get_html関数でオフセットを0に設定することも機能することを確認できます。

私は、オフセットパラメータが非ローカルファイルで使用されることを意図したものではなかったと思います:

元のストリームで読み取りが開始されるオフセット。負のオフセットは、ストリームの終わりからカウントされます。

これが混乱の解消に役立つことを願っています。外部ソースでは、最初からストリーミングを開始するのが理にかなっています。

2
Crazycoolcam