Ограничить время выполнения функции

Тема в разделе "PHP", создана пользователем phillip, 2 май 2009.

Статус темы:
Закрыта.
Модераторы: latteo
  1. phillip

    phillip

    Регистр.:
    4 сен 2007
    Сообщения:
    413
    Симпатии:
    15
    Как ограничить во времени именно одну функцию? Мне нужно сделать $xml = simplexml_load_file($rss_link);
    И если в течении 20 секунд не получилось загрузить $rss_link, то сделать
    echo "Проблема с загрузкой"; а если получилось загрузить, то echo "Все окей";
    Если использовать просто set_time_limit то по истечении срока будет ведь просто завершение работы скрипта. Типа break; А мне надо чтобы работа продолжилась, но были выполнены другие действия
     
  2. jik

    jik

    Регистр.:
    11 мар 2009
    Сообщения:
    243
    Симпатии:
    133
    можно через curl вытащить страницу с сервера (в curl есть свой таймаут), затем спокойно отпарсить.
     
  3. phillip

    phillip

    Регистр.:
    4 сен 2007
    Сообщения:
    413
    Симпатии:
    15
    curl не прилагается на хосте. Его в рассчет не берем, к сожалению :confused:
     
  4. PapaJoe

    PapaJoe

    Регистр.:
    4 авг 2008
    Сообщения:
    620
    Симпатии:
    312
    phillip, можно попробывать залить на хост модуль курла и подцепить его ф-цией dl()
    Конечно, если сервер не отключил эту функцию.
     
  5. phillip

    phillip

    Регистр.:
    4 сен 2007
    Сообщения:
    413
    Симпатии:
    15
    неохото мне с curl работать. Потом придется скрипт переносить- и опять где-нибудь да не получится curl включить, как обычно( Да и переделывать много. Парсер то придется переписывать заново. Неужели без курла нет способа? :confused:
     
  6. jik

    jik

    Регистр.:
    11 мар 2009
    Сообщения:
    243
    Симпатии:
    133
    получение страницы через сокеты:

    PHP:
    function get_page_($url$post = array()){
        
    $post_string "";
        if(
    count($post) > 0) foreach($post as $key=>$val)
                
    $post_string .= $key.'='.urlencode(iconv('windows-1251''UTF-8'$val)).'&';
        
    $connect_type "GET ";
        if(
    $post_string != ""$connect_type "POST ";
        
    $headers $connect_type.$url." HTTP/1.0\r\n";
        
    $headers .= "Host: ".parse_url($urlPHP_URL_HOST)."\r\n";
        
    $headers .= "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.1) Gecko/2008070208 Firefox/3.0.1\r\n";
        
    $headers .= "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n";
        
    $headers .= "Accept-Language: ru,en-us;q=0.7,en;q=0.3\r\n";
        
    $headers .= "Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7\r\n";
        
    $headers .= "Keep-Alive: 300\r\n";
        
    $headers .= "Connection: keep-alive\r\n";
        
        if(
    $post_string != ""){
            
    $post_string mb_substr($post_string0, -1);
            
    $headers .= "Content-Type: application/x-www-form-urlencoded\r\n";
            
    $headers .= "Content-Length: ".mb_strlen($post_string'UTF-8')."\r\n\r\n";
            
    $headers .= $post_string;
        }else{
            
    $headers .= "\r\n";
        }
        
    $fp stream_socket_client(
        
    "tcp://".parse_url($urlPHP_URL_HOST).":80",
        
    $errno$errstr7); // 7 - timeout
        
    fwrite($fp$headers);
        
    $result "";
        while (!
    feof($fp)) {
            
    $result .= fgets($fp1024);
        }
        
    fclose($fp);
        
    $result substr($resultstrpos($result"\r\n\r\n"));
        return 
    iconv('UTF-8''windows-1251'$result);
     
    phillip нравится это.
  7. phillip

    phillip

    Регистр.:
    4 сен 2007
    Сообщения:
    413
    Симпатии:
    15
    Спасибо. а с использованием simplexml_load_file все-таки никак не сделать, да?( Просто будь то сокеты или курл- придется парсер переписывать. А тут у меня всего то - сделал лоад рсски, и затем обращаюсь к каждому элементу и в массив записываю и все. Просто как в лифте три буквы написать :nezn:

    Код:
    foreach    ($xml->channel[0]->item as $item)
    	{
    		if($item) {
    			$rss[$i]['title'] = $item->title;
    			$rss[$i]['description'] = $item->description;
    			$rss[$i]['link'] = $item->link;
    			$i++;
    		}else{
    			return false;
    		}
    	}
     
  8. PapaJoe

    PapaJoe

    Регистр.:
    4 авг 2008
    Сообщения:
    620
    Симпатии:
    312
    можно сначала собрать в строку с помощью fsockopen, а потом ф-цией simplexml_load_string занести в массив, т.е. тоже самое, что и simplexml_load_file
     
    phillip нравится это.
Статус темы:
Закрыта.