Hướng dẫn php shm

PHP Preload - what the hell, man? 🤔🤔

Share from Chung Nguyễn Blog

PHP Lifecycle - PHP opcode

Trước khi nói về PHP Preload cho Chung được phép nói một chút về quá trình mà một file PHP khởi chạy. Khi chúng ta chạy một đoạn code PHP, có rất nhiều thứ xảy ra sâu bên dưới mà ta không nhìn thấy. Một cách khái quát, bộ thông dịch PHP trải qua 4 giai đoạn khi nó thực thi 1 đoạn code [Xem thêm về 4 giai đoạn này tại đây:

  • Lexing
  • Parsing
  • Biên dịch [compilation]
  • Thông dịch [intepretation]

Nhìn vào tấm hình trình bạn sẽ thấy khi một file PHP được gọi để thực thi nó sẽ trải qua 4 bước đầu tiên đến cuối cùng trả về kết quả cho người dùng. Quá trình này là cần thiết cho việc thực thi lệnh lần đầu, nhưng thực sự không cần thiết cho những lần gọi sau đó, vì quá trình vẫn thực hiện đầy đủ 4 bước trong khi chỉ cần bước thứ 4 [chạy opcode] là đủ, dù file PHP không hề có sự thay đổi. Điều này chính là nguyên nhân chính dẫn tới sự trì trệ chậm chạp của PHP!!!

Đọc đến đây, người bình thường cũng sẽ thốt lên: "đậu xanh rau má sao có cách nào bỏ 3 bước đầu tiên đi cho đỡ khổ, mà còn nhanh hơn không 😡😡❓❗❗"

----- ĐÚNG ----

Chính từ đó mới nảy sinh một thứ gọi là OPCODE CACHE. Opcode cache chính là quá trình cache lại 3 bước đầu tiên, từ đây khi PHP được gọi nó sẽ kiểm tra xem file php đã được cache opcode hay chưa, nếu có rồi nó sẽ chạy luôn opcode mà không cần phải trả qua 3 bước lãng phí kia.

Câu chuyện đi đến đây coi như kết thúc rồi nha. Bạn nào còn lăn tăn opcode là gì thì nó viết tắt của từ operation code, nó gần tương đương với file .java sau khi biên dịch là .class và .dll trong .NET

Đến thời điểm này, opcode cache đã trải qua mấy đời từ APC ⇒ Turck MMCache ⇒ Zend OpCache mang lại cho PHP một tốc độ tương đối tốt và dành được sự trân trọng đến bây giờ.

PHP Preload là gì? Tìm hiểu về PHP Preload

Như đã trình bày ở trên, với bộ nhớ cache opcode, các tệp được biên dịch một lần [trong request đầu tiên], và sau đó được lưu trữ trong bộ nhớ dùng chung. Tất cả các yêu cầu HTTP sau đó sẽ được sử dụng trong bộ nhớ chia sẻ.

Trong khi lưu trữ các tập tin trong một bộ nhớ cache opcode loại bỏ đã loại bỏ được thời gian tiêu tốn cho biên dịch - NHƯNG vẫn còn thời gian tiêu tốn liên quan đến việc lấy một tập tin từ bộ nhớ cache 😴. Chúng tôi [PHP] vẫn phải kiểm tra xem tập tin nguồn đã được sửa đổi chưa, sao chép một số phần nhất định của class và function từ bộ nhớ đệm chia sẻ sang bộ nhớ process, ... Đáng chú ý, vì mỗi tệp PHP được biên dịch và lưu trữ hoàn toàn độc lập với bất kỳ tệp nào khác, chúng ta có thể không giải quyết được sự phụ thuộc giữa các lớp được lưu trữ trong các tệp khác nhau khi chúng tôi lưu trữ các tệp trong bộ nhớ cache opcode và phải liên kết lại các phụ thuộc lớp vào thời gian chạy trên mỗi yêu cầu [request].

Đề xuất lần này [Preload] được lấy cảm hứng từ công nghệ "Chia sẻ dữ liệu lớp [Class Data Sharing]" được thiết kế cho Java HotSpot VM. Nó nhằm mục đích cung cấp cho người dùng khả năng trao đổi linh hoạt mà mô hình PHP thông thường cung cấp để tăng hiệu suất.

Khi khởi động máy chủ - trước khi bất kỳ mã ứng dụng nào được chạy - chúng tôi có thể tải một tập hợp các tệp PHP nhất định vào bộ nhớ - và làm cho nội dung của chúng "có sẵn vĩnh viễn" cho tất cả các yêu cầu tiếp theo sẽ được máy chủ đó phục vụ.

Tất cả các hàm và lớp được xác định trong các tệp này sẽ sẵn sàng được lấy ra, giống hệt như các thực thể nội bộ [ internal entities] ví dụ như: strlen[] hoặc Exception. Bằng cách này, chúng tôi có thể  PRELOAD - tải trước toàn bộ hoặc một phần frameworks và thậm chí toàn bộ thư viện lớp ứng dụng [application class library].

Nó cũng sẽ cho phép giới thiệu các hàm "tích hợp sẵn" sẽ được viết bằng PHP [tương tự như HHVM sytemlib]. Tính trao đổi linh hoạt sẽ bao gồm việc không thể cập nhật các tệp này khi máy chủ đã được khởi động [việc cập nhật các tệp này trên hệ thống tệp sẽ không làm bất kỳ điều gì; Khởi động lại máy chủ sẽ được yêu cầu áp dụng các thay đổi]; Ngoài ra, cách tiếp cận này sẽ không tương thích với các máy chủ lưu trữ nhiều ứng dụng hoặc nhiều phiên bản ứng dụng - vì sẽ có các lớp nhất định có cùng tên - nếu các lớp đó được tải trước từ mã của một ứng dụng, các ứng dụng sau đó sẽ có khả năng xung đột.

** Chung nghĩ tương lai sẽ có cách giải quyết đừng quá hoang mang - vì server của mình cũng đang đặt nhiều application trên này [website] **

PHP Preload hoạt động như thế nào

Ô kê, tính năng preload này sẽ được điều khiển bởi một directive có tên là opcache.preload ở trong file php.ini.

Ví dụ dưới đây sẽ giới thiệu một helper function và sử dụng nó để preload toàn bộ Zend framework.

    

Chủ Đề