Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ 1 сообщение ] 
Автор Сообщение
СообщениеДобавлено: 2012-09-18 02:59 
Не в сети
Аватара пользователя
Раздал: 40.11 ТБ
Скачал: 22.37 ГБ
Ратио: 1836.110


Зарегистрирован: 2012-04-30 00:48
Сообщения: 353
В данной статье я хочу показать пример небольшой пример работы с сокетами в php, а именно получение контента странички (её html кода). Зачем это нужно? Ведь можно же просто воспользоваться функцией file_get_content. Так вот не на всех хостингах включена опция доступа по урлам :) этот пример поможет тем, кто столкнулся с данной проблеммой. И тем более мы не собираемся решать каких либо целевых задач, цель данной статьи научить читателя оптравлять и считывать пакеты.

Вот небольшой примерчик класса работы с сокетами

Код:
class socket {
public function socket($url)
{
$url = substr($url,7);
$timeout = 30; // Max time for stablish the conection

$server = substr($url,0,strpos($url,'/')); // IP address
$url = substr($url,strpos($url,'/'));
$host = $server; // Domain name
$target = substr($url,0,strpos($url,'?')); // Specific program
$referer = A_URL; // Referer
$port = 80;
$getValues = substr($url,strpos($url,'?'));

$request = "GET $target$getValues HTTP/1.1\r\n";
$request .= "Host: $host\r\n";
$request .= 'User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2.1) ';
$request .= "Gecko/20021204\r\n";
$request .= 'Accept: ';
$request .= 'text/html;q=0.9,text/plain;q=0.8,video/x-mng,image/png,';
$request .= "image/jpeg,image/gif;q=0.2,text/css,*/*;q=0.1\r\n";
$request .= "Connection: close\r\n\r\n";

$socket = fsockopen( $server, $port, $errno, $errstr, $timeout );
if (!$socket) {
echo "$errstr ($errno)<br>\n";
exit;
} else {

fwrite( $socket, $request );
$ret = '';

while ( !feof( $socket ) ) {
$ret .= fgets( $socket, 4096 );
}

fclose( $socket );
return $ret;
}
}
}


А теперь разберём его подробно :)

Заголовок нашей функци public function socket($url) говорит о том, какой метод мы вызываем и с каким параметром. Думаю нет смысла обяснить что значит параметр $url :) могу только добавить, что заголовок должен обязательно начинаться в нашем случае с http://

Первым делом мы как всегда производим конфигурирование

Код:
$url = substr($url,7);
$timeout = 30; // Максимальное время ответа

$server = substr($url,0,strpos($url,'/')); // сервер
$url = substr($url,strpos($url,'/'));
$host = $server; // Доменное имя
$target = substr($url,0,strpos($url,'?')); // обрубываем урл и оставляем нужные заголовки
$port = 80;  // Указываем


Далее вы должны собрать строку заголовка которую мы пакетом отправим на сервер.

Код:
$request = "GET $target$getValues HTTP/1.1\r\n";
$request .= "Host: $host\r\n";
$request .= 'User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2.1) ';
$request .= "Gecko/20021204\r\n";
$request .= 'Accept: ';
$request .= 'text/html;q=0.9,text/plain;q=0.8,video/x-mng,image/png,';
$request .= "image/jpeg,image/gif;q=0.2,text/css,*/*;q=0.1\r\n";
$request .= "Connection: close\r\n\r\n";


Подробнее о заголовках я расскажу в своей следующей статье на тему сокетов.

Теперь полученные заголовки нам необходимо отослдать на сервер для чего мы и будем использовать сокеты.Первым делом нам необходимо открыть сокет:

Код:
$socket = fsockopen( $server, $port, $errno, $errstr, $timeout );


Далее производим отправку нужного нам заранее сгенерированого пакета

Код:
if (!$socket) {
echo "$errstr ($errno)<br>\n";
exit;
} else {

fwrite( $socket, $request );


И читаем ответ сервера

Код:
$ret = '';
while ( !feof( $socket ) ) {
$ret .= fgets( $socket, 4096 );


Закрываем сокет и возвращаем ответ

Код:
fclose( $socket );
return $ret;


Всё очень просто :)

общее использование класса

$content = new Socket(‘http://newsrbk.ru/’);

результатом будет запись в переменную $content всего содержимого странички

Кто не понял как вывести переменную $content вот пример:

Код:
$content = new Socket('http://newsrbk.ru/');
echo $content;


Вернуться к началу
 Профиль  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ 1 сообщение ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Переместиться наверх
 Главная |  Список форумов |   Time : 0.608s | 14 Queries | GZIP : Off |