いつ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;
}
}
file_get_contents():ストリームはPHPのシークをサポートしません を参照してください
リモートファイルを使用しています。シークはローカルファイルでのみサポートされます。
おそらく、file_get_html
を使用する前に、ファイルをローカルファイルシステムにコピーする必要があります。ローカルホストで正常に動作するはずです。
あるシステムから別のシステムに移動したときにページで同じ問題が発生しました。オフセット参照を削除することで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);
いいえ、私のページは正常に動作しません。それが破る他のものに対して責任を負わない! :)
変化する
function file_get_html(..., $offset = -1,...)
に
function file_get_html(..., $offset = 0,...)
simple_html_dom.php
ベンダーファイルを編集する必要はありません。リクエストを次から変更してください:
$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 +で修正されました
simple_html_dom.php
ファイルで、$offset
を検索して削除します。75行目と76行目にあるはずです。すべて正常に機能します。
他の人はソリューションを共有していますが、誰もその理由を共有していません。なぜこれがPHP 7.0と7.1で異なるのかはわかりませんが、 この関数のPHP.netドキュメント と言うと:
シーク(オフセット)は、リモートファイルではサポートされていません。非ローカルファイルをシークしようとすると、小さなオフセットで動作する場合がありますが、バッファされたストリームで動作するため、これは予測できません。
75行目のfile_get_contents
のオフセットパラメータの削除が機能すること、および/または70行目のfile_get_html
関数でオフセットを0に設定することも機能することを確認できます。
私は、オフセットパラメータが非ローカルファイルで使用されることを意図したものではなかったと思います:
元のストリームで読み取りが開始されるオフセット。負のオフセットは、ストリームの終わりからカウントされます。
これが混乱の解消に役立つことを願っています。外部ソースでは、最初からストリーミングを開始するのが理にかなっています。