【问题标题】:file_get_contents(): stream does not support seeking / When was PHP behavior about this changed?file_get_contents(): 流不支持搜索 / PHP 行为何时改变?
【发布时间】:2017-03-09 02:53:12
【问题描述】:

PHP 对此的行为何时发生了变化?

它来自哪个 PHP 版本?


警告:file_get_contents():流不支持搜索 /simple_html_dom.php

警告:file_get_contents():未能在流中寻找位置 -1 /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;
  }
}

【问题讨论】:

  • 这发生在 PHP 7.1 中,但在 7.0 和 5.6 中可以正常工作。
  • 此兼容性问题已在 1.7 及更高版本中修复

标签: php simple-html-dom


【解决方案1】:

当我将页面从一个系统移动到另一个系统时,我在页面上遇到了同样的问题,我能够通过删除偏移量引用来更改 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);

没有,我的页面可以正常工作。不承担任何其他破坏的责任! :)

【讨论】:

  • 简单而精彩!天才!
  • 拯救了一天,天才。
  • 你绝对是最棒的
  • 投了赞成票,这很完美,应该是公认的答案:)
  • 你是我的英雄!
【解决方案2】:

改变

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

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

在 simple_html_dom.php 中

【讨论】:

    【解决方案3】:

    您无需编辑供应商文件。只需将您的请求更改为:

    $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+ 中修复

    【讨论】:

    • 使用 Composer 版本的正确答案
    【解决方案4】:

    file_get_contents(): stream does not support seeking PHP

    您正在处理一个远程文件。仅本地文件支持查找。

    在使用file_get_html 之前,您可能需要将该文件复制到本地文件系统。它应该可以在 localhost 上正常工作。

    【讨论】:

    • PHP 行为没有改变吗?这个规范与过去没有变化吗?
    • 根据更新日志php.net/manual/en/function.file-get-contents.php 没有关于寻找远程文件的改变。这就是为什么我假设您以前只使用搜索好的本地文件(或者你很幸运,因为有时搜索可能也适用于远程文件的小范围,根据文档)。
    • 谢谢。 >根据文档,有时搜索也可能适用于远程文件的小范围
    【解决方案5】:

    其他人分享了解决方案,但没有人分享原因。我不知道为什么这在 PHP 7.0 和 7.1 之间有所不同,但 PHP.net docs for this function 说:

    远程文件不支持搜索(偏移)。试图 在非本地文件上查找可能会使用小偏移量,但这是 不可预测,因为它适用于缓冲流。

    我可以确认删除第 75 行 file_get_contents 中的偏移量参数对我有效,并且/或者在第 70 行的 file_get_html 函数中将偏移量设置为 0 也有效。

    我猜想 offset 参数从不打算用于非本地文件,因为:

    在原始流上开始读取的偏移量。消极的 从流的末尾算起的偏移量。

    希望这有助于消除任何困惑。对于外部源,从头开始流式传输是有意义的。

    【讨论】:

      【解决方案6】:

      首先,尝试更改 simple_html_dom.php 之类的

      • 从第 75 行的 file_get_contents(...) 中删除 offset 参数

      • 或在第 70 行的 file_get_html func 中将偏移量设置为 0

      如果还是不行 ???和我一样

      那就说明你有最新版本的PHP,你需要从https://sourceforge.net/projects/simplehtmldom/下载最新版本的simple_html_dom.php

      之后,它在每台机器和系统上都适用于我

      【讨论】:

        【解决方案7】:

        设置 $offset = 0

        这行得通!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-06-17
          • 1970-01-01
          • 1970-01-01
          • 2011-09-11
          • 2015-05-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多