[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: куда девается память? скрипт вылетает. помогите.
linarko
второй день сижу над этим..
скрипт (будем называть его основой) запускается из командной строки.
кроме него запускаются еще 6 скриптов (вспомогательные).
данными эти скрипты (основной со вспомогательными) обмениваются через определенные файлы (6 штук), для чего в основном файле работает цикл проверяющий эти файлы с перерывами в 5 сек.
когда данные получены они записываются в БД (добавляется либо обновляется запись). так вот в этот момент скрипт вылетает с ошибкой
Fatal error: Allowed memory size of ... bytes exhausted
смотрел в top, процесс php до этого момента использует ~13МБ, ставил memory_limit 32МБ - все равно не хватает.
причем вылетает на самом первом запросе, где делается выборка одной записи из таблицы, в которой ~100 записей, по первичному ключу.
и что еще более странно, если заново запустить скрипт то он все нормально записывает. почему с первого раза у него не получилось не понимаю.
все это работает на хостинге РУ-Центра. Linux или FreeBSD, Apache, MySQL.
memory_limit 16M (32M пробовал, думаю больше не надо)
max_execution_time 0
при этом все вспомогательные скрипты нормально дорабатывают до конца.

основной скрипт
PHP
$date=date("Y-m-d");
    
$working="working";
    
$result=array();
    
$record_states=array();

    
$h=0;
    while (
$working=="working"&&$h<=1000){
        
$working="done";
        foreach (
$scripts as $k=>$v){
            if (
$result[$k]["working"]!="done" && $result[$k]["working"]!="not"){
                echo 
$k."Handler, $h, ";
                
$func=$k."Handler";
                
$func($result[$k],$working,$v["DataFile"],$v["CookieFile"],&$params1);
                if(
count($result[$k]["keys"])){
                    echo 
count($result[$k]["keys"]).", ";
                    foreach(
$result[$k]["keys"] as $k2=>$v2){
                        if((
$v2["state"]||$result[$k]["working"]!="working")&&!$record_states[$k][$k2]){
                            echo 
"$state, ";

                            
$state=($v2["state"]?($v2["state"]!=9999?$v2["state"]:0):-$v2["depth"]);

                            echo 
memory_get_peak_usage().'|0 ';
                            echo 
"SELECT Id FROM my_record_state WHERE RecordId='$v2[id]' AND Date='$date' ";

                            if(
$id=dbGetValueFromDb("SELECT Id FROM my_record_state WHERE RecordId='$v2[id]' AND Date='$date'",__FILE__,__LINE__)){
                                echo 
memory_get_peak_usage().'|1 ';
                                echo 
"UPDATE my_record_state SET Script$k='$state',InProgress$k='0' WHERE Id='$id' ";

                                
dbDoQuery("UPDATE my_record_state SET Script$k='$state',InProgress$k='0' WHERE Id='$id'",__FILE__,__LINE__);
                                
                                echo 
memory_get_peak_usage().'|2 ';
                            }else{
                                echo 
memory_get_peak_usage().'|3 ';
                                echo 
"INSERT INTO my_record_state SET Script$k='$state',InProgress$k='0',RecordId='$v2[id]',Date='$date' ";

                                
dbDoQuery("INSERT INTO my_record_state SET Script$k='$state',InProgress$k='0',RecordId='$v2[id]',Date='$date'",__FILE__,__LINE__);

                                echo 
memory_get_peak_usage().'|4 ';
                            }
                            echo 
memory_get_peak_usage().'|5 ';
                            echo 
"UPDATE my_record SET Script$k='$state',LastDate='$date' WHERE Id='$v2[id]' ";

                            
dbDoQuery("UPDATE my_record SET Script$k='$state',LastDate='$date' WHERE Id='$v2[id]'",__FILE__,__LINE__);

                            echo 
memory_get_peak_usage().'|6 ';
                            
$record_states[$k][$k2]=true;
                        }else{
                            echo 
", ";
                        }
                    }
                }else{
                    echo 
"no result, ";
                }
                echo 
memory_get_peak_usage();
                echo 
"\r\n";
            }
        }
        
$h++;
        if (
$working=="working"sleep(5);
    }

    
// зачищаем файлы
    
foreach ($scripts as $k=>$v){
        
//unlink($v["DataFile"]);
        //unlink($v["CookieFile"]);
    
}


скрипт выводит все в файл, вот содержимое (в конце строки memory_get_peak_usage())

Код

Script1Handler, 1, 35, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , 327452
Script3Handler, 1, 35, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , 327524
Script4Handler, 1, 35, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , 327572
Script5Handler, 1, 35, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , 327612
....
Script5Handler, 17, 35, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , 327636
Script2Handler, 18, 35, , 331664|0 SELECT Id FROM seo_record_state WHERE RecordId='1' AND Date='2009-02-11'
Fatal error: Allowed memory size of 16777216 bytes exhausted (tried to allocate 1073144 bytes) in /home/it-avenue/it-avenue.ru/docs/subdmn/seo/library/db.mysql.php on line 47



подскажите, если то может плз, буду очень признателен
спасибо.



Спустя 14 минут, 18 секунд (11.02.2009 - 22:23) kirik написал(а):
linarko, не особо вникал в скрипт, но могу предположить, что можно освобождать память от результата запроса посредством mysql_free_result(), также нужно отказаться от использования foreach(), потому как этот цикл работает не с самим массивом, а с его копией(которая отъедает память). Еще можно unset()'ить некоторые не нужные переменные. Вывод у вас идет в консоль?

А что этот скрипт вообще делает? Разве нельзя обойтись без вложенности циклов?

Спустя 2 часа, 54 минуты, 31 секунда (12.02.2009 - 01:17) LoneCat написал(а):
Цитата (kirik @ 11.02.2009 - 23:23)
нужно отказаться от использования foreach(), потому как этот цикл работает не с самим массивом, а с его копией

Откуда если не секрет такая информация? smile.gif

Спустя 9 минут, 8 секунд (12.02.2009 - 01:26) kirik написал(а):
Цитата (LoneCat @ 11.02.2009 - 17:17)
Откуда если не секрет такая информация? smile.gif

C родного php.net smile.gif

Цитата
Note: Unless the array is referenced, foreach operates on a copy of the specified array and not the array itself. foreach  has some side effects on the array pointer. Don't rely on the array pointer during or after the foreach without resetting it.

Спустя 3 минуты, 14 секунд (12.02.2009 - 01:30) LoneCat написал(а):
Цитата (kirik @ 12.02.2009 - 02:26)
Note: Unless the array is referenced, foreach operates on a copy of the specified array and not the array itself. foreachhas some side effects on the array pointer. Don't rely on the array pointer during or after the foreach without resetting it.

Спасибо за информацию, теперь буду знать, как-то я в свое время это ремарку пропустил мимо ушей smile.gif

Спустя 10 часов, 48 минут, 38 секунд (12.02.2009 - 12:18) linarko написал(а):
большое спасибо за отклик!
mysql_free_result() делаю..
про foreach я тоже не знал, спасибо kirik

но дело было в другом, просто до первого запроса к БД скрипт выполнялся пару минут, из-за чего как выяснилось слетало соединение с mysql (случайно наткнулся на функцию mysql_ping() в мануале smile.gif )
короче перед запросом надо было проверить mysql_ping(), и если соединение разорвано - переконнектиться.
либо может в настройках mysql полазить чтоб таймаут увеличить, еще не копался.
возможно мой опыт кому нить поможет )
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.