CakePHP ускорит веб-сайт

CakePHP ускорит веб-сайт

Разработчики которые не использовали CakePHP, думают о нём, как о медлительном фреймворке. Действительно, CakePHP не самый быстрый framework по результатам многих тестов, прежде всего производительность CakePHP зависит от самих приложений.

Используя несколько простых модификаций, и даже некоторые более сложные усовершенствования, CakePHP может ускорить сайт. По сравнению с другими фреймворками, производительность вашего сайта с помощью CakePHP никогда не дрогнет, возможно поэтому framework CakePHP на сегодняшний день, самый популярный.

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

Обновить версию CakePHP

В версии 1.3 был произведён капитальный ремонт базовой архитектуры CakePHP. Я сделал несколько тестов ,  что бы сравнить CakePHP версии 1.2 и 1,3 и 2,0. Результаты были поразительными. После обновления с 1,2 до 1,3 был прирост производительности на 70%.

Если вы не обновляли CakePHP, то первое, что вы должны сделать, это обновить как минимум до версии 1.3, но предпочтительнее версии 2.x.

Отключить режим отладки

Когда перемещаешь код в реализацию, можно легко забыть отключить отладку. Для типичной установки, для приложения нужно создать несколько файлов /config /core.php: один для локальной среды, для каждого разработчика, один для настройки и один для производства. Эти файлы содержат различные настройки в зависимости от направления.

Ключевые изменения Configure::write(‘debug’, 2) на Configure::write(‘debug’, 0)

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

Отключить рекурсивный вывод результатов

При выполнении запроса с использованием метода  find() , рекурсии имеет значение по умолчанию 0 . Это означает, что CakePHP должен пытаться присоединиться к любой связанной модели первого уровня. Например, если у вас есть модель пользователя, которая имеет много комментариев, каждый раз при выполнении запроса пользователем, модель будет подключаться к таблице комментарий.

Время на выполнение, возврат, а также создания ассоциативного массива с этими данными, может быть значительным.

Подход по умолчанию, убедившись, что ни одна рекурсия не является для переопределения значений, добавив в приложение app/Model/AppModel.php следующий код:



<?php
class AppModel extends Model {
    public $recursive = -1;
}


Результаты кэширования запросов

Есть и другие статьи аналогичного решения.

Во многих веб-приложениях, есть, вероятно, много запросов к базе данных, но не обязательно. Значение по умолчанию для функции find()  внутри приложение app/Model/AppModel.php, сделать это легко для кэширования результатов полного ассоциативного массива запросов. Это означает, что мы не только избежим столкновения с базой данных, но и избежим время обработки CakePHP преобразования результатов в массив. Необходимый код выглядит следующим образом:



<?php
class AppModel extends Model
{
    public $recursive = -1;

    function find($conditions = null, $fields = array(), $order = null, $recursive = null) {
        $doQuery = true;
        // check if we want the cache
        if (!empty($fields['cache'])) {
            $cacheConfig = null;
            // check if we have specified a custom config
            if (!empty($fields['cacheConfig'])) {
                $cacheConfig = $fields['cacheConfig'];
            }
            $cacheName = $this->name . '-' . $fields['cache'];
            // if so, check if the cache exists
            $data = Cache::read($cacheName, $cacheConfig);
            if ($data == false) {
                $data = parent::find($conditions, $fields,
                    $order, $recursive);
                Cache::write($cacheName, $data, $cacheConfig);
            }
            $doQuery = false;
        }
        if ($doQuery) {
            $data = parent::find($conditions, $fields, $order,
                $recursive);
        }
        return $data;
    }
}


Тонкие изменения должны быть внесены в запрос где мы хотим кэш. Основной запрос, выглядит следующим образом:



<?php
$this->User->find('list');


требует обновления, чтобы включить кэширование информации:



<?php
$this->User->find('list',
    array('cache' => 'userList', 'cacheConfig' => 'short')
);


Два дополнительных значений добавит: имя кэш-памяти и конфигурацию кэша, которые должны быть использованы.  Два заключительных изменения должны быть внесены в приложение /config /core.php. Кэш должен быть включен и значение cacheConfig, которое используется должно быть определено. Во-первых, раскомментируйте следующую строку:



<?php
Configure::write('Cache.check', true);


А затем, добавить новые конфигурации кэша следующим образом (обновление необходимые параметры для имени и срока действия):



<?php
Cache::config('short', array(
    'engine' => 'File',
    'duration'=> '+5 minutes',
    'probability'=> 100,
    'path' => CACHE,
    'prefix' => 'cache_short_'
));


Все из перечисленных выше вариантов может быть обновлено, изменить имя, или даже определить, где память кэша должна хранится.

