среда, 4 марта 2015 г.

Как я запустил новый блог devsize.ru

Привет всем!
Наверное этот блог один из самых непосещаемых в интернете :). Удивляться тут не чему, в этом блоге я писал почти ни кому не нужные заметки.
Но на днях я запустил новый блог devsize.ru в котором собираюсь писать самые горячие статьи для веб-разработчиков. Если вам это интересно - то добро пожаловать!
А вот и первая горячая статья - Laravel vs Symfony — 5 Шагов к Выбору PHP Фреймворка !

четверг, 30 октября 2014 г.

Symfony2 и 160 человек на сайте

Интересная история у нас тут на днях приключилась)
Так вышло что нам пришлось временно переключить архивы старого сайта predanie.ru/audio|film|muz на новую медиатеку media.predanie.ru которую мы скоро будем запускать на symfony.
Местами мы используем symfony http cache на сайте и в некоторых местах doctrine result cache. Мы были очень удивлены, что наш сайт начал загибаться когда к нам зашли одновременно 150-160 человек. Зайдя по ssh на сервер - было видно что apache начинает генерировать кучу процессов httpd. Количество процессов подчас достигало отметки более 200. Более 200 процессов httpd - это уже слишком.
Все этому приводило к тому что апач просто переставал работать и сайт становился недоступен.
Сейчас анализируя ситуацию - я понимаю, что одна из проблем это фоновые ajax запросы на главной странице. Мы используем angularjs и при заходе на главную страницу мы отправляли 2 одновременных запроса, которые возвращали рекомендуемые и новые произведения. Результаты фоновых запросов не кешировались.
Пока мы решили вообще убрать фоновые запросы на главной странице и закешировать ajax запросы которые возвращают произведения в json формате.
Хотим теперь сделать нагрузочное тестирование с помощью JMeter или loadimpact.com.
Надеюсь ситуация улучшится. Позже постараюсь отписаться об успехах)

вторник, 12 ноября 2013 г.

Git push не меняет файлы на сервере?


На днях с коллегой начали разбираться с системой контроля версий git. Немного заглянув в документацию начали экспериментировать.
Настроили репозиторий на тестовом сервере. Склонировали себе репозиторий локально.
Вообще мы планировали иметь каждый локально по репозиторию, один репозиторий с веткой master на тестовом севере, и один репозиторий с веткой master на продакшн сервере. Мы просто хотели пушить из локального репозитория сразу в ветку master на тестовом сервере, чтобы потом сливать все в ветку master на продакшн сервере. (Что то много слов получается )).
Тут начались непонятки...

понедельник, 28 октября 2013 г.

Мои впечатления от symfony camp 2013

Вчера приехали с Symfony CAMP UA 2013.
Хотел поделиться короткими впечатлениями о докладах.

Hiphop vm: Vadim Borodavko
Хотите ускорить исполнения php кода на сервере в 5-6 раз? Тогда попробуйте hiphop vm, да говорят, там не все гладко, но если скорость для вас критична то можно попробовать.

Resting with symfony2: Lukas Kahwe Smith
Очень надеялся на этот доклад, но языковой барьер взял своё. Доклад воспринял не вполне. Наверное надо чаще практиковать прослушивание докладов на англ. языке.

Erlang: Yevgeniy Shyshkin
Кажется крутая штука, но сам Евгений говорил, что область применения её очень узконаправленная. Я так и не понял где это можно применить. 

Sylius: Paweł Jędrzejewski
Честно говоря было неинтересно, но все равно спасибо докладчику. + не привык я слушать доклады на англ. языке.

Enterprise Symfony Architecture: Alexander Lisachenko
Там где было понятно, там было интересно ))
Что запомнилось.
SOLID принцип, если у вас большой серьёзный проект и вы не используете эти принципы то не о чем дальше и говорить ).  
Надо возобновить в памяти что когда-то про них читал.

Алексендр говорил, что get, set методы для доктрин сущностей они не используют, а используют рефлексию для установки свойств, да, и ещё Александр сказал, что для этого круто использовать замыкания, ого?)

Elastic search: Oleg Zinchenko
Кроме всего прочего доклад заставил задуматься о масштабируемой архитектуре. Об узлах или нодах. Если я правильно понял эластик поддерживает репликацию данных на все узлы, даже если какой то из серверов временно падает, то потом другие ноды дают этому серверу знать что обновилось за время его падения. Это круто ). Я рад, что мы уже поставили на сервер эластик. Спасибо Олегу за доклад.

