PHP Fopen не отвечает в ответ - PullRequest
2 голосов
/ 06 августа 2009

У меня проблема с поиском URL-адреса поиска Google с php. Вот код, который у меня есть:

<?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: Еореп (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>

Ответы [ 3 ]

3 голосов
/ 06 августа 2009

Это похоже на тайм-аут. Возможно, сервер, с которым вы пытаетесь установить связь, различает запросы на основе USER_AGENT .

2 голосов
/ 06 августа 2009

Изменить:

Если выясняется, что у вас проблемы со строками пользовательского агента, вы можете настроить использование php пользовательского агента, создав и запустив файл со следующим кодом: <?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'); ?>

Я думаю, вам придется перезапустить IIS после установки этого, но не 100% на этом.

Примечание: это произвольная строка пользовательского агента, которую я вытащил, их там много, вы можете установить ее практически на что угодно. Есть еще много на: http://www.useragentstring.com/


Чтобы проверить, включен ли allow_url_fopen, выполните следующее:

  1. Создайте php-файл на вашем сервере, назовите его как хотите.
  2. Поместите это в свой файл <?php phpinfo(); ?>
  3. Выполните скрипт на вашем сервере через веб-браузер или фиддлер, если вы используете это
  4. проверьте все необходимые настройки.

Дайте нам знать, что это такое, тогда мы сможем помочь вам установить то, что вам нужно.

2 голосов
/ 06 августа 2009

Вы убедились, что php.ini allow_url_fopen включен? Плюс default_socket_timeout?

; Следует ли разрешить лечение URL (например, http: // или ftp: //) как файлы. allow_url_fopen = On

; Разрешить ли включать / требовать открыть URL (например, http: // или ftp: //) как файлы. allow_url_include = Off

; Тайм-аут по умолчанию для сокетов потоки (секунды) default_socket_timeout = 60

Я согласен, это похоже на тайм-аут.

Вы работаете с PHP 5, если это так, вы можете попробовать file_get_contents ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...