Hiểu về PHP Generators

Chắc hẳn bạn đã biết ngoài việc chạy đúng ra thì tốc độ là yếu tố sống còn tạo nên sự khác biệt của một trang web. Ứng dụng của bạn chạy càng nhanh thì trải nghiệm người dùng càng tốt. Chính vì thế, ở vị trí của một developer, chúng ta luôn luôn mong muốn tìm mọi cách để cải thiện hiệu năng của sản phẩm mà chúng ta làm ra. Và Generators sẽ tạo ra sự khác biệt rất lớn về tốc độ và quản lý bộ nhớ.

PHP Generators là gì?

Được thêm vào PHP trong phiên bản 5.5, generators cung cấp một cách đơn giản để lặp qua dữ liệu mà không cần phải xây dựng một mảng trong bộ nhớ.

Trước tiên hãy nhanh chóng tạo ra một file generator.php

Khi chúng ta chạy đoạn code trên, chúng ta sẽ thấy như sau:

Đoạn code này khá dễ hiểu, đến đây thì nó vẫn chạy bình thường và không có vấn đề gì xảy ra. Nhưng nếu chúng ta sửa lại đoạn code trên một chút:

Chắc bạn cũng đã biết là PHP_INIT_MAX là số lớn nhất mà PHP có thể tạo ra. Sau khi thực hiện đoạn code này, bạn sẽ nhận thấy sự khác biệt.

Thông báo này chỉ ra rằng PHP server của chúng ta đang bị tràn bộ nhớ. Có thể bạn sẽ nghĩ ngay đến việc mở file php.ini ra và tăng memory_limit lên, nhưng cách giải quyết này có thực sự hiệu quả. Liệu chúng ra có muốn tạo ra một đoạn code mà nó ngốn hết cả bộ nhớ của máy chủ không? Câu trả lời chắc chắn sẽ là không và không. Điều này không hiệu quả và chúng ta cũng không bao giờ muốn một đoạn code mà có thể ngốn hết cả tài nguyên của máy chủ.

Sử dụng Generators

Vẫn là đoạn code ở trên vẫn là PHP_INIT_MAX, nhưng ở lần này chúng ta sử dụng generators function.

Nhìn vào function getRange(), chúng ta sẽ thấy rằng thay vì sử dụng return thì chúng ta sử dụng yield. yield tương tự như return vì nó cũng trả về một giá trị từ một hàm. Tuy nhiên yield trả về giá trị khi giá trị đó cần sử dụng đến mà không lưu trữ tất cả các giá trị trong bộ nhớ. Sau khi viết lại hàm trên chúng ta có thể chạy lại trình duyệt và xem kết quả.

Đã không còn lỗi tràn bộ nhớ, trong một thời gian cho phép trình duyệt đã hiển thị được kết quả như chúng ta mong muốn. Có thể thấy được bản thân PHP Generators đóng vai trò quan trọng trong việc tiết kiệm không gian bộ nhớ. Trông khá đơn giản nhưng hiệu quả là rất lớn.

Note: Một lưu ý nhỏ rằng chúng ta chỉ có thể sử dụng generators trong một hàm.

Tại sao nên sử dụng Generators?

Trong rất nhiều trường hợp chúng ta muốn xử lý một tập dữ liệu rất lớn (ví dụ như dữ liệu từ các file log hệ thống) hoặc muốn tính toán xử lý trên một mảng với vô cùng lớn các phần tử. Rõ ràng chúng ta không hề muốn việc xử lý trên các tập dữ liệu đó chiếm dụng một lượng lớn thậm chí là tất cả bộ nhớ của chúng ta và việc nên làm là tìm cách tiết kiệm bộ nhớ càng nhiều càng tốt. Thay vì phải lưu trữ cả một tập dữ liệu lớn như vậy, chúng ta có thể sử dụng các generators để lấy ra các dữ liệu nào cần thiết.

Returning Keys

Trong một số trường hợp, dữ liệu của chúng ta cần biểu diễn dưới dạng key-value. Khi sử dụng Generators, chúng ta có thể làm việc đó như sau:

Sau đó chúng ta có thể sử dụng cặp giá trị key => value như sau:

Truyền tham số vào trong Generators.

Giả sử như chúng ta muốn thêm một vài tham số để quy định cách hoạt động của Generators ví dụ như thêm điều kiện dừng cho Generators chẳng hạn. Chúng ta thực hiện nó như sau:

Để truyền giá trị này, chúng ta có thể làm như sau:

Note: Chúng ta có thể sử dụng từ khóa return để kết thúc mọi xử lý trong Generators

Kết luận

Generators cung cấp một giải pháp mạnh mẽ cho việc tiết kiệm hiệu năng của server, từ đó khiến cho việc xử lý của server trở nên nhẹ nhàng hơn đồng nghĩa với việc chúng ta không nhất thiết phải có phần cứng tốt mới có thể tăng tốc độ của trang web. Tuy nhiên không nên quá lạm dụng nó vì rất có thể nó sẽ gây ra các vấn đề nghiêm trọng hơn cho hệ thống của bạn nếu sử dụng sai. Hy vọng các bạn có thể áp dụng Generators vào trong các dự án của mình một cách tốt nhất để có thể phát huy được sức mạnh của Generators.