PHP fopen响应失败

PHP fopen响应失败,php,url,get,Php,Url,Get,我在从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; } f

我在从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(): 无法打开流:一个连接 尝试失败,因为已连接 在一次会议之后,该党没有作出适当的回应 一段时间,或确定的时间 连接失败,因为已连接 主机无法响应。在里面 第3行的C:\Inetpub\test\google.php PHP致命错误:最大执行量 在中超过60秒的时间 第3行的C:\Inetpub\test\google.php

我使用的是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;
}
函数getSuggest(keyEvent){
keyEvent=(keyEvent)?keyEvent:window.event;
输入=(keyEvent.target)?keyEvent.target:keyEvent.srcElement;
if(keyEvent.type==“keyup”){
if(输入值){
getSearchData(“google.php?qu=“+input.value”);
}否则{
var target=document.getElementById(“targetDiv”);
target.innerHTML=“”;
}
}
}
函数getSearchData(数据源){
if(XMLHttpRequestObject){
open(“GET”,数据源);
XMLHttpRequestObject.onreadystatechange=函数(){
if(XMLHttpRequestObject.readyState==4&&XMLHttpRequestObject.status==200){
eval(XMLHttpRequestObject.responseText);
}
}
XMLHttpRequestObject.send(null);
}
}
函数sendRPCDone(未使用变量、搜索项、arrayTerm、arrayResults、UsuseSeadarray){
var数据=”;
var指数;
如果(arrayResults.length!=0){
对于(var loopIndex=0;loopIndex
这是我的html:

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

寻找

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

您是否已验证php.ini allow\u url\u fopen是否打开?以及默认的\u socket\u超时

;是否允许治疗 URL(如http://或ftp://)作为 文件。允许\u url\u fopen=On

;是否允许包括/要求 按以下方式打开URL(如http://或ftp://) 文件.allow\u url\u include=Off

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

我同意这看起来像是超时

您是否正在使用PHP5,如果是,您可以尝试使用file_get_contents()。

编辑:

如果发现用户代理字符串有问题,可以通过创建并运行包含以下代码的文件来设置php使用的用户代理:

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

注意:这是我提取的一个随机用户代理字符串,有很多,您可以将其设置为几乎任何您想要的内容。还有很多:


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

  • 在您的服务器上创建一个php文件,根据需要命名它
  • 将其放入您的文件
  • 如果您正在使用web浏览器或fiddler,请在服务器上执行脚本
  • 检查所有必要的设置

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

    那么用户代理的区别是什么:如果这两个都是从fiddler发送的?第一个将从PHP生成一个到Google的请求,而不是从您的浏览器,因此他们将有不同的用户代理。这也可能是它…我相信ddler欺骗IE的用户代理,所以谷歌认为浏览器正在访问它,所以它会允许它。而PHP脚本将有一个不同的用户代理,谷歌可能不允许(因为它是一个脚本而不是一个浏览器)。我对这些都不是100%。基本上是一个带有phpinfo()的简单文件;说明让您知道此设置,否则,请询问您的系统管理员我认为如果未启用此设置,我们将不会达到超时(但不完全确定)是的,所有设置都如预期的那样。而文件_get_contents()也一样;基于套接字的流的默认超时(秒)默认\u socket\u timeout=60“为我做了一些技巧(Win2012r2,IIS8.5)。谢谢!谢谢你给出了清晰的答案。不过还没有发现问题。