Asynchronous processing with PHP and Symfony2: Kirill Chebunin
И хотя я у него вконтакте увидел анти христианскую картинку, что печально видеть верующему человеку, Кирилл заинтересовал асинхронными процессами. Рассказывал как они это делают используя rabbitMQ. Стало интересно где это можно применить. Вообщем про rabbit надо почитать однозначно. + поддержка масштабируемости.

Continuous Integration: Max Romanovsky
Ожидал чего то другого от доклада. Мы не досидели до конца доклада потому что надо было идти на поезд )

----
Была надежда что выиграю phpstorm, но видать не в этот раз ))

Спасибо организаторам за Камп и за классные футболки и за пакетик с подарками! С Богом!

вторник, 16 июля 2013 г.

Symfony2 и Tinymce

Возник вопрос, как не особо заморачиваясь, добавить редактор tinymce в symfony2 проект. Нужно это нам преемущественно для админки.
Немного погуглив, наткнулся на бандл https://github.com/stfalcon/TinymceBundle, разрабатывал бандл украинский разработчик. Но в бандле была не последняя версия tinymce, поэтому было принято решение, написать это самому через расширение формы.
Итак, что я сделал:

четверг, 28 февраля 2013 г.

Как убрать /app.php из URL на Symfony 2

После очередных танцев с бубном получилось убрать app.php
Помог http://stackoverflow.com/questions/869092/how-to-enable-mod-rewrite-for-apache-2-2

Если у Вас тоже не получается и mod_rewrite на сервере включен и Вы используете виртуальные хосты на сервере то обратите внимание на директиву AllowOverride All. 
Опция AllowOverride указывает Apache, какие директивы в файле .htaccess допустимы
Как только я добавил эту директиву у меня все заработало!
        
<VirtualHost *:80>
        ServerName sym.example.com
        DocumentRoot /var/www/html/Symfony/web/
        CustomLog logs/symfony.access.log combined
        ErrorLog logs/symfony.error.log
        AddType application/x-httpd-php php
        AddDefaultCharset UTF-8
   <Directory "/var/www/html/Symfony/web">
        DirectoryIndex app.php
        Order allow,deny
        Allow from all
        Options Indexes FollowSymLinks
        AllowOverride All
   </Directory>
</VirtualHost>

пятница, 15 февраля 2013 г.

SonataAdminBundle и загрузка файлов

Ну во-первых можете меня поздравить! Мне дали задачу реализовать прототип архива нашего сайта на Symfony2 + Doctrine 2. Ух, это вещь скажу я вам! Далеко вперед шагнула современная веб-разработка. Давно я не получал удовольствия от программирования! В сторону Битрикса уже не хочется смотреть совсем )
Итак понадобилась админка. CRUD генератор Доктрин классная вещь, но из него нужно еще делать админку. Пока решил установить популярный SonataAdminBundle. Это оказалось не так уж просто. Решил, что лучше поставить также Composer (менеджер зависимостей), чтобы он сам определял зависимости. Ну и тут не обошлось без танцев с бубном. Погуглил, посмотрел issues на gitHub и с трудом Sonata установилась со всеми нужными пакетами.
Вещь классная, но тут стал вопрос как загружать изображения в админке. Для этого вроде бы есть SonataMediaBundle, но пока хотелось бы просто обойтись загрузкой файла.
Опять танцы с бубном. Погуглил.
Создал свойство $file, в сущности Image и метод который делает следующее:
    public function setFile($file)
    {
        $this->file = $file;
        $fileName = uniqid() . '.' . $file->guessExtension();
        $file->move($this->getUploadRootDir(), $fileName);
        $this->path = $fileName;
        $this->file = null;
    }
А чтобы наша картинки отображалась в списке в админке, нужно добавить след. строки в административный класс который наследует класс Sonata\AdminBundle\Admin\Admin:
class ImageAdmin extends Admin
{
...
public function configureListFields(ListMapper $listMapper)
    {
        $listMapper->add('id')
                   ->add('shortDescription')
                   ->add('path', null, array(
                       'template' => 'YOURNamespaceYourBundle:Image:showImage.html.twig'
                       ))
                   ->add('seoCode')
                   ->add('yearOfPainting')
                   ->add('_action', 'actions', array(
                       'actions' => array(
                           'edit' => array(),
                       )
                   ));
    }
а в шаблоне что-то типа:
<td>
    <img src="{{ object.photo }}" style="height: 100px;" />
</td>

правда, для разных списков может понадобиться создавать разные шаблоны, а править код сонаты не хочется. Но чувствую на этом ньюансы не закончатся! Может все таки стоит попробоавть SonataMediaBundle. До встречи!