Для более подробного объяснения о том, как добавить, обновить и очистить кэш, продолжите чтение о конкретной оптимизации кэширования.

Не думайте что это конец CakePHP кэширования. Можно кэшировать контроль действий, представлений и даже вспомогательные функции. Смотрите книгу CakePHP с  кэшем и компонентами  для получения дополнительной информации.

Установить память для кэша

По умолчанию, сессий PHP хранятся на диске (обычно в папке). Это означает, что каждый раз при обращении к сессии, PHP необходимо открыть файл сессии и декодировать информацию, которую он содержит. Проблема в том, на дисках запись/чтение может быть довольно дорогим процессом. Доступ к элементам в памяти, отличается скоростью запись/чтение с диска и является намного быстрее.

Есть два хороших подхода к сессии связанных дисков I/O. Первый из них заключается в настройке памяти RAM на жестком диске сервера. После настройки диска будет смонтирован как и любой другой диск и значение session.save_path в php.ini будет обновляться, чтобы указать на новый диск. Вторым способом является установка программного обеспечения, такое как  Memcached , открытая система кэширования, которая позволяет объектам хранится в памяти.

Что бы узнать, какой подход для вас лучше, ответе на следующие вопросы: Сколько будет серверов требующие доступ к этой памяти одновременно? Если больше одного, то вам нужен Memcached, поскольку он может быть установлен ​​на отдельной системе, и разрешает доступ к нему другим серверам. Но, если вам нужно, ускорить один веб-сервер, выбирайте решение RAM диск, это хорошо и быстро работает и не требует никакого дополнительного программного обеспечения.

Установить Memcached

В зависимости от вашей операционной системы, установка Memcached простая.

Если в кэше ничего нет, то делается запрос к базе и результаты записываются в Memcache



# cd /usr/ports/databases/memcached
# make install clean
# ee /etc/rc.conf


Добавляем строку в /etc/rc.conf:



# memcached_enable="YES"
/usr/local/etc/rc.d/memcached start


Ставим расширение для php:



# cd /usr/ports/databases/pecl-memcache
# make install clean


По окончанию установки наблюдаем следующее:



===> Checking if databases/pecl-memcache already installed

install -o root -g wheel -m 444 /usr/ports/databases/pecl-memcache/work/memcache-3.0.6/example.php /usr/local/share/examples/memcache

===> Registering installation for pecl-memcache-3.0.6

****************************************************************************

The following line has been added to your /usr/local/etc/php/extensions.ini

configuration file to automatically load the installed extension:

extension=memcache.so

****************************************************************************

===> Cleaning for pecl-memcache-3.0.6


Говорится о том что pecl-memcache удачно установлен, и нужно лишь подключить его:

В /usr/local/etc/php/extensions.ini

дописываем:



extension=memcache.so


Ну и можно перезапустить апач что бы изменения вступили в силу.
После установки, вы можете настроить PHP для хранения сессий в памяти путем обновления php.ini :



session.save_handler = Memcache  
session.save_path = 'tcp :/ / 127.0.0.1:11211 "


Если Memcached установлен на другой порт или хост, то изменение записи соответственно.

После того как вы закончили установку на своем сервере, вам также необходимо установить модуль PHP Memcache. Снова в зависимости от вашей операционной системы, одной из этих команд:



pecl install memcache


или:



sudo aptitude install php5-memcache


Установка Memcached PHP под Windows

  1. Скачиваем файл запуска exe   memcached  и распаковываем его в любое, удобное для Вас, место.
  2. Скачиваем модуль   memcached  для PHP и распаковываем  php_memcache.dll  в каталог расширений PHP (обычно «ext/» в директории PHP), а также в php.ini дописываем следующую строку:
    
    
    extension = php_memcached.dll
    
    
    
  3. Устанавливаем  memcached .Подробности: дело в том, что данная версия (1.4.5) не устанавливается как служба Windows самостоятельно, отображается ошибка:
    
    
    Failed to ignore SIGHUP: Result too large
    
    
    

    Поэтому нам понадобится некий « NSSM — the Non-Sucking Service Manager » для решения этой проблемы.

    Переходим в каталог с распакованным  NSSM  и из командной строки запускаем:

    
    
    nssm.exe install memcached "путь_к_ранее_распакованному_файлу_memcached.exe"
    
    
    
  4. Идем в  Панель Управления — Администрирование — Службы  и запускаем службу « memcached «, а также учим её запускаться автоматически с Windows.
  5. Перезапускаем PHP (Apache)

Удаление Apache и Установка Nginx

Apache по-прежнему является хорошим сервером но  согласно последним статистическим данным  Ngnix набирает много рейтинга, когда речь идет о наиболее интенсивным движением веб-сайтов в Интернете. В самом деле, Nginx становится популярной заменой Apache.

