заблокировать выполнение php-скрипта в ajax-запросе - PullRequest
0 голосов
/ 29 сентября 2018

Мое маленькое приложение работает следующим образом: при простом вводе текста пользователю предлагается ввести URL-адрес.При изменении мой скрипт пытается извлечь и отобразить первые 10 изображений, найденных на этой странице.

<input type="text" name="url" id="url" value="">

$("form.link-form input#url").change(function() {
  var request =     $.ajax({
                      type: "GET",
                      url: "funzioni/ajax/loadImagestFromUrl.php",
                      data: "url=" + insertedUrl,
                      dataType: "html",
                      timeout: 5000,
                      success: function(res) {
                        loadUrlImages2div(msg99);
                      },
                      error: function() {
                         request.abort();
                      }
                    });
});

PHP-скрипт loadImagestFromUrl.php запустите этот код, используя PHP Simple HTML DOM Parser библиотека:

set_time_limit(5);
$html = file_get_html($url); // load into this variable the entire html of the page
$count=1;
foreach($html->find('img') as $key=>$element) { // only images
    if ($count==11) break; //only first 10 images
        echo "<img class=\"imgFromUrl\" src=\"".$element->src."\" />\n";
    }
    $count++;
}

Это прекрасно работает в большинстве случаев, но некоторые URL-адреса недоступны в течение нескольких секунд или не защищены паролем, и сервер продолжает что-то выполнять, даже если для тайм-аута установлено 5 секундajax-запрос и 5 секунд для выполнения php-кода.

Когда это происходит, все блокируется, даже обновление страницы невозможно, потому что она загружается и загружается и только через много времени возвращает «504 Gateway Time»-out. Сервер не ответил вовремя. "

Сможете ли вы помочь мне понять, как полностью заблокировать этот запрос и позволить серверу продолжать работать?

1 Ответ

0 голосов
/ 30 сентября 2018

Получил, что решение должно быть найдено в тайм-ауте php-кода, а не в ajax timeout.Это понятно

Я нашел это интересное обсуждение Отличный ответ: Обработка задержек при получении файлов с удаленного сервера в PHP , которая предлагает использовать параметр context в функции file_get_contents.Но на самом деле это не работает в моем приложении.

Итак, как предположил Вигер, я попытался использовать curl вместо содержимого file_get.Я определил эту функцию

function file_get_contents_curl($url) {
  $ch = curl_init();
  $timeout=2;

  curl_setopt($ch, CURLOPT_AUTOREFERER, TRUE);
  curl_setopt($ch, CURLOPT_HEADER, 0);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
  curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);       

  $data = curl_exec($ch);
  curl_close($ch);

  return $data;
}

и использовал ее вместо file_get_contents внутри библиотеки анализатора.

Опять же, она работает в большинстве случаев, но некоторые URL-адреса заставляют сервер загружаться в течение многихвремя до истечения времени ожидания шлюза.

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