fsockopen интернет соединение таймаут проверка доступности удаленного сервера

И снова о полезных PHP рецептах,  0 нужных каждый день PHP скриптах. В это статье речь пойдет о соединениях со сторонним сервером.

Такая ситуация возникает при необходимости сохранить данные  на сайт A, с определенной страницы сайта B.

В PHP для этих целей используется сетевая функция fsockopen . FSOCKOPEN открывает интернет соединения с указанным сервером. То что нам нужно!

Простой пример использования функции выглядит следующим образом:

<?
$getRemoteData = fsockopen("weblomaster.ru", 80, $errorN, $errorS, 15);
/* здесь: weblomaster.ru - хост сервера, к которому следует подключится; 80 - порт сервера, восьмидесятый стандартный порт Апач; $errorN - в эту переменную, в случае ошибки соединения, записывается номер ошибки ; $errorS - текст ошибки, если она имела место; 15 - таймаут соединения в секундах */
$header = "GET /file.php HTTP/1.1\r\n";
$header .= "Host: weblomaster.ru\r\n";
$header .= "Connection: Close\r\n\r\n";
fwrite($getRemoteData, $header);
/* осуществляем сам HTTP запрос, не забыв указать параметры соединения с помощью переменной $header;
Обратите Внимание: мы получаем файл file.php - таким образом Вы можете указать любой конкретный файл или директорию внешнего сайта */
while (!feof($getRemoteData)) {
echo fgets($getRemoteData, 1024);
}
/* выводим на экран полученные данные; страница, которую мы запросили, разбита на строки. Функция feof проверяет достигнут конец файла или нет. Функция fgets выводит данные построчно, пока (цикл while) не достигнут конец файла. При этом fgets следит чтобы строка не превышала 1024 байта (обычно это число равно максимальному количеству символов на одну строку). Вы можете указать число больше или меньше 1024. Но помните, что увеличение лимита может замедлить работу Вашего скрипта. */
fclose($getRemoteData);
/* здесь закрываем открытое соединение */
?>

Можно было бы этим и ограничиться. Но у нас будет ещё одна задача. Не просто получить данные, но и проверить доступность сайта, с которого мы берем информацию. Ведь если удаленный сервер недоступен, наш скрипт будет работать с сильным таймаутом, возможно тормозя работу всего нашего сайта.

Пишем полноценный скрипт с акцентом на возможные ошибки соединения и указываем жесткий таймаут работы скрипта:
<?
@set_time_limit(3);
@ini_set('set_time_limit', '3');
@ini_set('max_execution_time', '3');
/* этими тремя строчками задаем время, после которого сервер перестает ждать завершение работы скрипта - три секунды */
$getRemoteData = fsockopen("weblomaster.ru", 80, $errorN, $errorS, 6);
if (!$getRemoteData) {
echo "Невозможно соединиться! Сервер упал? Код: $errorN . Ошибка : $errorS . \n";
exit();
}
$header = "GET /file.php HTTP/1.1\r\n";
$header .= "Host: weblomaster.ru\r\n";
$header .= "Connection: Close\r\n\r\n";
fwrite($getRemoteData, $header);
@stream_set_timeout($getRemoteData, 3);
/* ещё один способ установить таймаут 3 секунды */
$info = stream_get_meta_data($getRemoteData);
/* получаем информацию о потоке */
if ($info['timed_out']) {
echo 'Истекло время соединения! Сервер упал?';
fclose($getRemoteData);
exit();
}
/* если в данных о потоке есть сообщение о таймауте останавливаем скрипт , сообщаем о проблеме . */
while (!feof($getRemoteData)) {
$result.= fgets($getRemoteData, 1024);
}
/* если всё в порядке, записываем данные в переменную $result */fclose($getRemoteData);
echo $result;
/* выводим полученные данные . Внимание: будьте осторожны с полученными данными. Обработайте их на предмет запрещенных символов, перед тем как выводить или записывать на Вашем сайте. */
?>

Опубликовано 26.06.2015 в 17:29 · Автор Вебдизайнеру, сисадмину, вебмастеру · Ссылка
Рубрики: PHP программирование · Теги: , , , , , , , , , , , , , ,