Первая бета Phalcon 1.0.0

    Сегодня группа разработчиков Phalcon выпустила первую бета-версию фреймворка Phalcon 1.0.0. Для тех, кто не в курсе: Phalcon — это PHP-фреймворк, написанный на Си и работающий как расширение для PHP, прочитать про него на Хабре можно в статьях Phalcon — скомпилированный PHP MVC Framework и Phalcon: Давайте учиться на примере.
    Цель выпуска этой версии — получение обратной связи от сообщества и обнаружение максимума ошибок.



    Краткий анонс важных нововведений этой версии:
    1. Многоуровневое кеширование
    2. Улучшения в шаблонизаторе Volt
    3. Горизонтальный и вертикальный шардинг
    4. Запись состояния (Record Snapshots)
    5. Динамическое обновление
    6. Валидация



    1. Многоуровневое кеширование


    Новая возможность компонента кеширования позволяет разработчику осуществлять кеш в несколько уровней. Возможность будет полезна при сохранении кеша в нескольких местах (системах кеширования) с разным временем жизни, и последующим поочерёдным чтением из них начиная с самого быстрого (в порядке регистрации) и заканчивая самым медленным, пока срок жизни во всех них не истечет.
    <?php
    
    $ultraFastFrontend = new Phalcon\Cache\Frontend\Data(array(
        "lifetime" => 3600
    ));
    
    $fastFrontend = new Phalcon\Cache\Frontend\Data(array(
        "lifetime" => 86400
    ));
    
    $slowFrontend = new Phalcon\Cache\Frontend\Data(array(
        "lifetime" => 604800
    ));
    
    //Backends are registered from the fastest to the slower
    $cache = new \Phalcon\Cache\Multiple(array(
      new Phalcon\Cache\Backend\Apc($frontCache, array(
            "prefix" => 'cache',
        )),
        new Phalcon\Cache\Backend\Memcache($fastFrontCache, array(
            "prefix" => 'cache',
            "host" => "localhost",
            "port" => "11211"
        )),
        new Phalcon\Cache\Backend\File($slowestFrontCache, array(
            "prefix" => 'cache',
            "cacheDir" => "../app/cache/"
        ));
    ));
    
    // Сохранение, сохраняется сразу во все системы кеширования
    $cache->save('my-key', $data);
    
    // Получение, читается сразу со всех систем где кеш еще живой
    $data = $cache->get('my-key');
    



    2. Улучшения в шаблонизаторе Volt


    Volt (написанный так же на Си) получил в этой версии несколько новых возможностей:
    {# Тернарный оператор #}
    {{ total > 0 ? total|format('%0.2f') : '0.0' }}
    
    {# Поддержка For-Else #}
    {% for robot in robots %}
        {{ robot.name }}
    {% else %}
        There are no robots
    {% endfor %}
    
    {# Циклы внутри контекста #}
    <table>
    {% for robot in robots %}
        {% if loop.first %}
            <thead>
                <tr>
                    <th>Position</th>
                    <th>Id</th>
                    <th>Name</th>
                </tr>
            </thead>ae
            <tbody>
        {% endif %}
        <tr>
            <th>{{ loop.index }}</th>
            <th>{{ robot.id }}</th>
            <th>{{ robot.name }}</th>
        </tr>
        {% if loop.last %}
            <tbody>
        {% endif %}
    {% endfor %}
    </table>
    
    {# Контролирование пробелов в разделении (Space control delimiters) #}
    <ul>
        {%- for robot in robots -%}
        <li>  {{- robot.name -}}</li>
        {%- endfor %}
    </ul>
    



    3. Горизонтальный и вертикальный шардинг


    Теперь для записи и чтения из базы данных можно использовать разные соединения. Полезность проявляется при работе с master/slave конфигурацией СУБД:
    class Robots extends Phalcon\Mvc\Model
    {
        public function initialize()
        {
            $this->setReadConnectionService('dbSlave');
            $this->setWriteConnectionService('dbMaster');
        }
    }
    


    Также возможен горизонтальный шардинг, когда соединение выбирается в зависимости от запрашиваемых данных:
    class Robots extends Phalcon\Mvc\Model
    {
        public function selectReadConnection($intermediate, $bindParams, $bindTypes)
        {
            // Проверяем, есть ли в запросе условие 'where'
            if (isset($intermediate['where'])) {
    
                $conditions = $intermediate['where'];
    
                // Выбираем соединение в зависимости по требуемому условия
                if ($conditions['left']['name'] == 'id') {
                    $id = $conditions['right']['value'];
                    if ($id > 0 && $id < 10000) {
                        return $this->getDI()->get('dbShard1');
                    }
                    if ($id > 10000) {
                        return $this->getDI()->get('dbShard2');
                    }
                }
            }
    
            // В остальных случаях используем соединение по умолчанию
            return $this->getDI()->get('dbShard0');
        }
    
    }
    



    4. Запись состояния (Record Snapshots)


    Теперь в моделях может быть установлено свойство для хранения значений полей в момент запроса. Вы можете использовать эту функцию для аудита или проверки изменения значений полей в процессе работы:
    class Robots extends Phalcon\Mvc\Model
    {
        public function initalize()
        {
            $this->keepSnapshots(true);
        }
    }
    


    Так можно проверить значения каких полей были изменены:
    $robot = new Robots();
    $robot->name = 'Other name';
    var_dump($robot->getChangedFields()); // ['name']
    var_dump($robot->hasChanged('name')); // true
    var_dump($robot->hasChanged('type')); // false
    



    5. Динамическое обновление


    Позволяет ORM при формирования SQL запроса UPDATE использовать в нём только те поля, значения которых были изменены, а не собирать все поля и все их значения. Это уменьшает трафик между серверами приложения и базы данных, что в свою очередь может благоприятно сказаться на производительности:
    class Robots extends Phalcon\Mvc\Model
    {
        public function initalize()
        {
            $this->useDynamicUpdate(true);
        }
    }
    



    6. Валидация


    Новый компонент Phalcon\Validation позволяет осуществлять независимую проверку данных. Компонент основан на проверках уже реализованных в ORM и ODM. С его помощью можно проверять данные не связанные с какой-либо моделью или коллекцией:

    $validation = new Phalcon\Validation();
    
    $validation
        ->add('name', new PresenceOf(array(
            'message' => 'Поле name обязательно для заполнения'
        )))
        ->add('name', new StringLength(array(
            'min' => 5,
            'minimumMessage' => 'Значение поля name слишком короткое'
        )))
        ->add('email', new PresenceOf(array(
            'message' => 'Поле email обязательно для заполнения '
        )))
        ->add('email', new Email(array(
            'message' => 'Email не соответствует формату'
        )))
        ->add('login', new PresenceOf(array(
            'message' => 'Поле login обязательно для заполнения'
        )));
    
    $messages = $validation->validate($_POST);
    if (count($messages)) {
        foreach ($messages as $message) {
            echo $message;
        }
    } 
    


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

    Помочь с тестированием


    Получить эту версию можно с GitHub из ветки 1.0.0:

    git clone http://github.com/phalcon/cphalcon
    cd build
    git checkout 1.0.0
    sudo ./install
    


    Пользователи Windows могут скачать готовую библиотеку DLL на странице загрузки.

    С радостью примем ваши замечания и предложения на Phosphorum, Stack Overflow или Google Group. Если вы обнаружили ошибку и можете сформировать тест для её повторения или решения — отправте нам pull request или создайте issue на GitHub.

    P.S. Перевод вольный с дополнениями, оригинал здесь.
    Для поддержки фреймворка создана група вконтакте, русский сайт и начата локализации документации, присоединяйтесь!
    Есть так же другой перевод документации и примеров Phalcon PHP FrameWork

    Права на оригинальное фото принадлежат Simon Roy: 500px.com/photo/7924712
    Поделиться публикацией

    Похожие публикации

    Комментарии 49

      –8
      yet another…
      • НЛО прилетело и опубликовало эту надпись здесь
          +4
          Быть может, автор комментария намекал на YaF, также являющийся фреймворком, компилируемым в расширение PHP? :)
          +2
          yet another…

          ...but better and faster than…

          Не стоит делать поспешных выводов. Сначала посмотрите что это, и подумайте «yet another…» или нет.
        0
        Если подобные топики не выйдут в лидеры, то не видать нам будущего в этой тарелке. От ваших щелканий мышек по "+" вероятна степень увеличения комьюнити данного продукта в определенное колчества раз. Так что не стоит пренебрегать нашими возможностями вечных комментаторов.
          +5
          От вас зависит жизнь ребенка! Еще вчера Маша радовалась жизни…
            +9
            > От вас зависит жизнь ребенка! Еще вчера Маша радовалась жизни…

            А СЕГОДНЯ ОНА ПРОГРАММИРУЕТ НА PHP, прошу прощения за капс-лок.
          +2
          Я ни разу не программист, но хотел бы покрутить CMS, работающую на этом фреймворке.
            +2
            Есть наработки и в этом направлении, пока версия очень сырая но сделано довольно много github.com/lantian/PhalconEye
            +8
            Ох с багами траблов будет… пышные хоть можно сразу пофикссить, а для сишных нужно еще и сишника на проект нанимать. Совмещение двух языков когда это не кровь из носу как нужно идея всегда плохая.
            А так вообще не увидил ничего нового или гениального, все это уже есть в куче фреймов.

            Насчет моделей вообще странно, модели есть тока для реляционок, а для нереляционных нет.
            У меня к примеру данные записываются всегда в кеш приложения и только под конец скопом загоняются в базу, при этом делается один большой массив изменений который шлется на клиент(я игры делаю). Дергать базу лишний раз это всегда выливается в создание горлышка.
              0
              Мыслится мне, что это можно решить множественным наследованием — так, что можно будет обойтиться одним пышником
                0
                Что именно решить?
                  0
                  Я к вопросу о том, что надо искать сишника. Все-таки мне не ясно — я разве неверно понимаю, что можно унаследовать какой-то (тупо) класс и расширить/переопределить в нем все, что надо? Да, это вообще говоря, создаст лишнюю прослойку, но это выход.
                  +4
                  А как вы узнаете что именно глючит? В том же зенде/кохане/др я могу залезть в исходник и сразу узнать что не так, что нужно переопределить чтоб он работал как мне нужно, здесь же это будет проблемой.
                  +14
                  может наконец баги станут отправлять разработчикам а не костыли в фреймверк пихать.
                    +2
                    Про то что использовать фреймворк для всех типичных задач не стоит согласен более чем полностью.
                    Что касается быстрой правки ошибок внутри фреймворка — решали их наследованием оригинального класса и своей php-реализацией бажного метода, плюс уведомление разработчиков. Проблемы, корректно озвученные и записанные в issue на github решались разработчиками в кратчайшие сроки, в среднем в течении сутки решаются большинство проблем и исправления доступны для сборки.

                    Для ODM есть модели, но работа и построение несколько иначе чем для реляционных БД: docs.phalconphp.com/en/0.9.0/reference/odm.html
                      +1
                      Надеятся на чужой саппорт это плохая ситуация, потому как сегодня фиксят а завтра нет. Если нет контракта то риски все на тебе висят.
                      Имел кучу ситуаций когда проблемы упирались в сторонее ПО а сапорт разгребал крайне долго, если вообще разгребал. К примеру lxml либу так и не пофиксили от одного критичного бага.

                      Насчет наследования уже писал, код метода недоступен, а поэтому неясно как его переписать, а если их не переписать то нарушится стабильность фрейма.
                        0
                        с Вашей логикой
                        Надеятся на чужой саппорт это плохая ситуация
                        получается что вообще стоит в машинных кодах писать и не использовать ничего что уже написано.
                          +4
                          по моей логике если вы пишите на пыхе то юзать си без надобности глупо. И да если можно юзать свой код лучше юзать свой. К сожалению это далеко не всегда возможно. Посему приходится юзать. Но, одно дело когда выбора нет, и другое когда он есть.
                          Пока что ни одного плюча за использование этого фрейма не увидил.
                            +1
                            Позиция имеет право быть, каждый волен выбирать чем пользоваться.
                            Для себя мы увидели реализацию всех возможностей типичного php-фреймворка с максимальной скоростью и минимальным потреблением памяти. Проблемы найденные в чужом коде на Си и до их исправления решали реализацией аналогичных методов на php, недостающие в Phalcon компоненты использовали из Symfony.
                          0
                          код метода недоступен, а поэтому неясно как его переписать


                          Думаю, не всё так страшно. Немного посидеть с исходниками фреймворка, разбираясь со спецификой разработки расширений для PHP, и логику методов можно будет понимать, даже если с Си раньше ни разу не сталкивался. Лезть править код не нужно же, только понять как метод собирается делать то, что он должен делать и реализовать эти «что и как» на PHP, портировать по сути, исправляя баг.
                            +1
                            Мне кажется любому пхпшнику полезно знать как оно «там» работает. (я про github.com/php/php-src)
                      +3
                      Очень интересно было бы увидеть реальные бонусы его использования. Т.е. вот более-менее приложение, да пусть тот же бложек или форум, уж не говорю о магазине, реализованный на ZF, Symfony, Phalcon, Yii и Silex. Да хотя бы с Silex сравнить. Просто чем гуще будет бизнес-логика, тем меньше будет ощущаться профит, ИМХО. Ну или с тем же Hip-Hop сравнить.

                      Просто пока не очевидно, зачем нужен фреймворк в виде чёрного ящика, который на ходу быстро не поправишь, если опыта с си нет.
                        0
                        К примеру, у вас в каком-то методе какого-то класса возник баг… ну или необходимость запилить какую-то фичу в нем. В чем проблема унаследовать его и переопределить этот метод? Не обязательно же знать Си.
                          +1
                          В том что этот клас не будет частью Фрейма. В CodeIgnitor есть к примеру переопределение системных классов, а сдесь я этого не увидил. А если этого нет, то наследовать прийдется все.

                          Так же если мне нужно поправить одну строку, а там кода на 5 страниц которого я не знаю то переопределить метод я не смогу, ибо он не будет выполнять заложенный в него функционал.
                            0
                            Мне кажется, надо больше конкретики. Выдумывать теоретические проблемы и искать их теоретические пути решения — занятие увлекательное, но бесполезное. Надо просто выбрать какой-то проект и попробовать вырастить этот проект на Фалконе. А там уже будет видно, что хорошо, а что плохо.
                              0
                              Извольте, какая конкретика Вам еще нужна?! Абсолютно реальный пример — когда баг в ядре фреймворка, самый простой вариант поправить код ядра пока не исправят разрабы… а в случае с falcon'е придётся переопределять метод, классы и т.д. а как это сделать без возможности переопределять классы ядра?? Вариант с правкой си кода ещё хуже, ибо дольше и требует остановки серверов, если они уже не легли из-за бага…

                              П.С. Есть опыт с решениями на PHP, где узкие места написаны на C, без опытного сишника — ни чего хорошего!
                          0
                          Форум фреймворка как раз на нм сделан forum.phalconphp.com, исходники открыты и можно без лишних телодвижений изучить github.com/phalcon/forum
                          Есть так же своя реализация сайта php.net на Phalcon php.phalconphp.com/, исходники доступны github.com/phalcon/php-site
                          И общие примеры реализации MVC парадигмы: github.com/phalcon/mvc
                          0
                          граппа — по моему имелось ввиду «группа»
                            +1
                            Благодарствую, исправлено
                              0
                              Сегодня группа разработчиков Phalcon выпустилоа
                                +1
                                Исправил, спасибо
                            +2
                            Phalcon реально быстрый. Гонял его где-то пол-года назад. Однако внедрение в тот момент остановило отсутствие множества необходимых вещей. ИМХО разработчикам надо подумать об интеграции его например с Symfony 2 или ZF2. Чтобы можно было бы вместо какого-либо компонента фреймворка (роутинг, mvc или ещё что-нибудь) заюзать компоненты Phalcon'а. Тогда да, профит в виде производительности налицо + быстрая интеграция за счёт стандартизированных интерфейсов.
                              0
                              Может быть, приведете результаты ваших тестов? Особенно интересует его производительность относительно связки php+apc.
                              +4
                              Про стандартизацию интерфейсов вопрос сложен, ведь каждый фреймворк реализует своё видение решения проблем и предоставления удобства.

                              А вот с первым вопросом всё намного интереснее и лучше. Phalcon как раз представляет из себя набор очень слабо связанных между собой компонентов, и любой из них можно использовать в стороннем фреймворке в качестве замены. Так же и компоненты из других фреймворков можно использовать внутри Phalcon-приложения. Если используется MVC архитектура — то все компоненты регистрируются по типичным именам в \Pahlcon\Di, и их можно подменить на любой свой класс:
                              $di->set('session', function() {
                              
                                  $session = new Phalcon\Session\Adapter\HandlerSocket(array(
                                          'cookie_path' => '/',
                                          'cookie_domain' => '',
                                          'lifetime' => 3600,
                                          'server' => array(
                                              'host' => 'localhost',
                                              'port' => 9999,
                                              'dbname' => 'session',
                                              'dbtable' => 'php_session'
                                          )
                                  ));
                              
                                  $session->start();
                              
                                  return $session;
                              });
                              

                              Здесь внутренний написанный на Си компонент работы с сессиями подменяется реализацией использующей HandlerSocket и написанной полностью на PHP: github.com/phalcon/incubator/blob/master/Library/Phalcon/Session/Adapter/HandlerSocket.php
                                +1
                                О, уже и DI есть… Класс!
                              +8
                              Когда плотно работал с этим фреймворком много писал разработчикам в github.
                              Результатом стало появление фич «Горизонтальный и вертикальный шардинг» и «Динамическое обновление».
                              Разработчикам спасибо, что прислушались, а тем кто использует этот фреймовк — пишите свои отзывы и найденные баги!:)
                                +4
                                да разработчики реагировали достаточно быстро я нашел несколько ошибок все были исправлены в тот же день
                                особенно порадовала работа с ODM
                                0
                                А как дела обстоят с формами? Насколько помню, в этом релизе должны были сделать более менее удобный инструмент на подобии Zend::Form? Проект классный, я бы дал им Оскар за прорыв года в PHP.
                                  0
                                  Компонент работы с формами добавили, но документация по нему еще скупа
                                    +1
                                    Как и со всеми компонентами для работы с формами)))
                                      0
                                      Зачем ждать документацию когда есть Reflection?
                                    +1
                                    А есть пхп-шные стабы с пхпдоками для всего этого? Я вот например не вижу никаких проблем в том что он на си (в конце концов си интересный и вам его в универе дают), но вот автокомплит/стат.анализ кода от иде это довольно важно для разработчика мне кажется (если конечно не покрывать все двухметровыми слоями тестов). И, кстати, не хотят ли разработчики сделать альтернативу эктиврекорду? Было бы очень классно увидеть такой doctrine2-киллер, на самом деле я бы принял в этом участие с радостью
                                      +1
                                      Есть. Называется штука devtools. Позволяет не только автокомплит для разных IDE сделать, но и скафолдинг c CRUD и разными генераторами получить: phalcon-docs-ru.readthedocs.org/ru/latest/reference/tools.html Про стабы в самом конце страницы (Integrating Tools with PhpStorm IDE), пример для PHPStorm, но для остальных аналогично.
                                        0
                                        С Active records тоже всё хорошо, Phalcon через PDO умеет работать с разными базами в стандартном понимании моделей: phalcon-docs-ru.readthedocs.org/ru/latest/reference/models.html Предоставляет свой слой ORM и ODM: phalcon-docs-ru.readthedocs.org/ru/latest/reference/odm.html

                                        Есть так же своё расширение SQL — синтаксис Phalcon Query Language (PHQL) позволяющий использовать с запросах неймспейсы и связи между таблицами, примерно так:
                                        $phql = "SELECT Formula\Cars.*, Shop\Brands.* FROM Formula\Cars, Shop\Brands WHERE Shop\Brands.id = Formula\Cars.brands_id";
                                        $rows = $manager->executeQuery($phql);
                                        foreach ($rows as $row) {
                                            echo "Car: ", $row->cars->name, "\n";
                                            echo "Brand: ", $row->brands->name, "\n";
                                        }
                                        
                                          +1
                                          Да не, я не про то что там плохо сделан active record, просто сам по себе active record не хороший паттерн, вот и интересуюсь, может есть начинания на основе датамаппера.

                                      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                      Самое читаемое