Простой HTML DOM — не удалось открыть поток: время ожидания подключения

Здравствуйте, я разместил свой веб-сайт на бесплатном хостинге (5gbfree.com) и создал здесь функцию, которая извлекает курс песо к доллару на основе сайта http://ppa.com.ph??q=fcer_view, где он просто выбирает элемент a.active и получает значение в виде открытого текста. Вчера он работал, но когда я снова проверил его сегодня утром, он не смог получить. Таким образом, он вернет значение по умолчанию, равное 50.

журнал ошибок:

[09-Apr-2017 13:49:32 Asia/Manila] PHP Warning: file_get_contents(http://www.ppa.com.ph/?q=fcer_view): failed to open stream:     Connection timed out in /home/rasibaseport/public_html/simple_html_dom2.php on line 75

Я использую простой html DOM. Вот функция.

include "simple_html_dom2.php";

function PPA_peso_dollar_rate(){
// Create DOM from URL or file
error_reporting(E_ALL);
ini_set("display_errors", 0);
ini_set('default_socket_timeout', 15);
$html = file_get_html("http://www.ppa.com.ph/?q=fcer_view");
$ret = 0;
if($html === false){
    $ret = 50;
}else {
    foreach($html->find('a[class=active]') as $e) 
    $ret = $e->plaintext;
    $explode = explode(" ", $ret);

    $ret = 50;
    foreach($explode as $ex){
        if(is_numeric($ex)){
            $ret = $ex;
        }
    }
    if($ret == 0) $ret = 50;
}

echo $ret;
}

К сожалению, 5gbfree отключила функцию curl_init().

curl_init() has been disabled for security reasons in /home/rasibaseport/public_html/config.php on line 38

Здесь есть работа? Я ценю любую помощь. Большое тебе спасибо.

Редактировать: я забыл упомянуть, что при тестировании с помощью localhost(xampp) ожидаемое возвращаемое значение является правильным, без ошибок и предупреждений. Работает отлично.

ОБНОВЛЕНИЕ: после того, как вы попробовали обновленное решение @Rafiq, ничего не сработало. Это дало мне аналогичную ошибку.

[09-Apr-2017 20:18:53 Asia/Manila] PHP Warning:  file_get_contents(http://www.ppa.com.ph/?q=fcer_view): failed to open stream: Connection timed out in /home/rasibaseport/public_html/simple_html_dom2.php on line 46

person legitghost    schedule 09.04.2017    source источник


Ответы (1)


Ваш код работает для меня. Его проблема во времени выполнения. Добавьте следующий код, чтобы увеличить максимальное время выполнения.

ini_set('max_execution_time', 300); //300 seconds = 5 minutes
ini_set('default_socket_timeout', 100); // 100 seconds = 1 Minutes 40 sec
//call the function file_get_html();

Пояснение параметра max_execution_time внутри ini_set функция

Это устанавливает максимальное время в секундах, в течение которого скрипту разрешено работать, прежде чем он будет завершен синтаксическим анализатором. Это помогает предотвратить зависание сервера из-за плохо написанных сценариев. Настройка по умолчанию – 30. Подробнее см. Конфигурация выполнения

Чтобы избавиться от следующих двух ошибок, используйте fetch_http_file_contents($url) вместо file_get_contents($url) внутри simple_html_dom.php в строке 75.

file_get_contents(): не удалось открыть поток: нет маршрута к хосту

file_get_contents(): не удалось открыть поток: время ожидания соединения истекло

function fetch_http_file_contents($url) {
  $hostname = parse_url($url, PHP_URL_HOST);
  if ($hostname == FALSE) {
    return FALSE;
  }

  $host_has_ipv6 = FALSE;
  $host_has_ipv4 = FALSE;
  $file_response = FALSE;

  $dns_records = dns_get_record($hostname, DNS_AAAA + DNS_A);

  foreach ($dns_records as $dns_record) {
    if (isset($dns_record['type'])) {
      switch ($dns_record['type']) {
        case 'AAAA':
          $host_has_ipv6 = TRUE;
          break;
        case 'A':
          $host_has_ipv4 = TRUE;
          break;
  } } }

  if ($host_has_ipv6 === TRUE) {
    $file_response = file_get_intbound_contents($url, '[0]:0');
  }
  if ($host_has_ipv4 === TRUE && $file_response == FALSE) {
    $file_response = file_get_intbound_contents($url, '0:0');
  }

  return $file_response;
}

function file_get_intbound_contents($url, $bindto_addr_family) {
  $stream_context = stream_context_create(
                      array(
                        'socket' => array(
                          'bindto' => $bindto_addr_family
                        ),
                        'http' => array(
                          'timeout'=>20,
                          'method'=>'GET'
                    ) ) );

  return file_get_contents($url, FALSE, $stream_context);
}

Источник Сделать file_get_contents() более надежным для маршрутизации и двойным стеком

person Rafiqul Islam    schedule 09.04.2017
comment
Большое спасибо! Ты только что спас мне жизнь. Ха-ха. Можете ли вы объяснить или дать мне ссылку, объясняющую, что делает ini_set('max_execution_time', seconds);? Просто немного любопытно. В любом случае большое спасибо :) - person legitghost; 09.04.2017
comment
@ghost я добавил в ответ - person Rafiqul Islam; 09.04.2017
comment
Ммм это странно. Я только что попробовал это сейчас, и это снова не работает. Те же журналы ошибок в error_log - person legitghost; 09.04.2017
comment
Увеличьте значение default_socket_timeout по умолчанию, равное 60, но в вашем коде оно равно 15, что иногда закрывает соединение, если процесс не завершается в течение 15 секунд. Поэтому увеличьте время до 60 или 100 в коде ini_set('default_socket_timeout', 15); - person Rafiqul Islam; 09.04.2017
comment
К сожалению, все вышеперечисленное не сработало, установка ini_set('default_socket_timeout', 60);, добавление функции fetch_http_file_contents($url) и замена fetch_file_get_contents($url) в строке 75 файла simple_html_dom.php. Я обновил свой пост для получения дополнительной информации. - person legitghost; 09.04.2017
comment
установить время по умолчанию на 100 или более ini_set('default_socket_timeout', 100); и удалить fetch_http_file_contents. Эта работа для меня - person Rafiqul Islam; 12.04.2017