Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Скрипт ведет себя локально нормально


Автор: V0fka 11.7.2013, 22:04
Привет!

Есть скрипт. Запускаю его на локальной машине, где стоит Windows 7 + Denwer - скрипт в свои пики съедает ~11 Мб оперативной памяти. Динамика работы скрипта такая (в Мб):

user posted image

Запускаю его на сервере хостинга, где Линуксовый сервер. Параметры сейчас не скажу, но если для решения проблемы нужно какие-то параметры озвучить - говорите. Так вот, на сервере стоит ограничение на выполнение скрипта в 64 Мб и скрипту их не хватает. Стартует скрипт где-то с 8 Мб и на каждом шаге прибавляет к занимаемой памяти 4-5 Мб. Динамика работы такая (в Мб):

user posted image

Почему скрипт ведет себя на столько по разному? Как побороть эту беду?

Автор: Рыжий 11.7.2013, 22:54
V0fka, Так а какая задача этого скрипта? Какой участок кода съедает столько памяти? Ты не дал никаких деталей, под такое поведение подходит много разных ответов...

Автор: MoLeX 12.7.2013, 06:18
профилирование на каждом этапе. 
может он у тебя протоколы использует которые на сервере криво работают, мы же нечего не знаем об этом скрипте.

Автор: ksnk 12.7.2013, 07:57
V0fka, вывести phpinfo в каждом случае и внимательно рассмотреть разницу.
На Денвере запуск скрипта идет как модуль апача, он после выполнения аккуратно чистит кучки, оставшиеся от скрипта, а на сервере? Не FastCGI, случайно?

Или картинки - это трекинг одного запуска скрипта?

Автор: V0fka 12.7.2013, 13:28
Цитата(Рыжий @  11.7.2013,  22:54 Найти цитируемый пост)
V0fka, Так а какая задача этого скрипта? Какой участок кода съедает столько памяти?

Скрипт ходит по ссылкам и собирает и обрабатывает инфу с них. Для этого я использую библиотеку simple html dom. Каждый отрезок по оси Х на графиках - это обработка новой ссылки. Я получаю страницу с ссылками, обхожу их в цикле, во время которого получаю инфу по текущей ссылке и сохраняю в переменную. В конце каждой итерации цикла я очищаю переменные, присвоив им null.

Цитата(MoLeX @  12.7.2013,  06:18 Найти цитируемый пост)
профилирование на каждом этапе. может он у тебя протоколы использует которые на сервере криво работают, мы же нечего не знаем об этом скрипте.

Выше описал работу скрипта. Если этой инфы мало - спрашивайте, дам подробнее ответ на сопутствующие вопросы.

Цитата(ksnk @  12.7.2013,  07:57 Найти цитируемый пост)
V0fka, вывести phpinfo в каждом случае и внимательно рассмотреть разницу.

На что именно обратить внимание?

Цитата(ksnk @  12.7.2013,  07:57 Найти цитируемый пост)
На Денвере запуск скрипта идет как модуль апача, он после выполнения аккуратно чистит кучки, оставшиеся от скрипта, а на сервере? Не FastCGI, случайно?

Подскажите, пожалуйста, где это можно глянуть.

Цитата(ksnk @  12.7.2013,  07:57 Найти цитируемый пост)
Или картинки - это трекинг одного запуска скрипта?

Первая картинка - это запуск скрипта локально, а вторая - на сервере, где сайт лежит. Запускались скрипт не один раз, ситуация все время повторяется.

Автор: ksnk 12.7.2013, 14:12
Цитата(V0fka @  12.7.2013,  13:28 Найти цитируемый пост)
На что именно обратить внимание?

версии php и апача, способ запуска (SERVER_SOFTWARE), ограничения на память (memory_limit).

Все это внимательно обдумать и поставить memory limit побольше.  smile 

Автор: bars80080 13.7.2013, 18:41
Цитата(ksnk @  12.7.2013,  07:57 Найти цитируемый пост)
На Денвере запуск скрипта идет как модуль апача, он после выполнения аккуратно чистит кучки, оставшиеся от скрипта, а на сервере? Не FastCGI, случайно?

а в каком, к примеру, случае fastCGI не будет убирать мусор в отличие от модуля?

чисто интересно, так как у меня много чего пришлось на фаст перевести

Автор: ksnk 13.7.2013, 19:51
Цитата(bars80080 @  13.7.2013,  18:41 Найти цитируемый пост)
а в каком, к примеру, случае fastCGI не будет убирать мусор в отличие от модуля?

У меня остались какие-то смутные воспоминания про проблемы с памятью, при отладке сокет-сервера. Но это было еще на 4-ке, причем каких то ранних версий, так что сейчас уже не воспроизводится. Вероятно сейчас разницы в этом уже нет.

Автор: V0fka 14.7.2013, 13:41
Цитата(ksnk @  12.7.2013,  14:12 Найти цитируемый пост)
версии php

Локально: PHP Version 5.3.3
На сервере: PHP Version 5.2.17

Цитата(ksnk @  12.7.2013,  14:12 Найти цитируемый пост)
способ запуска (SERVER_SOFTWARE)

Локально: Apache/2.2.4 (Win32) mod_ssl/2.2.4 OpenSSL/0.9.8k PHP/5.3.3. И эта строка находится в группе Apache Environment. А на сервере даже такой группы нету.

Цитата(ksnk @  12.7.2013,  14:12 Найти цитируемый пост)
ограничения на память (memory_limit)

Локально: 128 Мб
На сервере: 64 Мб
Но, честно говоря, я не понимаю как именно этот показатель влияет на то, что скрипт более или менее прожорливый, ведь локально и ~11 Мб хватает.

Цитата(ksnk @  12.7.2013,  14:12 Найти цитируемый пост)
Все это внимательно обдумать и поставить memory limit побольше.

Такого я сделать не могу, т.к. этим управляет хостер.

Автор: Fortop 14.7.2013, 14:21
Цитата(V0fka @  14.7.2013,  13:41 Найти цитируемый пост)
Локально: PHP Version 5.3.3
На сервере: PHP Version 5.2.17


Почитайте
http://php.net/manual/en/migration53.new-features.php

И это тоже
http://www.php.net/manual/ru/features.gc.performance-considerations.php

Советую обратить внимание на график

Добавлено через 19 секунд
user posted image

Автор: V0fka 15.7.2013, 20:20
Fortop, а как же выйти из положения на PHP 5.2?

Автор: Arantir 15.7.2013, 20:33
Если скрипт нормально работает на 5.3, то почему не обновить сервер?
Если это хостинг - там точно должна быть переключалка на 5.3. Иначе не знаю, как может хватить совести у хостера не дать альтернативы на такое старье как 5.2.

В 5.3 этим занимается сборщик мусора. Выйти из проблемы на 5.2 - это вручную делать unset чуть ли не в любом месте, где переменная больше не нужна. Возможно, она у Вас там такая только одна, которая память жрет. Но если их много, то будет слишком долгно все пересматривать и переписывать.

Автор: umren 16.7.2013, 09:30
в PHP начиная с версии 5.3 появился GC, в 5.2 его нет.

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

Автор: V0fka 17.7.2013, 21:37
В общем, буду решать вопросы с хостером.

Всем спасибо за участие в этой теме!
Отдельное спасибо Fortop-у!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)