Giới thiệu Phalcon PHP

by Thien

on Oct 30/15 at 06:30

Ngày nay việc lựa chọn cho mình một PHP Framework là cực kỳ khó khăn vì có quá nhiều PHP FW tốt, như Laravel, CodeIgniter, FuelPHP, Zend, Sysmfony. Cá nhân tôi thích Phalcon PHP vì vậy hôm nay tôi sẽ giới thiệu nó và tại sao tôi chọn nó , vậy Phalcon PHP là gì, theo như trên trang chủ nó.

Phalcon PHP

Phalcon là một mã nguồn mở, có đầy đủ tính năng của một mô hình MVC và nó được viết bằng ngôn ngữ C, sau đó build thành file .DLL và tích hợp vào danh sách Extensions của Apache, vì vậy nó có tính performance cao, hay có thể nói tốc độ của nó sẽ nhanh hơn các Framwork khác.

Ưu điểm:

  • Phalcon là một thư viên có tính năng rất phong phú được viết bằng C biên dịch thành một PHP Extension. Điều này giúp tăng tốc độ xử lý, giảm tối đa bộ nhớ tiêu thụ khi có nhiều truy cập đồng thời. Phalcon rất là dễ học, dễ lập trình so với các PHP Framewok khác. Lập trình viên vẫn dùng ngôn ngữ lập trình PHP thông thường. Những hàm trong thư viện Phalcon sẽ được tối ưu tốc độ

  • Các tính năng có sẵn trong Phalcon cực phong phú ORM, Caching (ra file, bộ nhớ, Redis), hỗ trợ nhiều loại CSDL: MySQL, Postgresql, Oracle, MongoDB.., quản lý người dùng, phân quyền, logging, event manager (tạo hook để can thiệp như trong Drupal và WordPress),… Cộng đồng sử dụng, tham gia đóng góp cải tiến mã nguồn đang tăng nhanh.

Nhược điểm:

  • Phalcon không chạy được trên môi trường Shared Hosting. Có lẽ đây chính là nhược điểm lớn nhất Phalcon PHP, nhưng cá nhân tôi thấy thì ngày nay việc sở hữu một VPS là chuyện đơn giản, do đó không có lý do gì mà không thử Phalcon PHP.

  • Có nhiều người cho rằng Phalcon PHP viết bằng C nên việt Debug nó là rất khó khăn, thật may mắn là trong phiên bản Phalcon 2.0 viết lại bằng ngôn ngữ lập trình Zephir nên đều đó đã giải quyết vấn đề trên.

Cài đặt Phalcon PHP

Ở trên tôi đã review Phalcon, bây giờ chúng ta sẽ bắt đầu đi vào chi tiết hơn để thấy Phalcon PHP dễ học như thế nào, trứớc hết chúng ta cần cài đặt Phalcon PHP nếu bạn sữ dụng Linux thì việc cài đặt không thể dễ dàng hơn, bạn có thể tham khảo tại đây. Trong trường hợp sữ dụng Windown bạn làm theo bước sau:

  • Giải nén file download về và được file php_phalcon.dll
  • Copy file php_phalcon.dll vào thư mục có đường dẫn xampp\php\ext. Folder ext này là nơi chứa các Extension của Apache
  • Mở file php.ini nằm trong đường dẫn xampp\php, sau đó thêm dòng này vào cuối file extension=php_phalcon.dll. Ý nghĩa là load extension có tên là php_phalcon.dll
  • Khởi động lại Xampp

Tôi giả sử bạn dùng Xampp làm web service cho trường hợp này, để kiểm tra Phalcon có cài đặt thành công hay chưa chỉ cần mở command trong Xampp gõ

php --re phalcon

Nếu bạn thấy kết quả hiển thị trong như bên dưới là ok

