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

Тема в разделе "Как сделать...", создана пользователем danneo, 17 фев 2014.

  1. danneo

    danneo Честный

    Регистр.:
    13 ноя 2007
    Сообщения:
    1.463
    Симпатии:
    114
    Попробовал выложить свои скрипты на хостинг. При создании кэша (файл городов на 6 Мб), хостер блокирует нагрузку:
    Как можно оптимизировать нагрузку и скорость скриптов?
     
  2. ne4to

    ne4to Постоялец

    Регистр.:
    16 ноя 2012
    Сообщения:
    107
    Симпатии:
    50
    загружать данные кусками, и вовремя делать unset
     
  3. danneo

    danneo Честный

    Регистр.:
    13 ноя 2007
    Сообщения:
    1.463
    Симпатии:
    114
    т.е.? у меня есть файл, в котором прописано создание файлов для кэша. Если файла (и массива) нет, то создавать. И так сразу штук 10 подряд. Но файлы скопировал с локалки на сервер. Все равно ошибка. Видимо что-то еще...
    А как можно определить причину, что за код создает это? И вообще, на локалке (на denwer) это можно отследить?
     
  4. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.549
    Симпатии:
    1.433
    Не всегда требуется оптимизация скрипта, иногда действительно надо в памяти хранить кучу данных, для таких случаев используют:
    PHP:
    ini_set('memory_limit''128M');
    Цифру подбирай исходя из потребностей скрипта + про запас :)

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

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

    Для отлова таких ситуаций по ходу выполнения скрипта можно расставить
    PHP:
    echo memory_get_usage() . "\n";
    или использовать дебагер, хотя его настройка тот еще квест...
     
    Последнее редактирование: 17 фев 2014
    zilon и danneo нравится это.
  5. danneo

    danneo Честный

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


    -------

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

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.549
    Симпатии:
    1.433
    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.
    Либо держать все "длинные" данные в файлах и по мере надобности их оттуда извлекать, но это велосипед. Проще искать более щедрого хостера...
     
  7. danneo

    danneo Честный

    Регистр.:
    13 ноя 2007
    Сообщения:
    1.463
    Симпатии:
    114
    а вообще, какая память считается нормальной? Понятно, что много зависит от размера сайта. Но все же. Еще нужно учесть и посещаемость сайта. Сколько обычно хостеры выделяют и считается нормой, чтобы сайт нормально работал с посещалкой до 5к в день?
     
  8. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.549
    Симпатии:
    1.433
    Всё привязано к системе, плюс есть память выделяемая на процесс, количество одновременных процессов, память на весь акк.
    Разброс там может быть большой даже в пределах хостингов за 1 бакс.

    Нормы нет, каждый вебмастер определяет потребности самостоятельно. Например magento может даже не встать на хостинг у которого меньше 256МБ оперативки, а вордпресс на таком же будет летать :)
     
  9. danneo

    danneo Честный

    Регистр.:
    13 ноя 2007
    Сообщения:
    1.463
    Симпатии:
    114
    Получилось оптимизировать скрипт с 47 Мб до 17 Мб. 14 мб из них это как раз массивы городов. Уменьшил за счет удаления всех стран. Оставил только 4 страны. Немного изменил, поудалял код. Серилазиацию массива убрал. Сохраняю его в свойство класса, в файл не сохраняю.
    Больше не знаю как сделать...
    Можно еще как-то уменьшить память для многомерного массива? Многомерный потому, что идет поиск в массиве города по id.
     
  10. danneo

    danneo Честный

    Регистр.:
    13 ноя 2007
    Сообщения:
    1.463
    Симпатии:
    114
    почему-то код:
    PHP:
    file_put_contents( ENGINE_DIR . '/cache/system/' . $file. '.php' , '<?php return ' . var_export( $data , TRUE ) . '?>', LOCK_EX); //сохранение в файл
    делает вывод на дисплей весь массив, причем как сериализованный. И в файл сохраняет. Может быть такое и почему? Как сделать, чтобы не выводил, true указано?
    Причем выводит только на хостинге. На локалке не выводит...