Виснет скрипт

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

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

    phillip

    Регистр.:
    4 сен 2007
    Сообщения:
    413
    Симпатии:
    15
    Скрипт, генерит страницы дора. Раньше работал норм, счас не работает. я ничего не трогал :nezn:
    генерит 1к паг, то есть стоит цикл for ($x=0; $x<1000; $x++)

    Что удивительно- в целом стало генерится раз в 5 дольше. и если еще ставлю сгенерить 10 паг, а не 1к- то более-менее генерит, хотя долго. если ставлю 1000к паг- виснет наглухо! весь код облазил- нифига не нашел!
    Подключил xdebug, включил профайлинг. В итоге сгенерился файл 400мб весом!! у меня даже нет возможности скачать его с фтп чтобы посмотреть! Тогда я поставил сгенерить 1 пагу, и получился более-менее файл с логами от xdebug. Скачал я его. Посмотрел. ничего он мне интересного не представил. Указано время какое затрачено на каждую операцию. Ну и. не особо много. То есть 1 пага генерится норм, а когда дело доходит до 1к паг, уже ничего не генерится.
    Как быть
     
  2. Mongolor

    Mongolor

    Регистр.:
    5 дек 2007
    Сообщения:
    157
    Симпатии:
    29
    может текстовку огромную подсовываешь? и нехватает оперативы?
    в общем-то думай что изменил, т.к. если раньше было норм. чудес не бывает.
     
  3. bondaf

    bondaf Постоялец

    Регистр.:
    16 мар 2010
    Сообщения:
    85
    Симпатии:
    20
    Сложно без кода что-то сказать.
    Добавь дебаговых выводов, таймеров. Запусти не на 1000, а на 1, 5, 10, 20 смотри в каких местах будет тратиться больше времени, смотри что там.
    Как вариант, у хостера могло что-то измениться.
     
  4. e64f

    e64f Постоялец

    Регистр.:
    2 ноя 2008
    Сообщения:
    95
    Симпатии:
    6
    И своего опыта с доргеном ред.батон

    1) Тормозило из за фтп куда итогом заливалось все файло
    2) Тормозило в генераторе текстов, когда был парсинг ресурсов в инете, а эти ресурсы моргали в своей доступности
    3) Тормозило при огромном файле кейев
     
  5. phillip

    phillip

    Регистр.:
    4 сен 2007
    Сообщения:
    413
    Симпатии:
    15
    Вообщем действительно. Трабла возникла после моих изменений, но заметил я ее не сразу, либо она не проявляла себя. я так и не понял до конца в чем она, прошу помощи!

    Суть в чем. Есть функция, которая обрабатывает текст. вставляет вместо %txt 2 del% 2 строки из заданного файла. Но потом оказалось что строки не заканчиваются знаками препинания, и на выходе получалась страшная каша)) Тогда я сделал чтобы брались на строки, а предложения из файла. Тогда возникла новая проблемка! В разных файлах, среднее предложение разное по длине! Тогда я решил брать сразу много строк, из них вычленять предложения, и еще проверять, чтобы было все вместе по 400 символов примерно! получилась функция %txt 2 del% которая берет 2 условных куска текста, примерно по 400 символов длиной, с необорванными предложениями!
    И вот если я эту функцию делаю 1 раз- все норм. если 10 раз- все норм. если 1000 раз- все виснет! Не могу понять почему, помогите пожалуйста :bc:

    PHP:
    $addfile'text.txt';
    $adfile_size=filesize($addfile);

    function 
    InsertTag4($t,$addfile,$adfile_size) {
        
    preg_match_all('&%txt.+del.*%&iU'$t$tags);
            foreach (
    $tags[0] as $tag ) {
                
    $code='';
                
    $add='';
                
    preg_match('&%txt(.+)del.?(br)?%&iU'$tag$values);
                for (
    $c=0$c<$values[1]; $c++) {
                    
    fseek($addfilerand(0$adfile_size)); fgets($addfile);
                    if (isset(
    $values[2]) and $values[2]=='br') {
                        while(
    strlen($add)<400$add.=makeGoodTXT(fgets($addfile).fgets($addfile).fgets($addfile));
                        
    $code.=$add.'<br />';
                    } else {
                        
    $code.=trim(makeGoodTXT(fgets($addfile).fgets($addfile).fgets($addfile).fgets($addfile))).' ';
                    }
                    
    $add='';
                    }
                    while(
    strlen($code)<400*$values[1]) $code.=makeGoodTXT(fgets($addfile).fgets($addfile));
            
    $tpreg_replace('/'.$values[0].'/'$code$t1);
            }
    return 
    $t;
    }

    Function 
    makeGoodTXT($text) {
        
    $sensunik_split_sentence($text);
        
    //unset($sens[0]);
        //array_pop($sens);
        //return implode(' ',$sens);
        
    if (isset($sens[1]))    return $sens[1].' ';
    }

    function 
    unik_split_sentence($text) {
        
    $sentences preg_split("/([\.\!\?])\s/u"trim($text), -1PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY);
        
    $sentences2 = array();
        
    $num 0;
        foreach(
    $sentences as $key => $sentence) {
            if (
    $sentence == "." || $sentence == "!" || $sentence == "?") {
                
    $sentences2[$num 1] .= $sentence;
                continue;
            }
            @
    $sentences2[$num] .= ucfirst(trim($sentence));
            
    $num++;
        }
        return 
    $sentences2;    
    }
    Перемудрил вообщем, уже сам не знаю как так! Может быть это оттого что делаем много fgets ?


    Всё! Вник сам! проблемной была строка while(strlen($code)<400*$values[1]) $code.=makeGoodTXT(fgets($addfile).fgets($addfile)); Иногда получалось так что fgets доходил до конца файла, и тогда while впадал в бесконечность
     
Статус темы:
Закрыта.