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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Долго грузит Сайт и проблема с сокетами, file(); $fp = fsockopen( $p, 80); ... 
:(
    Опции темы
EugenyPavlenko
  Дата 9.4.2008, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Здравствуйте,

Все что мне нужно, это загрузить содержание сайта в массив по строчкам.

Делаю так:

Код

<?php
    //set_time_limit(2);
    
    $p = "www.mysite.com";
    
    $lines = file ( $p );
    
    foreach ($lines as $line_num => $line) {
        echo $line."\n";
    }
?>


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

Я пробовал грузить сайты большого содержание (40000 символов) и совсем маленькие: 129 символов...

Те что маленькие и среднии они грузились 15 секунд и выводились А те которые побольше - занимало
15-20 секунди вывод...

Я не могу понять в чем дело: почему он ждет 15 секунд и потом начинает что-то делать?
или почему он тормозит? чего он ждет? Я планировал что он просто загрузит и сразу выведет..
т.е скорость работы зависит от размера загружаемого сайта... но грузить файл 129 байт 15 секунд....

Если предположить, что там лимит на выполнение скрипта 15 секунд, то зачем он все это время что-то там делает?

Пробовал установить лимит 2 секунды но мне выдалась ошибка что я не могу это сделать из-за какого-то safe_mode


Так же я пробовал действовать через сокеты:
Код

    $fp = fsockopen( $p, 80);
    
    if (!$fp) {
       echo "Unable to open\n";
    } else {
         while (!feof($fp)) {
            //echo fgets($fp, 128);
            echo fgets($fp);
        }
        
        fclose($fp);
    }


Выдает вот что:
Цитата

Warning: fsockopen() [function.fsockopen]: php_network_getaddresses: getaddrinfo failed: Name or service not known in /var/www/web67/html/call.php on line 23

Warning: fsockopen() [function.fsockopen]: unable to connect to www.mysite.com/123.html:80 (Unknown error) in /var/www/web67/html/call.php on line 23
Unable to open 


23 строчка это там где сокет открывается....


Не подскажете как мне решить проблему 15-ти секунд и что там за недоразумение с сокетом?

Заранее спасибо!
PM WWW   Вверх
Fortop
Дата 10.4.2008, 00:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

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



1. размер загружаемого сайта
2. время тратится на соединение твоего сайта с чужим, и только затем отдается информация тебе.
Т.е. еще скорость соединения.
3. Что у тебя содержится в $p?
Порт, вообще-то, задается вот так - http://www.mysite.com:8080/123.html или http://www.mysite.com:21/123.html
В зависимости от того, на какой ты подключаешься.



--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
EugenyPavlenko
Дата 10.4.2008, 08:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Fortop, 

так что, он так долго соединяется с сервером?

в $p у меня название хоста как в цитате...

Менял на: www.mysite.com

- ошибка пропала, НО грузится он теперь 25 секунд и в ответ всегда выдает:

Код

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=windows-1251"></HEAD>
<BODY></BODY></HTML>


 smile 

Это сообщение отредактировал(а) Dzuchara - 10.4.2008, 08:40
PM WWW   Вверх
MoLeX
Дата 10.4.2008, 09:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

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



Dzuchara, я уже в какойто теме вылаживал скрипт основоный на сокетах, поищи... (да и не я один вылаживал), время загрузки там не как 15 и 25... гораздно меньше...


Цитата(Fortop @  10.4.2008,  00:12 Найти цитируемый пост)
время тратится на соединение твоего сайта с чужим, и только затем отдается информация тебе.

вот ответ почему так долго происходит

Добавлено через 5 минут и 42 секунды
во, еле как нашел
Код

<?php
class StealText
{
    public function UrlGetContents($url, $timeout = 5)
    {
        $url_parsed = parse_url($url);
        $host = $url_parsed["host"];
    
        if ($url == "" || $host == "") 
        {
            return false;
        }
    
        $hostName = gethostbyname($host);
        $ip = ip2long($hostName);
           
        if ($ip === -1 || $ip === false) 
        {
            return false;
        }
            
        $port = ($url_parsed["port"] == 0 ? 80 : $url_parsed["port"]);
        $path = (empty($url_parsed["path"]) ? "/" : $url_parsed["path"]);
        $path.= (!empty($url_parsed["query"]) ? "?".$url_parsed["query"] : "");
        $out = "GET ".$path." HTTP/1.0\r\nHost: ".$host."\r\nConnection: Close\r\n\r\n";
        $fp = fsockopen($host, $port, $errno, $errstr, intval($timeout));
            
        if (!$fp) 
        {
            return false;
        }
               
        stream_set_timeout($fp, intval($timeout));
        fwrite($fp, $out);
    
        $headers = "";
        $content = "";
        $buf = "";
        $isBody = false;
            
        while (!feof($fp)) 
        {
            $buf = fgets($fp, 1024);
            
            if ($isBody) 
            {
                $content .= $buf;
            } 
            else    
            {
                $headers .= $buf;
            }
                    
            if ($buf == "\r\n") 
            {
                $isBody = true;
            }
        }
               
        preg_match("#HTTP/1.[0-9]{1}\s+([0-9]{3}).*#is", $headers, $match);
        fclose($fp);
        if($match[1] != 200) 
        {
            return false;
        }
               
        return array("headers" => $headers, "body" => $content);
    }
    
    public function ErrorUrl()
    {
        echo "Хм, урл какой то кривой однако.";
    }
    
    public function PrintContents($msg, $Value)
    {
        if($Value == "true")
        {
            echo $msg.str_repeat("<br>", 3)."\n";
        }
    }
    
    public function PrintHeaders($msg, $Value)
    {
        if($Value == "true")
        {
            echo $msg;
        }
    }        
}



$go = new StealText();

if (($HTML = $go->UrlGetContents("http://www.mysite.com/index.php")) === false) 
{
    $go->ErrorUrl();
} 
else 
{
    $go->PrintHeaders($HTML["headers"], true);
    $go->PrintContents($HTML["body"], true);
}
?>


может и не пригодиться)


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
Fortop
Дата 10.4.2008, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

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



