PHP fopen fails in response

て烟熏妆下的殇ゞ 提交于 2020-01-02 18:07:10

问题


I am having a problem doing a get on googles search url from php. Here's the code I have:

<?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);
?>

Here's the error I get:

PHP Warning: fopen(http://www.google.com/complete/search?hl=en&js=true&qu=cat): failed to open stream: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond. in C:\Inetpub\test\google.php on line 3 PHP Fatal error: Maximum execution time of 60 seconds exceeded in C:\Inetpub\test\google.php on line 3

I'm using fiddler, and doing a request on the url itself works fine, but for some reason the php does not. Anyone have any idea why?

update: Here is my 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;
}

And here is my html:

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

回答1:


Edit:

If it turns out you are having user agent string problems, you can set the user-agent php uses by creating and running a file with the following code in it: <?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'); ?>

I think you'll have to restart IIS after setting this, but not 100% on that.

Note: this is a random user agent string I pulled, there are many out there, you can set it to pretty much anything you want. There are many more at: http://www.useragentstring.com/


To check if allow_url_fopen is on, do this:

  1. Create a php file on your server, name it whatever you desire.
  2. Put this into your file <?php phpinfo(); ?>
  3. Execute the script on your server through a web browser or fiddler if you are using that
  4. check for all necessary settings.

Let us know what it is, then we can walk you through setting it to what you need.




回答2:


That looks like a timeout. It could be that the server you are trying to communicate with discriminates requests based on USER_AGENT.




回答3:


Have you verified the php.ini allow_url_fopen is ON ? Plus the default_socket_timeout ?

; Whether to allow the treatment of URLs (like http:// or ftp://) as files. allow_url_fopen = On

; Whether to allow include/require to open URLs (like http:// or ftp://) as files. allow_url_include = Off

; Default timeout for socket based streams (seconds) default_socket_timeout = 60

I agree it looks like a timeout.

Are you working with PHP 5, if so, you could try file_get_contents().



来源:https://stackoverflow.com/questions/1239601/php-fopen-fails-in-response

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