|
|
|
| вот этот код разбирает 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 <= 1 || 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 в 14:12)
| | глуха как-то =( | |
|
|
|
|
|
|
|
для: kaoz
(31.05.2006 в 15:11)
| | чуть расширил обработчик
читает до шестого блока и выкидывает по окончанию времени выполнения | |
|
|
|
|
|
|
|
для: kaoz
(31.05.2006 в 15:26)
| | вместо инклуда сделал функцию и вызываю ее в разборе строки -> заработало...
вопрос: почему инклуд вешал скрипт?
и еще вопрос: как увеличить время разрешенного выполнения скирпта только на время выполнения?? | |
|
|
|
|
|
|
|
для: kaoz
(31.05.2006 в 17:25)
| | Вы внимательно читали тему, из которой выдрали код? Ваш предшественник тоже спорил со мной по этому вопросу.
Сейчас Вы его практически один в один повторяете. Вам НЕ нужно увеличивать время выполнения скрипта.
Вам ничего не мешает написать код так, чтоб он успевал отработать. Я почти наверняка уверен в этом.
Инклуд не вешает скрипт. Он просто долго выполняется. В тысячи раз дольше, чем обычный вызов функции.
И какой смысл было просить оптимизировать код чтения, чтобы потом в середине самого глубокого цикла затолкать практически самую медленную инструкцию языка, до меня не доходит. | |
|
|
|
|
|
|
|
для: Trianon
(31.05.2006 в 18:00)
| | Инклуд не вешает скрипт. Он просто долго выполняется. В тысячи раз дольше, чем обычный вызов функции.
То есть скрипт
<?php
include "config.php";
/*
etc
*/
?>
|
будет выполнятся дольше в "тысячи раз", чем
<?php
/*
Тут содержимое файла config.php
*/
/*
etc
*/
?>
|
| |
|
|
|
|
|
|
|
для: Unkind™
(31.05.2006 в 18:05)
| | ок... я сделал функцию... но добавив в нее запись в БД скрипт все равно вешается... | |
|
|
|
|
|
|
|
для: 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 в 19:51)
| | ??? | |
|
|
|
|
|
|
|
для: kaoz
(31.05.2006 в 21:02)
| | даже если прибегнуть к оптимизации, 100 мб файл работать будет, но максимальный размер лога 2 Гб... и тогда время выполнения скрипта будет всеравно превышать максимально возможное разрешенное время выполнения.. | |
|
|
|
|
|
|
|
для: kaoz
(31.05.2006 в 19:51)
| | Скобочки не хватает в конце запроса... | |
|
|
|