Утечка памяти в Apache

6epkyT

Новичок
Утечка памяти в Apache

Здравствуйте!

Написали свою dll под PHP, которая позволяет загружать данные в общую память сервера Apache.
Благодаря библиотеке в разных сессиях можно иметь общий доступ например к переменной $a.
Вроде бы все отлично работает.

Но в один прекрасный момент Apache очищает выделенную память и все.
Почему - непонятно :(

Явных вызовов функций очищающих память из API самой dll нет.

Сервер виндовый win32 (win2k3) + Apache 2.2.4 + PHP 5.2 + MySQL 4.1.

Если нужна какая-то еще дополнительная информация по настройкам, то скажите.
 

WP

^_^
Использовать нормальные средства для разделяемой памяти.
 

6epkyT

Новичок
Ну, а чем C++ не подходит? :)

"Нормальные средства" - это какие?
 

6epkyT

Новичок
В СУБД точно не вариант хранить, т.к. нужно очень быстрое обращение к памяти.
С СУБД уже прошли.

К тому же $a - может быть массивом или структурой.
 

6epkyT

Новичок
Выяснили, что дело в не в Apache, а в php.
Как побороть очистку памяти php?

К сожалению, перевод на новый двиг - это будет последняя капля, т.к. слишком много придется переписывать. :(

Странно, что вызов загрузки переменных в память осуществляется через API dll mydll_load($a) и php тут никак не участвует. Только подключает библиотеку.
 

Alexandre

PHPПенсионер
Написали свою dll под PHP, которая позволяет загружать данные в общую память сервера Apache.
А не проще ли написать что-то не под пхп, а уже конкретно под апач, в апаче есть динамически выделяемые пулы, которые можно использовать на протяжении любого цикла (от жизни одного процесса, до цикла сеанса апача keep-alive или цикла рестарта), а еще лучше - совместное решение - модуль апача - выделяет необходимую память, а экстеншен пхп - к ней обращается.

Но в один прекрасный момент Apache очищает выделенную память и все.
Почему - непонятно
Скорее всего - ты обращаешься к памяти такого вот пула. У второго апача жизненный цикл процесса может быль дольше, чем жизненный цикл отдельного HTTP запрпоса. Память откуде берешь??? Апач ее выделяет и освобождает по своим алгоритмам. Используй ср-ва апача для доступа к ресурсам апача и проблем не будет.

А вообще-то, скорее всего, для твоих целей - ресурсы апача тебе не нужны, есть масса других средств - например шаред мемори.
 

OZ

Новичок
6epkyT, если пишешь на C, то используй сишные инструменты для shared memory. Они геморные, но память будет жить от рестарта до рестарта.
Если пишешь на PHP, то юзай стандартные функции shared memory.
 

6epkyT

Новичок
Я использую shared memory, php не очищает её месяцами.
У нас PHP скорее выступает как обертка для загрузки данных в память.
Все дело в том, что приложение веб-ориентированное и переписывать его сейчас нереально.
Данные передаются из php через API самописной dll.

а еще лучше - совместное решение - модуль апача - выделяет необходимую память, а экстеншен пхп - к ней обращается.
Именно так и сделано: в php.ini есть строчка extension=php_ml.dll, которая загружает библиотеку, а затем загружает ее в память функцией LoadLibrary.

Alexandre, честно говоря с процессами, как там все происходит туго понимаю...
Знаю точно, что касается жизненных циклов, то операции все выполняются очень шустро. Мы специально тестировали.
Зависаний типа больше 10 сек не было на тех объемах, которые использовали. Но память все равно падала.

Фишка в том, что какая-то херня ВЫГРУЖАЕТ и ЗАГРУЖАЕТ dll обратно.
 

tony2001

TeaM PHPClub
что тут неясного? почему модули загружаются при старте и выгружаются при шатдауне чайлда?
эта вышеупомянутая "херня" называется "охрененно ожидаемое поведение".

если вы не понимаете что вы там понаписывали - используйте всем доступные функции PHP, не надо сказок на тему "надо чтоб работало, но не хочется ничего делать для этого".
уж за неделю можно было найти время для написания нескольких функций на PHP.
 

Alexandre

PHPПенсионер
У нас PHP скорее выступает как обертка для загрузки данных в память.
Все дело в том, что приложение веб-ориентированное и переписывать его сейчас нереально.
Данные передаются из php через API самописной dll.
можно все-таки поподробнее - что тебе нужно,
и как ты это собираешься реализовать? И зачем тебе память именно апача, может есть другие решения?
 
Сверху