Модераторы: Aliance, IZ@TOP, SamDark, skyboy, MoLeX, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> задать таймаут xml-ке 
V
    Опции темы
bars80080
Дата 21.6.2011, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор воюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12003
Регистрация: 5.12.2007
Где: Königsberg

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



есть у меня сервис, который формирует запрос к внешнему источнику, получает xml-ку, разбирает её и далее я с ней работаю.

сейчас я использую такую штуку и всё работает:

Код

        $xmlParser = xml_parser_create();
        $caseFold = xml_parser_get_option($xmlParser, XML_OPTION_CASE_FOLDING);
        $targetEncoding = xml_parser_get_option($xmlParser, XML_OPTION_TARGET_ENCODING);
        if($caseFold == 1) { xml_parser_set_option($xmlParser, XML_OPTION_CASE_FOLDING, false); }
        
        $mStart = array($this, 'openTag'); 
        $mEnd = array($this, 'closeTag'); 
        $mCont = array($this, 'contentTag');
        
        xml_set_element_handler($xmlParser, $mStart, $mEnd);
        xml_set_character_data_handler($xmlParser, $mCont);
        if(!($fp = fopen($addres, 'r'))) { return false; }
        stream_set_timeout($fp, 10);
        while($data = fread($fp, 4096)) { 
            $info = stream_get_meta_data($fp);
            if($info['timed_out']) { return false; }
            if(!xml_parse($xmlParser, $data, feof($fp))) {
                xml_parser_free($xmlParser);
                fclose($fp); return false;
            }
        }
        fclose($fp);                     
        xml_parser_free($xmlParser);


однако, у сервиса есть такая проблема, что он может очень долго отвечать (минуту, две минуты). пока он там соображает, клиент уйдёт.
с другой стороны, этот сервис не единственный, поэтому я бы не прочь его просто остановить при превышении таймлимита

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

пытался выковать в нём настройки - временных не нашёл
быстрый прогляд не дал обнаружить временных настроек для классов DOM XML и SimpleXML

возможно ли сделать как-нибудь такой стоп-кран?

Добавлено через 5 минут и 8 секунд
п.с. stream_set_timeout не помогает
PM MAIL   Вверх
MoLeX
Дата 21.6.2011, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Просто пингвин
****


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

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



а если часть функция возложить на курл?
PM MAIL WWW ICQ   Вверх
bars80080
Дата 21.6.2011, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор воюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12003
Регистрация: 5.12.2007
Где: Königsberg

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



имеется ввиду открыть cURL, послать запрос, получить какие-то данные, а затем их распарсить каким-то макаром?

а у курла есть таймаут

интересная мысль

Добавлено через 1 минуту и 38 секунд
а нет ли средства сразу передать выход курла на выше показанный код?

на строку         if(!($fp = fopen($addres, 'r'))) { return false; } к примеру.
там какой-нибудь fopen('php://input') ?

PM MAIL   Вверх
bars80080
Дата 21.6.2011, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор воюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12003
Регистрация: 5.12.2007
Где: Königsberg

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



охренеть, у меня аж сразу всё залетало. то ли сервис пробил на скорость, то ли устранил какую-то глобальную тормозюку

рабочий код:

Код

        $ch = curl_init();  
        curl_setopt($ch, CURLOPT_URL, $url); // set url to post to  
        curl_setopt($ch, CURLOPT_FAILONERROR, 1);  
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);// allow redirects  
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // return into a variable  
        curl_setopt($ch, CURLOPT_TIMEOUT, 20); // times out after 4s  
        curl_setopt($ch, CURLOPT_POST, 1); // set POST method  
        //curl_setopt($ch, CURLOPT_POSTFIELDS, "url=index%3Dbooks&field-keywords=PHP+MYSQL"); // add POST fields  
        $result = curl_exec($ch); // run the whole process  
        curl_close($ch);
        
        if(empty($result)) { return array(); }
        
        $xmlParser = xml_parser_create();
        $caseFold = xml_parser_get_option($xmlParser, XML_OPTION_CASE_FOLDING);
        $targetEncoding = xml_parser_get_option($xmlParser, XML_OPTION_TARGET_ENCODING);
        if($caseFold == 1) { xml_parser_set_option($xmlParser, XML_OPTION_CASE_FOLDING, false); }
        $mStart = array($this, 'openTag'); $mEnd = array($this, 'closeTag'); $mCont = array($this, 'contentTag');
        xml_set_element_handler($xmlParser, $mStart, $mEnd);
        xml_set_character_data_handler($xmlParser, $mCont);
        
        if(!xml_parse($xmlParser, $result)) {
            xml_parser_free($xmlParser);
            return array();
        }
        xml_parser_free($xmlParser);

PM MAIL   Вверх
Google
  Дата 23.9.2017, 08:27 (ссылка)  





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


 




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


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

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