Цитата(Dzuchara @  10.4.2008,  08:39 Найти цитируемый пост)
- ошибка пропала, НО грузится он теперь 25 секунд и в ответ всегда выдает:

сходи сюда почитай по то, как устанавливать таймаут при соединении и чтении из сокетов.
http://ua2.php.net/manual/ru/function.fsockopen.php


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
capitan
Дата 10.4.2008, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 27.2.2005
Где: Москва

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



Dzuchara, забудь про сокеты и исспользуй CURL http://ru2.php.net/manual/ru/function.curl-setopt.php
PM MAIL WWW ICQ   Вверх
EugenyPavlenko
Дата 10.4.2008, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



MoLeX, 

твой скрипт грузит точно 20 сек. и ВЫВОДИТ! (сокеты заработали!)

Fortop, 

никакой тайм-аут не помогает...

Добавлено через 12 минут
capitan, 

Код

<?php
// инициализация сеанса
$ch = curl_init();

// установка URL и других необходимых параметров
curl_setopt($ch, CURLOPT_URL, "http://www.example.com/");
curl_setopt($ch, CURLOPT_HEADER, 0);

// загрузка страницы и выдача её браузеру
curl_exec($ch);

// завершение сеанса и освобождение ресурсов
curl_close($ch);
?> 



ровно 15 секунд работает и выводит...

Меня смущает что РОВНО 15, не 12 и 13 и не 17, а всегда ровно 15.. странно...

PM WWW   Вверх
mishaSL
Дата 10.4.2008, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1046
Регистрация: 10.1.2007
Где: Санкт-Петербург

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



Dzuchara, а если вариант с cUrl-ом попробовать:
http://forum.vingrad.ru/forum/topic-163191...-fsockopen.html


--------------------
Лучший способ научиться программированию - это посмотреть как это делают другие...
PM MAIL   Вверх
Fortop
Дата 10.4.2008, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

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



Цитата(Dzuchara @  10.4.2008,  12:38 Найти цитируемый пост)
никакой тайм-аут не помогает...

