【问题标题】:PHP fopen fails in responsePHP fopen 响应失败
【发布时间】:2009-08-06 15:15:05
【问题描述】:

我在从 php 获取 google 搜索 url 时遇到问题。这是我的代码:

<?php
    $handle = fopen("http://www.google.com/complete/search?hl=en&js=true&qu=" .
        $_GET["qu"], "r");
    while (!feof($handle)) {
        $text = fgets($handle);
        echo $text;
    }
    fclose($handle);
?>

这是我得到的错误:

PHP 警告: fopen(http://www.google.com/complete/search?hl=en&js=true&qu=cat): 无法打开流:连接 尝试失败,因为已连接 当事人没有正确回应后 一段时间,或成立 连接失败,因为已连接 主机未能响应。在 C:\Inetpub\test\google.php 在第 3 行 PHP致命错误:最大执行 超过 60 秒的时间 C:\Inetpub\test\google.php 在第 3 行

我正在使用 fiddler,并且对 url 本身进行请求可以正常工作,但由于某种原因 php 不能。有人知道为什么吗?

更新:这是我的 javascript:

function getSuggest(keyEvent) {
  keyEvent = (keyEvent) ? keyEvent : window.event;
  input = (keyEvent.target) ? keyEvent.target : keyEvent.srcElement;

  if (keyEvent.type == "keyup") {
    if (input.value) {
      getSearchData("google.php?qu=" + input.value);
    } else {
 var target = document.getElementById("targetDiv");
 target.innerHTML = "<div></div>";
    }
  }
}

function getSearchData(dataSource) {
  if (XMLHttpRequestObject) {
    XMLHttpRequestObject.open("GET", dataSource);
 XMLHttpRequestObject.onreadystatechange = function() {
   if (XMLHttpRequestObject.readyState == 4 && XMLHttpRequestObject.status == 200) {
     eval(XMLHttpRequestObject.responseText);
        }
 }
    XMLHttpRequestObject.send(null);
  }
}

function sendRPCDone(unusedVariable, searchTerm, arrayTerm, arrayResults, ususedArray) {
  var data = "<table>";
  var loopIndex;

  if (arrayResults.length != 0) {
    for (var loopIndex = 0; loopIndex < arrayResults.length; loopIndex++) {
 data += "<tr><td>" + "<a href='http://www.google.com/search?q=" +
   arrayTerm[loopIndex] + "'>" + arrayTerm[loopIndex] + '</a></td><td>' +
   arrayResults[loopIndex] + "</td></tr>";
    }
  }

  data += "</table>";
  var targetDiv = document.getElementById("targetDiv");
  targetDiv.innerHTML = data;
}

这是我的html:

<div id="googleSearch">
  Search For <input id="textField" type="text" name="textField" onkeyup="getSuggest(event)" />
  <div id="targetDiv4"></div>
</div>

【问题讨论】:

    标签: php url get


    【解决方案1】:

    这看起来像超时。可能是您尝试与之通信的服务器根据USER_AGENT 区分请求。

    【讨论】:

    • 那么 USER_AGENT 之间的区别是什么:localhost/google.php?qu=cat 和这个:google.com/complete/search?hl=en&js=true&qu=cat 如果两者都是从提琴手发送的?
    • 第一个会从 PHP 生成一个对 Google 的请求,而不是从你的浏览器,所以它们会有不同的用户代理。
    • 这也可能是......我相信Fiddler欺骗了IE的用户代理,所以谷歌认为浏览器正在访问它,所以它会允许它。虽然 PHP 脚本会有不同的用户代理,但 Google 可能不允许这样做(因为它是脚本与浏览器)。我不是 100% 的。
    • >不,除非你告诉它。
    【解决方案2】:

    编辑:

    如果您遇到用户代理字符串问题,您可以通过创建并运行包含以下代码的文件来设置用户代理 php 使用: &lt;?php ini_set('user_agent', 'Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1) Gecko/20090615 Firefox/3.5'); ?&gt;

    我认为您必须在设置后重新启动 IIS,但不是 100%。

    注意:这是我提取的随机用户代理字符串,有很多,您可以将其设置为几乎任何您想要的。还有更多:http://www.useragentstring.com/


    要检查 allow_url_fopen 是否打开,请执行以下操作:

    1. 在您的服务器上创建一个 php 文件,随意命名。
    2. 把这个放到你的文件&lt;?php phpinfo(); ?&gt;
    3. 通过网络浏览器或提琴手(如果您正在使用)在您的服务器上执行脚本
    4. 检查所有必要的设置。

    让我们知道它是什么,然后我们可以引导您将其设置为您需要的。

    【讨论】:

    • 感谢您的明确答复。不过还没发现问题。
    【解决方案3】:

    您是否验证了 php.ini allow_url_fopen 已打开?加上 default_socket_timeout ?

    ;是否允许治疗 URL(如 http:// 或 ftp://)为 文件。 allow_url_fopen = 开启

    ;是否允许包含/要求 打开 URL(如 http:// 或 ftp://)为 文件。 allow_url_include = 关闭

    ;基于套接字的默认超时 流(秒) default_socket_timeout = 60

    我同意这看起来像是超时。

    你在使用 PHP 5,如果是,你可以试试 file_get_contents()。

    【讨论】:

    • 基本上是一个简单的文件,带有 phpinfo();说明让您了解此设置,否则,请询问您的系统管理员
    • 我认为如果没有启用它,我们将不会达到超时(虽然不完全确定)
    • 是的,所有设置都符合预期。
    • 和 file_get_contents() 也不例外。
    • "; 基于套接字的流的默认超时(秒) default_socket_timeout = 60" 对我有用(Win2012r2,IIS8.5)。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-08
    • 2011-05-04
    相关资源
    最近更新 更多