It's me ;-)

Vì sao các PHP framework làm cho ứng dụng của bạn nặng nề hơn?

Lang thang được bài viết khá hay của bác Huy 🙂

Nếu bạn đã từng làm việc với các PHP framework như symfony, Cake, Zend … có thể bạn đã nhận ra những vấn đề này. Tôi xin nêu ra đây cả cách giải quyết của mình.

Việc sử dụng các pattern như Active Record, Data Mapping để làm Model trong các framework là một ác mộng.

Thật vậy, không những làm bạn khó khăn hơn trong việc xoay sở với SQL, nó còn khiến quá trình truy xuất dữ liệu trở nên nặng nề hơn. Các pattern này quy mỗi record trong database thành một object. Việc làm này là cực kỳ không cần thiết. Không phải lúc nào bạn cũng select chúng ra sau đó lại update trở lại database. Những logic nhằm bảo đảm mối quan hệ giữa các object cũng ngốn kha khá tài nguyên. Hơn nữa, các câu SQL được tự động sinh ra sẽ không đạt được mức độ tối ưu như mong muốn. Tối ưu SQL là một công việc quan trọng nhưng các ORM lại cố ngăn bạn khỏi công việc đó.

Giải pháp của tôi

Sử dụng DAO pattern để thay cho Active Record. Hoặc tốt hơn nữa là sử dụng các tính năng được hỗ trợ sẵn trong hệ quản trị cơ sở dữ liệu mà lâu nay lập trình viên PHP/(nhất là MySQL) thường quên đi mất như View, Trigger, Stored Procedured…  Bạn không nên lo ngại việc các lập trình viên của mình phải viết SQL. Suy cho cùng họ là lập trình viên, công việc của họ là viết code.

Lạm dụng sự tự động hoá.

Các framework thường tự động hoá một số giai đoạn trong workflow để trở nên thân thiện hơn đối với developer. Nếu bạn đã dùng qua CakePHP, bạn sẽ hiểu. Cake cho phép bạn khai báo các model và component bạn cần trong controller và tự động load toàn bộ chúng trong quá trình start-up. Điều này làm cho ứng dụng phải mất rất lâu để start-up. Hơn nữa, với cách phân chia ứng dung thành controller/action, bạn gặp phải một vấn đề là không phải lúc nào bạn cũng cần những model/component giống nhau ở tất cả các action trong cùng một controller. Với cách làm của CakePHP, bạn phải load những thứ mình không cần một cách bất đắc dĩ.

Giải pháp của tôi

Dẹp sự tự động hoá sang một bên đi! Hiện đại là hại điện. Tôi nhắc lại một lần nữa, bạn tuyển những lập trình viên và trả lương cho họ để họ viết code. Đừng ngại khi bắt họ làm chuyện đó.

Chính mô hình MVC làm tăng thêm các giai đoạn trong workflow của bạn

Ok, MVC là một mô hình tốt, chẳng ai phủ nhận cả. Nhưng việc phân chia rạch ròi giữa business logic (M) và presentation logic (V) cũng làm cho mọi thứ trở nên rắc rối hơn. Một ví dụ: trong mô hình MVC mà bạn gặp ở các framework mà tôi kể ở trên, Model thường xử lý dữ liệu xong rồi truyền cho View. Giả sử ở đây bạn có một list các bài hát cần in ra. Cách thông thường nhất và gần như duy nhất mà ta thường làm là Model nhận việc select từ database, duyệt qua tập kết quả lần để để tổng hợp nó thành một danh sách (ở PHP thì rất có thể là mảng) rồi sau đó mới truyền cho View. View lại phải duyệt qua mảng đó thêm một lần nữa để in ra.

Giải pháp của tôi

Tôi không có cách giải quyết nào và chấp nhận vấn đề này ở hiện tại. Thật ra nó cũng không ảnh hưởng quá nhiều đến performance, bù lại ta có được sự tách biệt rạch ròi về kiến trúc.

OOP

Lập trình OOP luôn luôn ngốn nhiều tài nguyên hơn so với function-based. Thêm vào đó, với đặc điểm của PHP, việc viết mỗi lớp thành một file riêng sẽ làm phân mảnh code và buộc PHP engine phải làm việc nặng nề hơn (nhất là đối với các framework như Zend).

Giải pháp của tôi

Sử dụng các opcode caching egine như APC, XCache.

Nguồn: byhuy.com

15 thoughts on “Vì sao các PHP framework làm cho ứng dụng của bạn nặng nề hơn?

  1. Tập tành với các framework PHP, CakePHP là chủ yếu. Nhưng với người có trình độ PHP không cao như thế thì CakePHP tạm ổn, vả lại nó là cần câu cơm của tớ hiện giờ. 😛

  2. Đính chính lại là người ko có trình độ PHP cao như tớ, không khéo hiểu lầm thì chết 😀

    Rapyd nghe có vẻ mới, tớ sẽ thử xem thế nào , thanks Khánh 😉

  3. Trình độ PHP con non kém nên cứ đi theo cái truyền thống là finction base
    Code dễ kiểm soát, dễ đọc và đặc biệt là dễ học 😀

  4. Thằng giỏi là thằng biết khi nào thì nên dùng function base, khi nào thì OOP. Không phải cứ new 1 cái class xong gọi các method của nó là giỏi đâu. Mang tiếng xài OOP mà ko biết các design pattern là gì thì thà dùng funciton base còn hơn 😉

  5. Mình ko biết mấy cái framework đó là gì, ai dạy sao mình làm thế, ai kêu sao code vậy là chắc!

  6. thằng viết bài ở trên sao ko tự viết site riêng đi mà phải xài wp, xạo lol quen =))

    1. Trẻ trâu ngựa non háu đá :)) Thằng viết bài ở trên là thằng nào? Bài này ghi source là của byhuy.com nhé. Còn thằng đăng bài này là TÔI & TÔI thích dùng WP vì đơn giản là nó phù hợp với tôi. Còn bảo tại sao tôi ko tự code ư? Tôi ko thích, tôi ko có thời gian, thế thôi :)) Còn bạn nghĩ tôi ko đủ sức 1 blogging system thì mời bạn xem lại profile của tôi nhé, dù sao thì tôi cũng có gần 10 năm kinh nghiệm làm PHP developer rồi đó 😉

  7. Bạn Đỗ Nam Khánh ơi ! Mình cũng đang học thiết kế web bằng ngôn ngữ PHP, bạn có thể cho mình phương pháp học thế nào, hiện tại mình học sang cakephp , đọc xong thì đang mất phương hướng =.=!.

  8. Anh Khánh hiểu rộng quá. em thấy anh có vài bài viết về AngularJS hay ạ, anh viết thêm về nó đi. thực sự em chả biết gì về php nhưng mảy may thế nào thấy angular hay quá nên cứ lọ mọ với nó. Liệu nodejs + angular có làm nên cơm gạo gì không nữa.

    1. Anh cũng muốn viết nhiều bài về kinh nghiệm xương máu khi triển khai dự án bằng AngularJS nhưng mà bận quá cũng chưa viết được em ạ 😀

Leave a Reply to neverwinter Cancel reply

Your email address will not be published. Required fields are marked *