У сокетов есть 2ва вида таймаута.
1. Таймаут на коннект
2. на чтение запись потока http://ua2.php.net/manual/ru/function.stream-set-timeout.php

3. Насчет 15 секунд smile ты ведь один и тот же сайт читаешь? Если он не меняется - то в этом нет ничего удивительного.
Попробуй прочесть с другого сайта, например www.google.com
И посмотри на результат.

И вообще, в чем конкретно у  тебя задача? Зачем тебе читать страницу в массив?


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
EugenyPavlenko
  Дата 10.4.2008, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Всем большое спасибо! 

Вы не поверите, но сейчас запускаю те же скрипты, но работают уже как надо - практически моментом... не пойму в чем дело.
Наверное хостер что-то исправил....

Кстати на   google.com  наверное какая-то блокировка, потому что пишет вот что:
Код

print "Адрес <b>".$urlAddress."</b> в данный момент недоступен";


Использую этот код:
Код

    function urlGetContents($url, $timeout = 8)
    {
       $url_parsed = parse_url($url);
       $host = $url_parsed["host"];

       if ($url == '' || $host == '') {
           return false;
       }
       $hostName = gethostbyname($host);
       $ip = ip2long($hostName);
       if ($ip === -1 || $ip === false) {
            return false;
       }
       $port = ($url_parsed["port"] == 0 ? 80 : $url_parsed["port"]);
       $path = (empty($url_parsed["path"]) ? '/' : $url_parsed["path"]);
       $path.= (!empty($url_parsed["query"]) ? '?'.$url_parsed["query"] : '');
       $out = "GET $path HTTP/1.0\r\nHost: $host\r\nConnection: Close\r\n\r\n";
       $fp = fsockopen($host, $port, $errno, $errstr, intval($timeout));
       if (!$fp) {
           return false;
       }
       stream_set_timeout($fp, intval($timeout));
       fwrite($fp, $out);

       $headers = '';
       //$content = '';
       $content = array();
       $buf = '';
       $isBody = false;
       while (!feof($fp)) {
            //$buf = fgets($fp, 1024);
            $buf = fgets($fp);
            if ($isBody) {
                //$content .= $buf;
                $content[] = $buf;
            } else {
                $headers .= $buf;
            }
            if ($buf == "\r\n" ) {
                $isBody = true;
            }
       }
       preg_match('#HTTP/1.[0-9]{1}\s+([0-9]{3}).*#is', $headers, $match);
       fclose($fp);
       if($match[1] != 200) {
           return false;
       }
       return array('headers'=>$headers,'body'=>$content);
    }



Fortop, 

Цитата

И вообще, в чем конкретно у  тебя задача? Зачем тебе читать страницу в массив? 



А зачем мне читать страницу просто так?  smile  Я читаю в массив, чтобы сделать кое-какие преобразования (вставить свой сервис) и вывести.

Моя задача: предоставление одного сервиса...

НО: Для клиента_моего_клиента, когда он заходит на сайт моего_клиента, все должно выглядеть так,
как будто сервис работает с сайта_клиента... т.е все содержание сайта_клиента должно оставаться + выводится мой сервис...

По-этому когда к_м_к заходит на сайт м_к и жмет что-то на подобие "сабмит" идет запрос мой сайт,
который берет содержание страницы откуда пришел к_м_к, обрабатывает его (вставляет в нужное место нужный код)
и выводит... К_м_к кажется, что он остался на сайте м_к, но в УРЛ прописан уже мой сайт (недостаток).

Я хотел делать через Ифрейм - но он глючит.
Еще можно делать простым попАпом, но попапы не все любят, не всем подходят..
Еще хотел делать Аяксом, но оказывается политика безопасности не позволяет грузить содержимое др. сайтов...
А у этого варианта (при умелой реализации) только недостаток только то что в УРЛ будет уже мой прописан...


Anyway, всем огромное спасибо!

П.С: я все-таки надеюсь, что это мой хостер исправил, а не "само" исправилось.
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




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


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

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