Extension [ <persistent> extension #57 phalcon version 1.3.4 ] {

  - Dependencies {
    Dependency [ spl (Required) ]
    Dependency [ date (Required) ]
    Dependency [ json (Required) ]
    Dependency [ session (Required) ]
    Dependency [ pcre (Optional) ]
    Dependency [ hash (Required) ]
    Dependency [ apc (Optional) ]
    Dependency [ apcu (Optional) ]
    Dependency [ XCache (Optional) ]
    Dependency [ memcache (Optional) ]
    Dependency [ memcached (Optional) ]
    Dependency [ mongo (Optional) ]
    Dependency [ filter (Optional) ]
    Dependency [ iconv (Optional) ]
    Dependency [ libxml (Optional) ]
    Dependency [ mbstring (Optional) ]
    Dependency [ mcrypt (Optional) ]
    Dependency [ openssl (Optional) ]
    Dependency [ pdo (Optional) ]
    Dependency [ gd (Optional) ]
    Dependency [ imagick (Optional) ]

 [...]

Để tạo khung sườn(Skeleton) Phalcon bạn chỉ cần chạy lênh sau trong terminal nếu dùng Linux hoặc Cmd nếu bạn dùng Windows:


phalcon project demo-app

Sau khi bạn chạy lệnh trên chúng ta sẽ có cấu trúc của dự án như sau:

demo-app/
    app/
        app/cache/
        app/config/
        app/controllers/
        app/models/
        app/views/
    public/
        public/bootstrap/
        public/css/
        public/js/

Như bạn thấy cấu trúc thư mục trên tương tự như các framework khác, bạn có thể tùy biến lại theo nhu cầu của bạn, Phalcon rất linh động do đó bạn có thể tùy biến thư mục trên theo nhu cầu của bạn. Sau khi Phalcon tạo khung sường ở trên, chúng tôi sẽ tạo thêm vài thư mục nữa chẳng hạn thư mục log chứa lỗi debug, vendor chứa các thư viện bên ngoài,form chứa các thành phần nhập liệu sau này dùng để render ra view và thư mục library chứa các chức năng ta viết dùng chung cho hệ thống. Như vậy ta có cấu trúc dự án như sau:

demo-app/
    app/
        app/cache/
        app/config/
        app/form/
            app/log/
        app/library/
        app/controllers/
        app/library/
        app/models/
        app/plugins/
        app/views/
    public/
        public/bootstrap/
        public/css/
        public/js/
    vendor/
        vendor/markdown/

Các bạn có thể thêm hoặc không tùy bạn nhưng tôi khuyên bạn nên thêm vào để sau này quản lý mã nguồn cho nó dễ dàng hơn. Ta hãy xem xét các thành phần cơ bản của nó, trươc hết tập tin .htaccess dùng để tạo được dẫn thân thiện (SEO), trong ví dụ ở đây tôi chạy web-server apache nên tập tin .htaccess có nội dung sau:

 #/chapter1/.htaccess
    <IfModule mod_rewrite.c>
        RewriteEngine on
        RewriteRule  ^$ public/    [L]
        RewriteRule  (.*) public/$1 [L]
    </IfModule>

Nếu bạn chạy web-server là Nginx, thì bạn có thể tham khảo thêm ở đây.

Bootstrap

Mặc định Phalcon tạo tập tin services.php trong thư mục config, tập tin này có nhiệm vụ khởi tạo các dịch vụ mà chúng ta đăng ký cho Phalcon, chẳng hạn như autoloading, bộ xử lý sinh mã html (template engine Volt), khởi tạo kết nối cơ sỏ dữ liệu...Ta hãy xem xét nội dung của tập tin services.php.

    //Register the global configuration as config
    $di->set('config', $config);

    //Setting up the view component
    $di->set('view', function() use ($config) {

        $view = new View();

        $view->setViewsDir($config->application->viewsDir);

        $view->registerEngines(array(
            '.volt' => function($view, $di) use ($config) {
                $volt = new VoltEngine($view, $di);
                $voltOptions = array(
                    'compiledPath' => $config->application->cacheDir,
                    'compiledSeparator' => '_'
                );
                //debug
                if ('1' != $config->application->debug) {
                    $voltOptions['compileAlways = true;
                    }
                $volt->setOptions($voltOptions);
                //load function php
                $compiler = $volt->getCompiler();
                //define variable translate
                $compiler->addFunction('t', '_');

            return $volt;
            }
        ));

    return $view;
    }, true);

    //Loading routes from the routes.php file
    $di->set('router', function() {
        return require __DIR__ . '/routes.php';
    });

Thông tin đầy đủ của tập tin đó bạn có thể xem tại đây. Ở đoạn mã ở trên ngay chổ phần //debug có ý nghĩa rằng mỗi lần Phalcon chạy nó sẽ biên dịch bộ xử lý engine Volt do đó phần bộ nhớ cache sẽ không được lưu lại có ỹ nghĩa rằng bạn không cấn phải xóa cache mỗi khi debug rất tiện lợi, còn trên trang chủ nó nói sẽ tăng hiệu xuất hơn nhưng mình không hiểu rõ lắm tại sao biên dịch lại mỗi khi chạy lại nhanh hơn trong khi có bộ nhớ cache lại chậm hơn ???. Kế đó tôi định nghĩa một hàm trong Volt dùng để dịch đa ngôn ngữ trên web-site. Sau này bạn dùng chỉ cần gọi nó như sau nếu như ở trong view.

Chú ý bạn phải cài thư viện gettext trong php, mặc đinh trong XAMP đã bật, sau này tôi sẽ áp dụng vào dự án của chương sau do đó bạn chỉ cần hiểu thế thôi. Trong nhiều trường hợp Volt không có hàm hỗ trợ có sằn trong API phalcon thì bạn cũng có thể định nghĩa tương tự như hàm t ở trên của tôi. Có nhiều bạn hỏi tôi tại sao phải dùng Volt chi cho rắc rối sao không dùng phtml mặc định của Phalcon chèn mã php vào trong html đó, vâng đúng vậy Votl là không nhanh nhưng nó làm cho code của ta ngắn gọn và dễ bão trì cũng như bảo mật hơn, đó là lý do tại sao trong các có nhiều bộ xứ lý mã html như Twig, Volt về mặt cú pháp cũng giống như Twig, để đóng góp mã nguồn Volt bạn có thể ghé thăm tại đây.

Routes và Contronllers

Nếu các bạn đã từng làm việc qua với các framework khác thì hẳn sẽ không còn xa lạ gì với khái niệm về Route phải không nào. Mục đích của router là định tuyến đến những controller cụ thể nào từ phía request của người sử dụng. Đây cũng là điều dễ thấy trong các PHP Framework phổ biến hiện nay.

Bạn có thể hình dung nó giống như hình bên dưới đây:

Routed Phalcon

Phalcon cung cấp cho ta API Phalcon/Mvc/Router để xử lý router. Một router có thể định nghĩa như sau:

<?php
    $router = new Phalcon\Mvc\Router();
    $router->removeExtraSlashes(true);

    $router->add('/login',array(
            'controller'=>'session',
            'action'  =>'login',
    ));

Phương thức add() nhận tham số đầu tiên là /login khi bạn gõ tham số này http://book-phalcon.dev/login trên trình duyệt web thì nó sẽ tự động điều hướng tới controller là session và action là login, nếu như trong Controller của bạn không có acction thì nó sẽ báo lỗi. Tạm thời bạn chỉ cần hiểu vậy thôi chủ đề về router ta sẽ thảo luận ở các chương sau. Bạn đã nhìn thấy nó khá là đơn giản, thông tin đầy đủ về router bạn có thể tham khảo tại đây.

Loader

Bây giờ tiếp theo là tập tin loader.php tập tin này có nhiệm vụ nạp các controller, model cũng như các thư mục khác. Phalcon cung cấp cho ta rất nhiều lựa chọn. Mặc định Phalcon Tool Development tạo tập tin loader.php nạp các thư mục bằng phương thức Registering Directories có nội dung như sau:

<?php

    $loader = new \Phalcon\Loader();

    /**
    * We're a registering a set of directories taken from the configuration file
    */
    $loader->registerDirs(
        array(
        $config->application->controllersDir,
        $config->application->modelsDir
        )
    )->register();

các tham số $config->application->controllersDir có được từ tập tin cấu hình config.php. Ví dụ ta muốn gọi class Users.php trong Models tại controller SessionController.php ta chỉ đơn giản làm như sau:

<?php

    class SessionController extends \Phalcon\Mvc\Controller{
        public function loginAction()
        {
            //echo "<h3>Login Form </h3>";
            $user = Users::findFirst();
            print $user->email;
        }
    }

Sau khi chạy xong ta có kết quả như sau pdt@gmal.com

Nhưng tôi khuyên bạn nên nạp các tập tin bằng phương thức Registering Namespaces nó được khuyên dùng về tối ưu hóa tốc độ cũng như việc nhìn thấy tải tập tin rõ ràng hơn. Lúc đó ta viết lại tập tin routes.php ở trên kia lại như sau:


    <?php
    $loader = new \Phalcon\Loader();

    /**
    * We're a registering a set of directories taken from the configuration file
    */
    $loader->registerNamespaces(array(
        'PhalconBook\Models' => $config->application->modelsDir,
        'PhalconBook\Controllers' => $config->application->controllersDir,

    ))->register();

Ngoài hai phương thức trên Phalcon còn cung cấp cho ta các tùy chọn khác nữa. Thông tin đầy đủ về autoloading bạn có thể tham khảo tại đây.

Nguồn tham khảo Phalcon PHP

Tài liệu Phalcon PHP trên trang chủ là quá đủ cho các bạn nếu muốn tìm hiểu Phalcon, nhưng đôi khi việc có thể các nguồn tài nguyên khác cũng rất tốt, vì vậy tôi chỉ muốn chia sẽ các bạn một trang http://phalcontip.com, trên đây có những trick và tip rất hay, kế đến là cheat-sheet Phalcon PHP các bạn có thẻ tham khảo nhanh tại đây http://phalcon.io/cheat-sheet/, và bạn muốn chat dev với tác giả tạo ra Phalcon cũng như cộng đồng Phalcon PHP thì có thể join tại đây.

Trên đây chỉ là những trải nghiệm của tôi về Phalcon PHP, nếu bạn có những trải nghiệm thú vị về Phalcon PHP, bạn có thể để bình luận dưói đây !!!