Hướng dẫn dùng getstreams trong PHP
Streams là các tài nguyên được cung cấp bởi PHP mà chúng ta ít để ý đến. Streams có thể được dùng như là công cụ rất mạnh mẽ và bằng cách khai thác sức mạnh của Streams, chúng ta có thể đưa ứng dụng của mình lên một level cao hơn. PHP Streams được định nghĩa như sau (theo PHP Manual)
Mỗi stream sẽ có một Stream cơ bảnMột stream được tham chiếu dưới dạng Wrapper mặc định sẽ là Như mình đã nói bên trên, PHP cung cấp một số wrappers dựng sẵn, giao thức vào filters. Để tìm hiểu cụ thể hơn các wrappers có sẵn với môi trường của bạn, chúng ta có thể dùng các hàm sau:
stream_get_wrappers(); stream_get_filters() Trên đây là cách transports, wrappers và filters trên môi trường máy của mình, ngoài ra thì nếu cần thiết chúng ta cũng có thể viết thêm stream cho Amazon S3, MS Excel, Google Storage, Dropbox hoặc thậm chí là cả Twitter. php:// WrapperBản thân PHP cũng tự có cho riêng mình một wrapper để có thể access vào I/O streams. Một số wrapper cơ bản như: php://stdin, php://stdout, and php://stderr được map đến với các tài nguyên I/O mặc định. PHP cũng có thêm php://input là một read-only stream có thể truy cập trực tiếp đến dữ liệu raw của POST request. Điều này khá là thuận tiện khi chúng ta đang làm việc với các remote service mà payload data được đặt tại body của một POST request. Cùng thử làm một kiểm tra nhỏ sử dụng curl nhé
Kết quả của đoạn code
Để ý rằng
chúng ta không thể lấy được gói dữ liệu đầu tiên từ $_POST nhưng nếu thay vào đó chúng ta dùng PHP 5 .1 giới thiệu thêm các wrapper: php://memory và php://temp được sử dụng để đọc và ghi các dữ liệu tạm thời. Bản thân tên của các wrapper này cũng cho thấy rằng dữ liệu được lưu trữ tương ứng ở memory hoặc ở trong một bộ file tạm được quản lý bởi system. Ngoài ra còn có thêm php://filter, một meta-wrapper được thiết kế để có thể áp dụng
các filters trong việc mở một stream với các hàm như là
Trong ví dụ đầu tiên chúng ta đã dùng thêm một filter để encode dữ liệu ghi vào ổ đĩa. Ở ví dụ tiếp theo chúng ta có các filters được áp dụng cho việc đọc nội dung của một remote url. Hiệu quả của filter có thể từ rất đơn giản đến trở nên vô cùng mạnh mẽ. Stream ContextsMột Context là một stream đặc biệt với một bộ parameters hoặc options mà có thể sử dụng để ay thay đổi, tối ưu hành vi của một wrapper. Một use case phổ biên của context đó là dùng để thay đổi HTTP wrapper. Điều này giúp chúng ta tránh khỏi sử dụng cURL cho các tác vụ network đơn giản
Đầu tiên chúng ta sẽ định nghĩa mảng options của mình với định dạng $array['wrapper']['option_name']. (mỗi một wrapper sẽ cho một tập hợp các option khác nhau). Sau đó chúng ta có thể gọi Trong ví dụ này, content được trả về thông qua body của request, do đó remote script sử dụng php://input có thể đọc nó, chúng ta có thể access vào headers sử dụng hàm apache_request_headers() và thêm:
Khi đó chúng ta đã thay đổi context mặc định. Trong trường hợp bạn muốn modify context nhưng không làm ảnh hưởng đến context mặc định thì bạn có thể tạo ra một context mới dựa trên context mặc định mà sử dụng chúng song song với nhau.
Kết luậnQua những mô tả bên trên, có thể bạn đã thấy sức mạnh của PHP Stream, vậy nếu bạn muốn tìm hiểu thêm hoặc muốn khai thác sức mạnh của Stream trong ứng dụng của mình thì đừng ngại bắt tay vào làm thử. Như bạn có thể thấy, các Streams share nhau một phần hoặc tất các các hàm liên quan đến filesystem, vậy nên cách tốt nhất là hãy tìm hiểu thật kỹ về filesystem và cố gắng thử implement một custom wrapper để làm việc với filesystem nhé. Tham khảo: http://php.net/manual/en/features.commandline.io-streams.php https://www.sitepoint.com/ understanding-streams-in-php/ http://php.net/manual/en/book.stream.php http://php.net/manual/en/wrappers.php.php http://php.net/manual/en/function.stream-context-create.php |