Hướng dẫn dùng php-download.com alternative 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]

Streams were introduced with PHP 4.3.0 as a way of generalizing file, network, data compression, and other operations which share a common set of functions and uses. In its simplest definition, a stream is a resource object which exhibits streamable behavior. That is, it can be read from or written to in a linear fashion, and may be able to fseek[] to an arbitrary locations within the stream.

Streams được giới thiệu lần đầu ở phiên bản PHP 4.3.0 như một cách để khái quát hóa cho File , Network, Data compression và các tiến trình khác trong đó dùng chung một tập hợp các functins hoặc có chung cách sử dụng. Một cách định nghĩa đơn giản hơn, Stream là một nguồn tài nguyên đổi tượng đại diện cho cách hành vi có thể stream được. Theo đó Stream có thể được đọc, ghi vào theo một phong cách "tuyến tính" và có thể được fseek[] đến một vị trí bất kỳ trong luồng.

Mỗi stream sẽ có một implementation wrapper trong đó tồn tại một số code bổ sung cần thiết để xử lý các giao thức đặc biệt hoặc thực hiện việc encode. PHP cung cấp một số wrapper dựng sẵn và chúng ta có thể dễ dang tạo và đăng ký những wrapper tùy biến cho riêng mình. Ngoài ra chúng ta cũng có thể sửa đổi hoặc cải tiến "hành vi" của các wrappers sử dụng contexts và filters

Stream cơ bản

Một stream được tham chiếu dưới dạng ://. Trong đólà tên của wrapper và` sẽ phụ thuộc vào cú pháp của wrapper.

Wrapper mặc định sẽ là file://, điều naỳ có nghĩa là mỗi khi chúng ta access đến filesystem, chúng ta đều phải dùng qua stream. Ví dụ với việc đọc file, ta có thể viết bằng hai cách là readfile['/path/to/somefile.txt'] hoặc readfile['file:///path/to/somefile.txt'], sẽ cho ra cùng một kết quả. Một ví dụ khác, nếu chúng ta có một đoạn code là readfile['//google.com/'] thì khi đó chúng ta đang yêu cầu PHP sử dụng HTTP Stream wrapper thay vì File Stream wrapper.

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_transports[];

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:// Wrapper

Bả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é

curl -d "Hello" -d "a=b&c=d" //localhost/dev/streams/php_input.php

Kết quả của đoạn code printr[$POST] trả về sẽ là

Array [ [a] => b [c] => d ]

Để ý 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 eadfile['php://input'] thì lại có thể đưa ra kết quả đầy đủ: Hello&a=b&c=d

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à readfile[] hoặc file_get_contents[] hoặc stream_get_contents[].

Chủ Đề