Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: глюк с временем выполнения
 
 автор: kaoz   (31.05.2006 в 14:12)   письмо автору
 
 

вот этот код разбирает 100 меговый лог файл..

<?php
// ставим скрипт "на счетчик" (чтобы знать, как долго он выполнялся 
$ttt=microtime(); 
$ttt=((double)strstr($ttt' ')+(double)substr($ttt,0,strpos($ttt,' '))); 

include 
"filenames.php"// генерация $filename

$blk_factor 1048576
$handle     fopen($filename"r");
$block      "";
$sep1       "\n";
$sep2       ", ";

if(!
$handle
  {
    echo 
"<b>Ошибка открытия файла:</b>".$filename."<br />\n";
    die();
  }

switch(
$desc// переменная береться из filenames.php
  
{
    case 
'FWS' $file "firewall.php"; break;
    case 
'WEB' $file "webproxy.php"; break;
    default    : die(); break;
  }
$i=0;
while (!
feof($handle))
  {
    
$block .= fread($handle$blk_factor);
    
$blk_factor 
    $lines 
explode($sep1$block);
    
$cnt count($lines);

    
$block $cnt <= || substr($block,-1,1) == $sep1 "" $lines[--$cnt];
    if(
$block != "") unset($lines[$cnt]);

    foreach(
$lines as $line)
      {
        
$string explode($sep2$line);
        include 
$file;
      }


if(!empty(
$block))
  {
    
$string explode($sep2$block);
    include 
$file;
  }
fclose($handle);

// считаем, как долго работал скрипт 
$ddd=microtime(); 
$ddd=((double)strstr($ddd' ')+(double)substr($ddd,0,strpos($ddd,' '))); 
echo (
"Execute time: ".(number_format(($ddd-$ttt),3))." sec.<br>"); 
?>


в include $file храниться обработчик...

код обработчика пока такой:

<?php
echo "firewall<br />\n";
?>


запускаю скрипт пишет:
Fatal error: Maximum execution time of 60 seconds exceeded in firewall.php on line 2

а если вместо include $file пишу просто echo "firewall<br />\n";, то скрипт обрабатывается за примерно 30 сек

почему это происходит? и как от этого избавиться....

пробовал поставить zend optimizator на IIS но он просит рутовскую директорию, которой у меня как таковой нет, т.к. скрипт должен использоваться как системный и запускаться через nncron... (оптимизатор не работает, мож кто устанавливал на IIS расскажите как сделать чтоб нормально было)

ЗЫ: а когда я сделаю обработчик который будет в базу писать разобранные на параметры строки, тогда скрипт вообще нереально долго будет выполняться...

   
 
 автор: kaoz   (31.05.2006 в 15:11)   письмо автору
 
   для: kaoz   (31.05.2006 в 14:12)
 

глуха как-то =(

   
 
 автор: kaoz   (31.05.2006 в 15:26)   письмо автору
 
   для: kaoz   (31.05.2006 в 15:11)
 

чуть расширил обработчик

читает до шестого блока и выкидывает по окончанию времени выполнения

   
 
 автор: kaoz   (31.05.2006 в 17:25)   письмо автору
 
   для: kaoz   (31.05.2006 в 15:26)
 

вместо инклуда сделал функцию и вызываю ее в разборе строки -> заработало...

вопрос: почему инклуд вешал скрипт?

и еще вопрос: как увеличить время разрешенного выполнения скирпта только на время выполнения??

   
 
 автор: Trianon   (31.05.2006 в 18:00)   письмо автору
 
   для: kaoz   (31.05.2006 в 17:25)
 

Вы внимательно читали тему, из которой выдрали код? Ваш предшественник тоже спорил со мной по этому вопросу.
Сейчас Вы его практически один в один повторяете. Вам НЕ нужно увеличивать время выполнения скрипта.
Вам ничего не мешает написать код так, чтоб он успевал отработать. Я почти наверняка уверен в этом.

Инклуд не вешает скрипт. Он просто долго выполняется. В тысячи раз дольше, чем обычный вызов функции.
И какой смысл было просить оптимизировать код чтения, чтобы потом в середине самого глубокого цикла затолкать практически самую медленную инструкцию языка, до меня не доходит.

   
 
 автор: Unkind™   (31.05.2006 в 18:05)   письмо автору
 
   для: Trianon   (31.05.2006 в 18:00)
 

Инклуд не вешает скрипт. Он просто долго выполняется. В тысячи раз дольше, чем обычный вызов функции.
То есть скрипт

<?php
include "config.php";

/*
etc
*/
?>


будет выполнятся дольше в "тысячи раз", чем


<?php
/*
Тут содержимое файла config.php
*/

/*
etc
*/
?>

   
 
 автор: kaoz   (31.05.2006 в 19:17)   письмо автору
 
   для: Unkind™   (31.05.2006 в 18:05)
 

ок... я сделал функцию... но добавив в нее запись в БД скрипт все равно вешается...

   
 
 автор: kaoz   (31.05.2006 в 19:51)   письмо автору
 
   для: kaoz   (31.05.2006 в 19:17)
 

сделал так:

<?
//..
// Подрубаю файл с функциями
// конетюсь к базе
//..
foreach($lines as $line)
  {
    
$string explode($sep2$line);    // разбор строки на параметры
    
firewall();
  }
//..
//..
?>



<?
function firewall()
  {
    global 
$string;
    
$ResultCode = (integer) $string[10];
    
$ProcessingTime = (integer) $string[18];
    
$ProcessingTimeDelta = (integer) $string[19];
    
    
$separator "/";
    
$date explode($separator$string[1]);
    
$LogDate $date[2]."-".$date[1]."-".$date[0];
    
$string[30] = str_replace ('\n'''$string[30]);
    
    
$sql "INSERT INTO firewalllog VALUES 
            (DEFAULT, 
            '
$string[0]',
            '
$LogDate',
            '
$string[2]',
            '
$string[3]',
            '
$string[4]',
            '
$string[5]',
            '
$string[6]',
            '
$string[7]',
            '
$string[8]',
            '
$string[9]',
            '
$ResultCode',
            '
$string[11]',
            '
$string[12]',
            '
$string[13]',
            '
$string[14]',
            '
$string[15]',
            '
$string[16]',
            '
$string[17]',
            '
$ProcessingTime',
            '
$ProcessingTimeDelta',
            '
$string[20]',
            '
$string[21]',
            '
$string[22]',
            '
$string[23]',
            '
$string[24]',
            '
$string[25]',
            '
$string[26]',
            '
$string[27]',
            '
$string[28]',
            '
$string[29]',
            '
$string[30]';";
     
mysql_query($sql);
     if (!
$query) echo mysql_error();
  }
?>


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

   
 
 автор: kaoz   (31.05.2006 в 21:02)   письмо автору
 
   для: kaoz   (31.05.2006 в 19:51)
 

???

   
 
 автор: kaoz   (01.06.2006 в 08:19)   письмо автору
 
   для: kaoz   (31.05.2006 в 21:02)
 

даже если прибегнуть к оптимизации, 100 мб файл работать будет, но максимальный размер лога 2 Гб... и тогда время выполнения скрипта будет всеравно превышать максимально возможное разрешенное время выполнения..

   
 
 автор: ec_stasis   (01.06.2006 в 20:27)   письмо автору
 
   для: kaoz   (31.05.2006 в 19:51)
 

Скобочки не хватает в конце запроса...

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования