PHP 8 – Tính năng, cải tiến và trình biên dịch JIT

PHP 8 đã chính thức được phát hành ở chế độ Khả dụng chung vào ngày 26 tháng 11 năm 2020!

PHP 8 - Tính năng, cải tiến và trình biên dịch JIT

Cập nhật cách đây 3 năm

Bản cập nhật lớn mới này mang lại nhiều tối ưu hóa và các tính năng mạnh mẽ cho ngôn ngữ. Chúng tôi rất vui được hướng dẫn bạn những thay đổi thú vị nhất sẽ cho phép chúng tôi viết mã tốt hơn và xây dựng các ứng dụng mạnh mẽ hơn.

Phụ lục thông báo PHP 8.0

PHP 8 – Tính năng, cải tiến và trình biên dịch JIT

PHP JIT (Trình biên dịch Just in Time)

Tính năng được hoan nghênh nhất đến với PHP 8 là trình biên dịch Just-in-time (JIT) . Vậy JIT là gì?

RFC mô tả JIT như sau:

“PHP JIT được thực hiện như một phần gần như độc lập của OPcache. Nó có thể được bật / tắt vào lúc biên dịch PHP và lúc chạy. Khi được bật, mã gốc của các tệp PHP được lưu trữ trong một vùng bổ sung của bộ nhớ dùng chung OPcache và op_array → opcodes []. Handler (các) trình xử lý giữ con trỏ đến các điểm nhập của mã JIT-ed. ”

RFC

Vì vậy, làm thế nào chúng ta đến được JIT, và sự khác biệt giữa JIT và OPcache là gì?

Để hiểu rõ hơn JIT là gì đối với PHP, chúng ta hãy xem nhanh cách PHP thực thi mã nguồn đến kết quả cuối cùng.

Việc thực thi PHP là một quá trình gồm 4 giai đoạn:

  • Biên dịch : Trình thông dịch duyệt qua cây và dịch các nút AST thành các mã quang Zend cấp thấp, là các mã nhận dạng số xác định loại lệnh được thực hiện bởi Zend VM .
  • Thông dịch : Các mã opcodes được thông dịch và chạy trên Zend VM.

Hình ảnh sau đây cho thấy một mô tả trực quan của quá trình thực thi PHP cơ bản.

Quy trình thực thi PHP cơ bản

Vậy OPcache làm cho PHP nhanh hơn như thế nào? Và những gì thay đổi trong quá trình thực thi với JIT?

1. Phần mở rộng OPcache

PHP là một ngôn ngữ thông dịch. Điều này có nghĩa là, khi một tập lệnh PHP chạy, trình thông dịch sẽ phân tích cú pháp, biên dịch và thực thi mã lặp đi lặp lại trên mỗi yêu cầu. Điều này có thể dẫn đến lãng phí tài nguyên CPU và thời gian bổ sung.

Đây là nơi mà tiện ích mở rộng OPcache phát huy tác dụng:

“OPcache cải thiện hiệu suất PHP bằng cách lưu trữ mã bytecode tập lệnh được biên dịch trước trong bộ nhớ dùng chung, do đó loại bỏ nhu cầu PHP tải và phân tích cú pháp các tập lệnh theo từng yêu cầu.”

PHP

Với OPcache được kích hoạt, trình thông dịch PHP chỉ trải qua quá trình 4 giai đoạn được đề cập ở trên khi tập lệnh chạy lần đầu tiên. Vì các mã byte PHP được lưu trữ trong bộ nhớ dùng chung, chúng ngay lập tức có sẵn dưới dạng biểu diễn trung gian cấp thấp và có thể được thực thi trên Zend VM ngay lập tức.

Quá trình thực thi PHP với OPcache được kích hoạt

Kể từ PHP 5.5, phần mở rộng Zend OPcache có sẵn theo mặc định và bạn có thể kiểm tra xem mình đã định cấu hình chính xác nó chưa bằng cách chỉ cần gọiphpinfo() từ một tập lệnh trên máy chủ của bạn hoặc kiểm tra tệp php.ini của bạn (xem cài đặt cấu hình OPcache ).

2. Tải trước

OPcache gần đây đã được cải thiện với việc thực hiện tải trước , một tính năng OPcache mới được thêm vào với PHP 7.4 . Tải trước cung cấp một cách để lưu trữ một bộ tập lệnh được chỉ định vào bộ nhớ OPcache “ trước khi chạy bất kỳ mã ứng dụng nào. ”Tuy nhiên, nó không mang lại cải thiện hiệu suất rõ ràng cho các ứng dụng dựa trên web điển hình.

Với JIT, PHP tiến thêm một bước.

3. JIT – Trình biên dịch đúng lúc

