как сделать оптимизацию скриптов?

danneo

Честный
Регистрация
13 Ноя 2007
Сообщения
1.526
Реакции
121
Попробовал выложить свои скрипты на хостинг. При создании кэша (файл городов на 6 Мб), хостер блокирует нагрузку:
Allowed memory size of 67108864 bytes exhausted (tried to allocate 4729426 bytes) in /home/...
Как можно оптимизировать нагрузку и скорость скриптов?
 
загружать данные кусками, и вовремя делать unset
 
загружать данные кусками, и вовремя делать unset
т.е.? у меня есть файл, в котором прописано создание файлов для кэша. Если файла (и массива) нет, то создавать. И так сразу штук 10 подряд. Но файлы скопировал с локалки на сервер. Все равно ошибка. Видимо что-то еще...
А как можно определить причину, что за код создает это? И вообще, на локалке (на denwer) это можно отследить?
 
Не всегда требуется оптимизация скрипта, иногда действительно надо в памяти хранить кучу данных, для таких случаев используют:
PHP:
ini_set('memory_limit', '128M');
Цифру подбирай исходя из потребностей скрипта + про запас :)

Можно. Посмотрите логи apache и php.
У него ошибка и так выводится, если судить по тексту в первом сообщении поста. Твой пост бессмыслен.

А как можно определить причину, что за код создает это? И вообще, на локалке (на denwer) это можно отследить?
В 90% случаев ты в ошибке увидешь путь к скрипту, который можно оптимизировать - in /home/...
В 10% случаев большая часть памяти будет израсходована в одном скрипте, а ошибка возникнет в совершенно другом при обычном присвоении переменной...

Для отлова таких ситуаций по ходу выполнения скрипта можно расставить
PHP:
echo memory_get_usage() . "\n";
или использовать дебагер, хотя его настройка тот еще квест...
 
Последнее редактирование:
Не всегда требуется оптимизация скрипта, иногда действительно надо в памяти хранить кучу данных, для таких случаев используют:
PHP:
ini_set('memory_limit', '128M');
Цифру подбирай исходя из потребностей скрипта + про запас :)
У него ошибка и так выводится, если судить по тексту в первом сообщении поста. Твой пост бессмыслен.
В 90% случаев ты в ошибке увидешь путь к скрипту, который можно оптимизировать - in /home/...
В 10% случаев большая часть памяти будет израсходована в одном скрипте, а ошибка возникнет в совершенно другом при обычном присвоении переменной...

Для отлова таких ситуаций по ходу выполнения скрипта можно расставить
PHP:
echo memory_get_usage() . "\n";
или использовать дебагер, хотя его настройка тот еще квест...
как всегда по делу :)
latteo, подскажи, пожалуйста, как оптимизировать таблицу городов? Есть города мира, я их всех в массив многомерный запихнул, сериализовал и в файл. А далее с ним уже разные действия, типа поиск по id, построение массив от страны до города и т.д. Весь массив сохранил в свойстве экземпляра ( $name_obj->area ). Таких два файла, примерно по 5Мб.
Есть еще порядка 7 таких же файлов, но они очень маленькие по весу, но принцип работы тот же.
Я пока не разбирал в чем дело, но ошибку выводит на функцию, которая и создает такие кэш-файлы, а именно на перевод сериализованного массива в массив:
PHP:
$data = unserialize( $data );
поэтому думаю именно на эти весомые файлы. Там же записей то нехило, на 5Мб все таки.
Может быть есть способ решения таких задач, как-то обрабатывают же такие данные?


-------

Расставил по коду memory_get_usage(). как и думал, два файла по 24 Мб жрут память - города (индексный массив и ассоциативный). Итого получается 50Мб.
Увеличить не получается, т.к. хостер ограничивает...
 
Последнее редактирование:
unserialize скорее всего не нужен - он только лишнее процессорное время жрёт.

Есть такой волшебный код:
PHP:
file_put_contents('file_name.php', '<?php return ' . var_export($this->items, 1) . ';', LOCK_EX); //сохранение в файл

$this->items = require($fno); //"чтение" из файла в переменную
для массивов самое оно :)
Но это всё равно работа с переменными и если у тебя уже 50 метров под массивы, а ты их еще и преобразовываешь в переменные (через unserialize или var_export) - легко вылететь за предел по памяти.
Начинай запись в файл с наименьших массивов, после записи unset массива и промежуточной переменной.


5МБ в многомерном php массиве действительно может отожрать 15МБ и ничего тут не сделаешь ... нормального, кроме уменьшения массива с данными. Несколько процентов можно выиграть если массив будет одномерным.
Как вариант перевод массива в таблицы SQL. И необязательно MySQL, еще есть SQLite.
Либо держать все "длинные" данные в файлах и по мере надобности их оттуда извлекать, но это велосипед. Проще искать более щедрого хостера...
 
а вообще, какая память считается нормальной? Понятно, что много зависит от размера сайта. Но все же. Еще нужно учесть и посещаемость сайта. Сколько обычно хостеры выделяют и считается нормой, чтобы сайт нормально работал с посещалкой до 5к в день?
 
Всё привязано к системе, плюс есть память выделяемая на процесс, количество одновременных процессов, память на весь акк.
Разброс там может быть большой даже в пределах хостингов за 1 бакс.

Нормы нет, каждый вебмастер определяет потребности самостоятельно. Например magento может даже не встать на хостинг у которого меньше 256МБ оперативки, а вордпресс на таком же будет летать :)
 
Получилось оптимизировать скрипт с 47 Мб до 17 Мб. 14 мб из них это как раз массивы городов. Уменьшил за счет удаления всех стран. Оставил только 4 страны. Немного изменил, поудалял код. Серилазиацию массива убрал. Сохраняю его в свойство класса, в файл не сохраняю.
Больше не знаю как сделать...
Можно еще как-то уменьшить память для многомерного массива? Многомерный потому, что идет поиск в массиве города по id.
 
почему-то код:
PHP:
file_put_contents( ENGINE_DIR . '/cache/system/' . $file. '.php' , '<?php return ' . var_export( $data , TRUE ) . '; ?>', LOCK_EX); //сохранение в файл
делает вывод на дисплей весь массив, причем как сериализованный. И в файл сохраняет. Может быть такое и почему? Как сделать, чтобы не выводил, true указано?
Причем выводит только на хостинге. На локалке не выводит...
 
Назад
Сверху