Sitemap и память в PHP

e_moon

Новичок
Sitemap и память в PHP

Привестствую, надеюсь услышать Ваше мнение по такому вопросу:

Стоит задача создания он-лайн генератора Sitemap, средствами PHP 4 и 8 Мб выделяемой скрипту памяти. Алгоритм написал, работает отлично, с одним "но": когда сайт имеет большое кол-во страниц (допустим тыщ 50), либо когда вес каждой отдельной страницы сайта переваливает кб так за 300-400 - через некоторое время скрипт расходует выделенные ему при запуске 8 метров и молча прекращает работу.

Эту проблему я довольно каряво поборол - скрипт сам себя перезапускает после нахождения 100 ссылок (функции get_memory_usage() к сожалению нет) и продолжает работу, исключая уже найденое.

Другая проблема заключается в необходимости занесения в память скрипта массива найденых ссылок из которого в завершение работы необходимо создать sitemap.xml.

Единственная идея, которая приходит в голову, как это обойти - разбивать итоговый файл sitemap на части (условно по тем же 100 ссылок).

Могу ошибаться, но насколько я понимаю PHP не предоставляет возможность очистки в процессе работы скрипта использованной памяти? Соответственно выходит что PHP 4 не годится для реализации такой задачи? Хотелось бы ошибаться, но... Что скажите?
 

AmdY

Пью пиво
Команда форума
php 4 не предоставляет возможности программировать без знания основ. есть замечательная функция unset для убивания ненужных переменных. в файл можно дописывать строки и размер не важен.
 

e_moon

Новичок
AmdY, unset попробую.

Попробую. Чесно скажу, был 100% уверен, что эта функция удаляет переменную, но не очищает использованную память.

в файл можно дописывать строки и размер не важен.
Согласен, размер файла не важен. Проблема в том, что для создания файла нужно занести в переменную (массив будущих строк файла) N Мб информации. Хотя Ваш намек понял - перезапускать скрипт, читать из базы и заносить, допустим, по 100 строк в конец файла за раз.
 

Adelf

Administrator
Команда форума
e_moon
ничччего ты не понял :)

для создания файла нужно занести в переменную
Ничего в переменные не надо заносить для создания файлов.
Можно создать пустой и начинать писать в него постепенно.

удаляет переменную, но не очищает использованную память
А что в твоем понимании "удалить переменную" тогда?

У тебя наверняка цикл. Постарайся добиться следующего. Чтобы в каждая переменная, которую ты используешь в цикле(кроме дескриптора файла) unset-илась в конце каждой итерации. А все результаты писались в файл.
Тогда проблем с памятью возникнуть просто не должно.
 

AmdY

Пью пиво
Команда форума
у unset могут быть проблемы с циклическими ссылками, но у тебя это врятли будет.
ничего не нужно перезапускать, у нас скрипт на php 4 неделя крутился запущенным. тебе нужно не накапливать данные, а сбрасывать их по мере получения, получил, записал, освободил память и так по кругу.
 

e_moon

Новичок
А что в твоем понимании "удалить переменную" тогда?
Видимо начитался фиговых комментариев в Google.

А так это реально будет выход, если unset не подведет.

Динамически писать в файл можно, но... Массив данных все-же нужен по одной причине - нельзя допустить записи дубликата, все-равно нужно проверять наличие ссылки в файле.

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

И еще один нюанс хочу уточнить - что лучше (менее ресурсоемно) в моем случае: держать открытым дескриптор файла на протяжении всей работы скрипта или открывать/закрывать при занесении каждой записи?

В целом, большое спасибо товарищи!
 

damngood

Мозг был, но ушел...
e_moon
пиши в базу данных, с уникальным ключем и будет счастье тебе, и не будет дублей.
 

Adelf

Administrator
Команда форума
Кстати да. базу данных упустили :) А она - самое то.
Считай замена твоему массиву, для удаления дублей там и т.д.
 
Сверху