file_get_contents(): stream does not support seeking / When was PHP behavior about this changed?

怎甘沉沦 提交于 2019-12-17 09:50:04

问题


When was PHP behavior about this changed?

From which PHP version is it?


Warning: file_get_contents(): stream does not support seeking in /simple_html_dom.php

Warning: file_get_contents(): Failed to seek to position -1 in the stream in /simple_html_dom.php


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;
  }
}

回答1:


See file_get_contents(): stream does not support seeking PHP

You are working with a remote file. Seeking is only supported for local files.

You probably need to copy the file to your local file system before using file_get_html. It should work fine on localhost.




回答2:


I had the same issue on my page when I moved it from one system to another, I was able to change the simple_html_dom.php file by removing the offset reference (didn't cause any further problems for me).

On line 75 of simple_html_dom.php:

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

I removed the reference to $offset:

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

No my page works fine. Not taking liability for anything else it breaks! :)




回答3:


Change

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

to

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

in simple_html_dom.php




回答4:


You don't need to edit the vendor files. Just change your requests from:

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

to:

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

The problem is that the default offset used by Simple HTML DOM is "-1" when you want it to be "0". Luckily it accepts it as a parameter, which means you can change it easily without needing to change the Simple HTML DOM source.

Note: This compatibility issue was fixed in v1.7+




回答5:


In the simple_html_dom.php file, search for $offset and remove it—it should be in lines 75 and 76. Everything will work fine then.




回答6:


Others have shared the solution, but no one has shared why. I don't know specifically why this is different between PHP 7.0 & 7.1, but the PHP.net docs for this function say:

Seeking (offset) is not supported with remote files. Attempting to seek on non-local files may work with small offsets, but this is unpredictable because it works on the buffered stream.

I can confirm that removing the offset parameter in file_get_contents on line 75 works for me and/or setting the offset to 0 in the file_get_html function on line 70 works too.

I guess that the offset parameter was never meant to be used with non local files since:

The offset where the reading starts on the original stream. Negative offsets count from the end of the stream.

Hope this helps clear up any confusion. With external sources, it makes sense to start streaming from the beginning.




回答7:


Set $offset = 0

That is working!



来源:https://stackoverflow.com/questions/42685814/file-get-contents-stream-does-not-support-seeking-when-was-php-behavior-abo

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!