Meta Data trong Phalcon PHP

by Thien

on Aug 27/16 at 03:50

Hôm nay tôi sẽ giới thiệu các bạn tính năng Meta-Data model trong Phalcon PHP, như bạn biết khi dùng ORM để truy vấn cơ sở dử liệu chẳn hạn như khi truy vấn table là sites thì đầu tiên nó sẽ coi INFORMATION_SCHEMA sau đó là DESCRIBE cuối cùng thì sẽ thực thi câu sql

Để hình dung rỗ hơn tôi sẽ cho bạn một ví dụ cu thể sau, xet một model Sites có dạng thế này

class Sites extends ModelBase
{

    const BILLING_1 = 1;
    const BILLING_0 = 0;

    /**
     *
     * @var integer
     */
    protected $id;

    /**
     *
     * @var integer
     */
    protected $billing;

    /**
     *
     * @var string
     */
    protected $name;

    [...]
  }

Giả sử bạn muốn lấy thông tin của đối tượng có id = 1 bạn gọi như sau:


$obj = Sites::findFirstById(1);

Khi đó trong log của sql của bạn sẽ có dạng như thế này

[Sat, 27 Aug 16 03:31:09 +0000][INFO] SELECT IF(COUNT(*) > 0, 1, 0) FROM `INFORMATION_SCHEMA`.`TABLES` WHERE `TABLE_NAME` = 'sites' AND `TABLE_SCHEMA` = DATABASE()
[Sat, 27 Aug 16 03:31:09 +0000][INFO] DESCRIBE `sites`

[Sat, 27 Aug 16 03:31:09 +0000][INFO] SELECT `sites`.`id`, `sites`.`billing`, `sites`.`name`, `sites`.`entities_id`, `sites`.`short_name`, `sites`.`cost_code`, `sites`.`telephone`, `sites`.`address_1`, `sites`.`address_2`, `sites`.`address_3`, `sites`.`suburb`, `sites`.`town`, `sites`.`province`, `sites`.`postal_code`, `sites`.`countries_id`, `sites`.`timezone`, `sites`.`status`, `sites`.`dispatches_id`, `sites`.`lat`, `sites`.`lng`, `sites`.`created`, `sites`.`modified` FROM `sites` WHERE `sites`.`id` = 1 LIMIT :APL0 [1]

Như bạn thấy mỗi lần gọi sql thì ORM trong Phalcon lại kiểm tra các thuộc tích của table đó trước khi thực hiên câu sql thực sự, do đó nó không tốt tí nào cho tốc độ website các, vì vậy tôi khuyên bạn nên dùng Meta Data trong Phalcon đê làm điều đó

Bạn chỉ cần khai báo nó trong file service của bạn như sau:

//Stores model meta-data in the Redis
$di->set(
    'modelsMetadata',
    function () use ($di) {
        $redis = $di->get('config')->redis;
        $metaData = new MetaDataRedis([
            'host'      => $redis->host,
            'port'      => $redis->port,
            'prefix'    => $redis->prefix,
            'lifetime'  => $redis->lifetime,
            'persistent' => $redis->persistent
        ]);

        return $metaData;
    },
    true
);

Chú ý rằng tôi dùng redis trong trường hợp này, ngoài ra bạn có thể dùng Adapter Memory, Session, Apc ... cho việc đó xem thêm trên https://docs.phalconphp.com/en/latest/reference/models-metadata.html

Sau khi khao báo song bạn chỉ cần chạy lần đầu tiên sau đó nó sẽ không còn kiểm tra các thuộc tính của table đó nữa, kết quả là chỉ có thực thi mỗi câu sql

[Sat, 27 Aug 16 03:31:29 +0000][INFO] SELECT `sites`.`id`, `sites`.`billing`, `sites`.`name`, `sites`.`entities_id`, `sites`.`short_name`, `sites`.`cost_code`, `sites`.`telephone`, `sites`.`address_1`, `sites`.`address_2`, `sites`.`address_3`, `sites`.`suburb`, `sites`.`town`, `sites`.`province`, `sites`.`postal_code`, `sites`.`countries_id`, `sites`.`timezone`, `sites`.`status`, `sites`.`dispatches_id`, `sites`.`lat`, `sites`.`lng`, `sites`.`created`, `sites`.`modified` FROM `sites` WHERE `sites`.`id` = 1 LIMIT :APL0 [1]

Còn đây là kết quả trong redis command line

127.0.0.1:6379> keys *
1) "_PHCR5nines-meta-nines\\models\\sites-sites"
2) "_PHCR5nines-map-nines\\models\\sites"
3) "_PHCM_MM"
127.0.0.1:6379> 

Kết luận

Trên đây chỉ là tips tôi muốn chia sẽ bạn, còn nhiều tính năng hay của nó nữa mà tôi chưa khám phá ra, nếu bạn biết hãy chia sẽ thêm! Như mọi khi hãy chia sẽ bài viết nếu thấy nó hay :)