Apache, как Microsoft Word, он имеет миллион вариантов, но вам нужно всего лишь шесть. Nginx делает эти шесть вещей, и это делает пять из них в 50 раз быстрее, чем Apache. —   Крис Ли

Nginx от Apache отличается событиями, а не процессами на основе серверов. Apache быстро забивает память. Чтобы правильно обрабатывать новые запросы, процессы Apache вызывают увеличение памяти и времени ожидания создание новых потоков. Между тем, Nginx работает асинхронно и использует один или несколько очень легкие темы.

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

В конце концов, если вам не хватает памяти Nginx будет потреблять всего 20-30M, где Apache может быть много вверх 200M для той же нагрузке. Память может быть дешевым для настольного ПК, но не тогда, когда дело доходит до оплаты серверов в сети!

Для более глубокого разбора между Apache и Nginx посетите  Apache против Nginx WikiVS  .

HowToForge имеет отличную статью по настройке Nginx на вашем сервере. Я предлагаю следующий шаг-за-шагом руководство по установке и настройке Nginx с PHP-FPM.

Настроить Nginx для Memcached

После установки Nginx и Memcached, что делает их рядом друг с другом будет еще больше расширять производительность. Хотя приложение CakePHP являются динамическими, то, скорее всего 80-90% все еще относительно статических — это значит, что изменения только в определенные промежутки времени.

Путем внесения следующих изменений в файл конфигурации Nginx, Memcached начнет, обрабатывать ваши запросы Nginx, которые уже были обработаны и сохранены в памяти. Это означает, что всего лишь несколько запросов, будет вызываться PHP, что увеличит скорость вашего сайта.



server {
    listen 80;
    server_name endyourif.com www.endyourif.com;
    access_log /var/log/nginx/endyourif-access.log;
    error_log /var/log/nginx/endyourif-error.log;
    root /www/endyourif.com/;
    index index.php index.html index.htm;

    # serve static files
    location / {
        # this serves static files that exists without
        # running other rewrite tests
        if (-f $request_filename) {
            expires 30d;
            break;
        }
        # this sends all-non-existing file or directory requests
        # to index.php
        if (!-e $request_filename) {
            rewrite ^(.+)$ /index.php?q=$1 last;
        }
    }

    location ~ \.php$ {
        set $memcached_key '$request_uri';
        memcached_pass 127.0.0.1:11211;
        default_type       text/html;
        error_page 404 405 502 = @no_cache;
    }

    location @no_cache {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
    }
}


Приведенная выше конфигурация указывает, что статические файлы должны быть приняты сразу. PHP файлы должны быть направлены на Memcached, чтобы служить странице, если она была сохранена в кэше. Если она не существует в кэше, @ NOCACHE расположение будет достигнуто, которое действует как предыдущие настройки PHP, чтобы работать на странице через PHP-FPM.

Не забудьте обновить приложение сonfig /core.php:



<?php
$engine = 'File';
if (extension_loaded('apc') && function_exists('apc_dec') && (php_sapi_name() !== 'cli' || ini_get('apc.enable_cli'))) {
    $engine = 'Apc';
}


становится:



<?php
$engine = 'Memcache';


Наш код для кэширования запросов также требует обновления:



<?php
Cache::config('short', array(
    'engine' => 'Memcache',
    'duration'=> '+5 minutes',
    'probability'=> 100,
    'path' => CACHE,
    'prefix' => 'cache_short_'
));


Удалить MySQL и установить Percona

Окончательная модификацию сервера, установка сборки MySQL  Percona . Команда Percona в течение многих лет работала с пониманием и тонкой настройкой архитектуры базы данных для оптимальной производительности.  Инструкции по установке Percona  там описывается несколько различных вариантов установки.

Заключение

Есть довольно много методов для обеспечения CakePHP которые будут работать. Некоторые изменения сделать труднее, чем другие.

2 комментария на тему “CakePHP ускорит веб-сайт”

  1. Начал читать — понравилось. Думал даже денюжку кинуть на счёт, НО… уже со 2/5 части статьи пошёл порожняк (машинный перевод). Доделайте, коли начали. Статья то хорошая, но пока приятнее читать в оригинале (кстати, ссылочку то поставьте).

    1. Привет Юрий,
      Вы правы, перевод не из лучших, в 2014 году все статьи с плохим переводом изменятся, и будут перемешены на платный для входа сайт. Там, за деньги, вы сможете читать статьи без (порожняка).

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *


8 + 8 =

Можно использовать следующие HTML -теги и атрибуты: <a href= http://pixelcom.crimea.ua/"" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>