Модераторы: Aliance, skyboy, MoLeX, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Загружается лиш часть кода Stream_socket_client, Заугрзка удаленного сайта 
:(
    Опции темы
Sun_ok
Дата 22.8.2009, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 4.9.2006

Репутация: нет
Всего: нет



Здравствуйте уважаемые.
Написал несложный класс многопоточного грабинга ресурсов с использованием stream_socket_client
Работает непонятно, одни сайты грабит нормально а другие лиш часть и останавливаются на определенном месте.
вот основные функции создание и запуска потоков.

Код

    private    function createStreams(){
        
        foreach ($this->pages as $id => $connect) {
            
            $this->callback[$id] = $connect['callback'];
            
            if ($socket = @stream_socket_client($connect['url'],
                     $errno,
                        $errstr, 
                        30,
                        STREAM_CLIENT_ASYNC_CONNECT|STREAM_CLIENT_CONNECT)){
                         
                $this->sockets[$id]  = $socket;
                $this->status[$id]   = 2;
                $this->header[$id]   = $connect['header'];             
                   
                continue;
                        }            
            $this->status[$id]   = -1;
            $this->responce[$id] = "Error:  $errno $errstr";            
            $this->pageLoaded($id);
        }
      
       $this->_startStreamSocket();
    }


Запис и чтение потоков.
Код

private function _startStreamSocket(){    
        
        while($socket = current($this->sockets)) {        
            $read = $write = $this->sockets;
            $stream = @stream_select($read, $write, $e = null, $timeout);
           
            if ($stream > 0) {
                foreach ($read as $r) {        
                  $id = array_search($r, $this->sockets);                    
                    $data = fread($r, 8192); 
                    if (strlen($data) == 0) {
                     if ($this->status[$id] == 2) {
                            $this->status[$id] = 4;                    
                        }else{
                         $this->status[$id] = 3;
                        }                                             
                        fclose($r);        
                        $this->pageLoaded($id);       //  Удаляет из массива отработанные соединения. $this->sockets          
                         
                    } else {$this->responce[$id] .= $data;  }
                    
                }

                foreach ($write as $w) {
                    $id = array_search($w, $this->sockets);
                    @fputs($w, $this->header[$id],strlen($this->header[$id]));                                     
                    $this->status[$id] = 2;                   
                }
                
            } else {
                foreach ($this->sockets as $id => $s) {                 
                    $this->status[$id] = 'Time Out: ' . $this->status[$id];                   
                }
                break;
            }        
        }
    }


С заголовком извращался по всякому, не помогает.
Код

/// формирование заголовка 
    static public function makeHeader($url, $method = 'GET', $param = '', $cookie = ''){    
        $url = parse_url($url);                
        $url['path'] = isset($url['path'])?$url['path']:'/';    
        $url['query'] = isset($url['query'])?'?'.$url['query']:'';
        $url['scheme'] = $url['scheme'] == 'http'?'tcp':($url['scheme'] == 'https'?'ssl':$url['scheme']);
        
        $host = "{$url['scheme']}://{$url['host']}:".($url['scheme']=='ssl'?443:80);
        $header = "$method {$url['path']}{$url['query']} HTTP/1.0 \r\n".
            "User-Agent: {$_SERVER['HTTP_USER_AGENT']} \r\n".
            "Host: {$url['host']} \r\n".
            ($method == 'GET'?"Content-type: text/html; charset=iso-8859-1\r\n":"Content-Type: application/x-www-form-urlencoded \r\n").
            "Accept: text/html \r\n".
            ($method == 'POST'?"Content-length: ".strlen($param)." \r\n":'').
            "Connection: close \r\n".
            ($cookie == ''?"\r\n":"Cookie: ".$cookie." \r\n\r\n").
            ($param  == ''?'':$param ."\r\n\r\n");
        
        return array('header'=>$header,'host'=>$host);    
    }




Это сообщение отредактировал(а) Sun_ok - 22.8.2009, 18:14
PM MAIL WWW   Вверх
Sun_ok
Дата 22.8.2009, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 4.9.2006

Репутация: нет
Всего: нет



Подскажите хотя бы в какую сторону копать, в чем может быть проблема ?
PM MAIL WWW   Вверх
IZ@TOP
Дата 23.8.2009, 01:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: нет
Всего: 73



К сожалению с такой проблемой не встречался, но могу посоветовать использовать для подобных действий CURL.


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
Sun_ok
Дата 23.8.2009, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 4.9.2006

Репутация: нет
Всего: нет



Спасибо за ссылку, уже сам подумываю переписать все под CURL.
Ещо посмотрел оказывается многие сайты мой скрипт загружает не до конца, то на пол теге </HTM остановится то ещё где-то.
Вобщем буду переписывать, а то тут не понять совсем.  
Спасибо IZ@TOP
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Сеть | Следующая тема »


 




[ Время генерации скрипта: 0.0472 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.