Warning: array_merge(): Argument #2 is not an array in /hsphere/local/home/magistr/codeismy.name/wp-content/plugins/wp-pagenavi/scb/Options.php on line 46

Работа с сокетами. Небольшой пример получения контента странички

Дата: Март 22, 2009

(3) комментариев

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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://

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

1
2
3
4
5
6
7
8
$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;  // Указыв

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

1
2
3
4
5
6
7
8
$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";

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

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

1
$socket = fsockopen( $server, $port, $errno, $errstr, $timeout );

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

1
2
3
4
5
6
if (!$socket) {
echo "$errstr ($errno)<br>\n";
exit;
} else {

fwrite( $socket, $request );

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

1
2
3
$ret = '';
while ( !feof( $socket ) ) {
$ret .= fgets( $socket, 4096 );

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

1
2
fclose( $socket );
return $ret;

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

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

$content = new Socket(‘http://codeismy.name/’);

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

a




    3 комментариев на "Работа с сокетами. Небольшой пример получения контента странички"

    Евгений сказал:
    04.08.2009

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

    А как потом пользоваться этой переменной?, какой у нее тип?
    Я хотел посмотреть, что из этого выйдет, и вышла вот такая ошибка:

    Catchable fatal error: Object of class socket could not be converted to string in…

    Подскажи пожалуйста в чем может быть проблема. Спасибо.

    Евгений сказал:
    04.08.2009

    Дополнение.
    я писал так:
    $content = new Socket(’http://codeismy.name/’);
    echo $content;

    magistr_bender сказал:
    15.08.2009

    тип у неё Object, тобиш она является обїектом.. пользоваться как и любім другим обїектом класса
    попробуй сделать принт и увидиш результат

    а вообще если хочеш, чтоб біло проще(так как это бул кусок моего другого класса) можеш вместо
    return $ret; (строка 38) поставить
    $this->result=$ret;
    и объявить переменную $result в самом начале. тогда результат можно будет получить так

    $content = new Socket(’http://codeismy.name/’);
    $text= $content->tesult;
    и в переменную $text попад’т весь результат

    Продолжение дискуссии на форуме: link


    Вы можете продолжить обсуждение этой статьи на форуме


    Имя : 
    Почта : 
    Сайт : 
    Комментарий : 

    Проверка комментариев включена. Прежде чем Ваши комментарии будут опубликованы пройдет какое-то время.

    Создание сайта - Echo-group Раскрутка сайтов