Ngay cả khi các mã quang là biểu diễn trung gian cấp thấp, chúng vẫn phải được biên dịch thành mã máy. JIT “không giới thiệu bất kỳ biểu mẫu IR (Biểu diễn trung gian) bổ sung nào,” nhưng sử dụng DynASM (Trình lắp ráp động cho các công cụ tạo mã) để tạo mã gốc trực tiếp từ mã byte PHP.

Tóm lại, JIT dịch các phần nóng của mã trung gian thành mã máy . Bỏ qua quá trình biên dịch, nó có thể mang lại những cải tiến đáng kể về hiệu suất và việc sử dụng bộ nhớ.

Zeev Surasky, đồng tác giả của đề xuất PHP JIT, cho thấy các phép tính sẽ nhanh hơn bao nhiêu với JIT:

Nhưng, liệu JIT có cải thiện hiệu quả hoạt động của WordPress không?

JIT cho Ứng dụng web trực tiếp

Theo JIT RFC, việc triển khai trình biên dịch đúng lúc sẽ cải thiện hiệu suất PHP. Nhưng liệu chúng ta có thực sự trải nghiệm những cải tiến như vậy trong các ứng dụng đời thực như WordPress không?

Các thử nghiệm ban đầu cho thấy JIT sẽ làm cho khối lượng công việc sử dụng nhiều CPU chạy nhanh hơn đáng kể. Tuy nhiên, RFC cảnh báo :

“… Giống như những nỗ lực trước đây – nó dường như không cải thiện đáng kể các ứng dụng trong cuộc sống thực như WordPress (với opcache.jit = 1235 326 req / giây so với 315 req / giây).

Nó được lên kế hoạch để cung cấp thêm nỗ lực, cải thiện JIT cho các ứng dụng trong đời thực, sử dụng tối ưu hóa hồ sơ và suy đoán. “

RFC

Với việc kích hoạt JIT, mã sẽ không được chạy bởi Zend VM mà bởi chính CPU, điều này sẽ cải thiện tốc độ tính toán. Các ứng dụng web như WordPress cũng dựa vào các yếu tố khác như TTFB , tối ưu hóa cơ sở dữ liệu , yêu cầu HTTP , v.v.

Đóng góp tương đối của JIT vào hiệu suất PHP 8 (Nguồn ảnh: 
Phụ lục thông báo PHP 8.0 )

Vì vậy, chúng ta không nên mong đợi một sự gia tăng đáng kể về tốc độ thực thi PHP khi nói đến WordPress và các ứng dụng tương tự. Tuy nhiên, JIT có thể mang lại một số lợi ích cho các nhà phát triển .

Theo Nikita Popov :

“Các lợi ích của trình biên dịch JIT là đại khái (và như đã được nêu trong RFC):

  • Hiệu suất tốt hơn đáng kể cho mã số.
  • Hiệu suất tốt hơn một chút cho mã ứng dụng web PHP “điển hình”.
  • Tiềm năng chuyển nhiều mã hơn từ C sang PHP, bởi vì PHP bây giờ sẽ đủ nhanh. ”

Vì vậy, mặc dù JIT sẽ khó mang lại những cải tiến lớn cho hiệu suất của WordPress, nhưng nó sẽ nâng cấp PHP lên cấp độ tiếp theo, biến nó thành một ngôn ngữ mà nhiều hàm hiện có thể được viết trực tiếp.

Nhược điểm sẽ là độ phức tạp lớn hơn có thể làm tăng chi phí bảo trì , ổn định và gỡ lỗi . Theo Dmitry Stogov:

“JIT cực kỳ đơn giản, nhưng dù sao thì nó cũng làm tăng mức độ phức tạp của toàn bộ PHP, rủi ro về các loại lỗi mới và chi phí phát triển và bảo trì.”

Đề xuất đưa JIT vào PHP 8 đã được thông qua với 50 đến 2 phiếu bầu.


Cải tiến PHP 8 và các tính năng mới

Ngoài JIT, chúng ta có thể mong đợi nhiều tính năng và cải tiến với PHP 8. Danh sách sau là lựa chọn cẩn thận của chúng tôi về các bổ sung và thay đổi sắp tới sẽ làm cho PHP đáng tin cậy và hiệu quả hơn.

  1. Constructor Property Promotion
  2. Validation for Abstract Trait Methods
  3. Incompatible Method Signatures
  4. Arrays Starting With a Negative Index
  5. Union Types 2.0
  6. Consistent Type Errors for Internal Functions
  7. throw Expression
  8. Weak Maps
  9. Trailing Comma in Parameter List
  10. Allow ::class syntax on objects
  11. Attributes v2
  12. Named Arguments
  13. Nullsafe Operator
  14. Saner String to Number Comparisons
  15. Saner Numeric Strings
  16. Match Expression v2
  17. Stricter Type Checks for Arithmetic/Bitwise Operators
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.