Như chúng ta biết có nhiều thao tác trong lập trình chứa luồng dữ liệu. Trong luồng này, chúng ta có thể cần đọc và ghi dữ liệu từ đối tượng hoặc vào đối tượng tương ứng. Các luồng tổng quát hóa mạng, nén dữ liệu, tệp và hoạt động. Nghĩa là, các luồng cung cấp một nền tảng tập trung nơi dữ liệu có thể truyền theo phương thức tuyến tính
Trên trang này, bạn sẽ tìm thấy các hàm truyền phát và thông tin hữu ích liên quan đến chúng. Đối với các chức năng truyền phát này, không cần cài đặt vì nó đi kèm với ngôn ngữ lõi PHP
Ví dụ, trong một chuyến đi gần đây nhất của tôi, tôi đã phải đợi vài giờ ở điểm đến chỉ để nhận lại hành lý của mình
Từng phút từng phút bên chiếc băng chuyền rỗng không với hy vọng chiếc vali tiếp theo bị chiếc máy nhổ ra sẽ là của tôi
Điều đó làm tôi nhớ đến một tính năng hoạt động rất tốt trong PHP
Dòng suối
Nếu bạn đã từng làm việc với các tệp và tệp lưu trữ bằng các tập lệnh PHP của mình, bạn đã sử dụng các luồng.
Chúng không phổ biến nhưng không quá phức tạp
Hôm nay bạn ở đây để làm quen với họ.
bộ truyện
Đây là loạt bài thực hành tốt về PHP,
Trong loạt bài này, chúng ta sẽ khám phá những phương pháp hay nhất mà nhà phát triển web phải quan tâm khi tạo hoặc quản lý mã PHP
Nếu bạn bỏ lỡ các tập trước, hãy theo các liên kết bên dưới
Dọn dẹp, xác thực và thoát
Bảo mật và quản lý mật khẩu
Xử lý lỗi và ngoại lệ
Ngày và giờ
Streams
Luồng là gì
Luồng được phát hành lần đầu tiên trong PHP 4. 3
Nhưng, có thể do thị trường ngách của họ, hoặc đơn giản là do thiếu nội dung trực tuyến, họ hiếm khi được biết đến
Trong PHP 7, hướng dẫn nghiên cứu chứng chỉ Zend Andrew Beak mô tả chúng như một “băng chuyền vận chuyển mọi thứ đến với bạn từng thứ một”
Tin vui là khi sử dụng PHP, bạn không cần đợi hàng đến mà chỉ cần đi và lấy chúng
Vì vậy, các luồng là gì?
Luồng là sự truyền dữ liệu giữa các địa điểm
Địa điểm có thể là tệp, tệp lưu trữ ZIP, kết nối thậm chí là quy trình thông qua dòng lệnh
Các luồng PHP có các chức năng giúp nhà phát triển quản lý các tài nguyên khác nhau,
Tôi chắc rằng bạn đã thấy các chức năng fopen(), fwrite(), fgets() hoặc file_get_contents(), các luồng cung cấp triển khai hoạt động trong nền của các chức năng này
các gói
Tôi chắc rằng bạn hiểu sự khác biệt giữa mở tệp hoặc mở trang web, cả hai đều có nội dung nhưng chúng là hai loại dữ liệu có thể truyền trực tuyến hoàn toàn khác nhau, do đó chúng yêu cầu các giao thức khác nhau
Chẳng hạn, chúng tôi có thể mở một trang web bằng cách kết nối với các máy chủ web từ xa bằng HTTP, HTTPS hoặc SSL hoặc đọc tệp lưu trữ ZIP hoặc TAR
Các giao thức này được gọi là trình bao bọc luồng. Họ cung cấp một giao diện duy nhất gói gọn tất cả những khác biệt này
Mọi luồng được hình thành từ lược đồ và mục tiêu, đây là định dạng.
sơ đồ. //mục tiêu
Nhìn quen không?
Nếu không chỉ cần tìm kiếm trên thanh địa chỉ của trình duyệt của bạn
PHP bao gồm một danh sách các trình bao bọc được tích hợp sẵn trong ngôn ngữ
- tập tin. // Truy cập hệ thống tệp cục bộ
- http. // Truy cập (các) URL HTTP
- ftp. // Truy cập (các) URL FTP
- php. // Truy cập nhiều luồng I/O khác nhau
- zlib. // Luồng nén
- dữ liệu. // Dữ liệu (RFC 2397)
- quả địa cầu. // Tìm mẫu phù hợp với tên đường dẫn
- phar. // Lưu trữ PHP
- ssh2. // Vỏ an toàn 2
- rar. // RAR
- ogg. // Luồng âm thanh
- chờ đợi. // Xử lý luồng tương tác
Trong trường hợp của chúng tôi, php. // có thể truy cập php. //stdin, php. // thiết bị xuất chuẩn, php. // stderr, php. // đầu vào, php. //đầu ra, php. // fd, php. // bộ nhớ, php. // tạm thời và php. //lọc
Điều đó thật tuyệt cho đến nay nhưng bạn có thể tự hỏi công việc thực sự của những luồng này là gì
Hãy làm một ví dụ
Làm cách nào để bạn đọc phần thân của API REST nơi người dùng cập nhật một số chi tiết ở đâu đó trên web?
Đó là một yêu cầu PUT và không có $_PUT[biến’] trong PHP;
Câu trả lời là thông qua một dòng
// the line reads the content $input = file_get_contents('php://input'); // then we parse the input into an array of parameters parse_str($input, $props);
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
Trong một ví dụ khác, chúng ta có thể sử dụng trình bao bọc tệp và đọc tệp
// file /etc/host is opened are read $handle = fopen("file:///etc/host", r); // If the file in not finished output the line from file pointer while (feof($handle) !== true) { echo fgets($handle); } // Eventually the file get closed for security reasons fclose($handle);
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
Nếu đoạn mã trên trông quá lạ, bạn có thể muốn dừng lại một chút và chuyển qua bài viết cơ bản về PHP
Một niềm tin sai lầm phổ biến là các hàm PHP như fopen(), fgets(), fclose() chỉ dành cho hệ thống tệp,
Các chức năng này hoạt động hoàn toàn tốt với tất cả các hàm bao hỗ trợ chúng
Chúng tôi có thể sử dụng fopen() trên các tệp, kho lưu trữ ZIP và Dropbox (với trình bao bọc Dropbox) và Amazon S3 (với trình bao bọc riêng).
Tạo trình bao bọc tùy chỉnh của bạn
Nếu tập lệnh của bạn cần các yêu cầu đặc biệt, PHP cho phép tự tạo trình bao bọc tùy chỉnh
Trong đoạn mã bên dưới, chúng tôi sẽ tạo trình bao bọc luồng gọi hàm gọi lại để đọc
/ The following class is the wrapper, it has several parameters and the getContext() stream_open(), stream_read() and stream_eof() methods class CallbackUrl { const WRAPPER_NAME = 'callback'; public $context; private $_cb; private $_eof = false; private static $_isRegistered = false; public static function getContext($cb) { if (!self::$_isRegistered) { stream_wrapper_register(self::WRAPPER_NAME, get_class()); self::$_isRegistered = true; } if (!is_callable($cb)) return false; return stream_context_create(array(self::WRAPPER_NAME => array('cb' => $cb))); } public function stream_open($path, $mode, $options, &$opened_path) { if (!preg_match('/^r[bt]?$/', $mode) || !$this->context) return false; $opt = stream_context_get_options($this->context); if (!is_array($opt[self::WRAPPER_NAME]) || !isset($opt[self::WRAPPER_NAME]['cb']) || !is_callable($opt[self::WRAPPER_NAME]['cb'])) return false; $this->_cb = $opt[self::WRAPPER_NAME]['cb']; return true; } public function stream_read($count) { if ($this->_eof || !$count) return ''; if (($string = call_user_func($this->_cb, $count)) == '') $this->_eof = true; return $string; } public function stream_eof() { return $this->_eof; } } // Here is the class that will contain the text object that need to be instanciated class Text { private $_string; public function __construct($string) { $this->$_string = $string; } public function read($count) { return fread($this->$_string, $count); } } // We create a new Text object and open it using our brand-new wrapper CallbackUrl eventually will loop until the file ends $text = new Text(fopen('/etc/services', 'r')); $handle = fopen('callback://', 'r', false, CallbackUrl::getContext(array($text, 'read'))); while(($row = fread($handle, 128)) != '') { print $row; }
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
Bạn có thể tìm thấy một vài ví dụ khác được giải thích rất rõ ràng trong bài đăng của Matt Allan, một nhà phát triển full-stack có trụ sở tại Asheville, NC
Bộ lọc luồng
Theo nhiều nhà phát triển thường xuyên sử dụng luồng, sức mạnh thực sự của tính năng PHP này ẩn sau các bộ lọc
Bộ lọc luồng cho phép lọc và chuyển đổi dữ liệu hiện đang chuyển tiếp
Hãy tưởng tượng bạn có thể chuyển đổi và xuất tất cả các chuỗi trong một tệp thành chữ hoa, trong khi bạn đang đọc tệp
Có 2 cách để sử dụng bộ lọc luồng
- Sử dụng stream_filter_append($stream, $filtername, $read_write)
- sử dụng php. // lọc trình bao bọc luồng
stream_filter_append()
Hãy xem một ví dụ và tôi sẽ nhận xét nó sau
$handle = fopen('file.txt', 'rb'); stream_filter_append($handle, 'string.toupper'); while(feof($handle) !== true) { echo fgets($handle); } fclose($handle);
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
Trong dòng đầu tiên,
chúng tôi mở tập tin. txt được cho là chứa chuỗi ở dạng chữ thường mà chúng tôi muốn chuyển thành chữ hoa
Sau đó, chúng tôi đính kèm (nối) phần xử lý của tệp vào chuỗi bộ lọc luồng. cái nắp đậy
Bây giờ PHP biết rằng khi chúng ta lặp qua ngăn chặn, các ký tự cần được hiển thị dưới dạng chữ hoa
Cũng giống như ma thuật
php. //lọc
Đôi khi bạn sẽ cần sử dụng các hàm chẳng hạn như file() hoặc fpassthru() không cho bạn cơ hội đính kèm các bộ lọc sau khi các hàm đã được gọi
Điều đó có nghĩa là bạn không thể thêm bộ lọc luồng
Trong trường hợp này, bạn sử dụng php. // lọc và sử dụng ngay khi bạn mở tệp
Đoạn trích đang theo dõi
$handle = fopen('php://filter/read=string.toupper/resource=file.txt', 'rb'); while(feof($handle) !== true) { echo fgets($handle); } fclose($handle);
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
Một lần nữa chúng tôi đính kèm chuỗi bộ lọc. topper để văn bản. txt khi đọc nhưng lần này, chúng tôi đã thực hiện nó trên lệnh mở;
Hãy nhận biết định dạng chúng tôi đang sử dụng ở đây. lọc/đọc= _/tài nguyên=__. //_
Tạo bộ lọc luồng tùy chỉnh
Bộ lọc luồng là một công cụ mạnh mẽ, tuy nhiên, bộ lọc tích hợp do PHP cung cấp khá hạn chế, để khắc phục hạn chế này, PHP cho phép chúng tôi tạo bộ lọc luồng tùy chỉnh,
Trên thực tế, bộ lọc tùy chỉnh là lý do chính khiến chúng tôi sử dụng bộ lọc
Bộ lọc luồng tùy chỉnh chỉ là các lớp mở rộng hành vi của php_user_filter()
Đó là tất cả
Lớp này phải có 3 phương thức được triển khai
Phương thức đầu tiên và là phương thức chúng ta sẽ xem ngay bên dưới là bộ lọc (), sau đó chúng ta có onCreate và onClose
Trước khi đi sâu vào và tạo một luồng để chúng tôi làm rõ
Các luồng PHP chia dữ liệu thành các phần của mỗi byte, các phần đó thường được gọi là nhóm
Mỗi bộ lọc luồng nhận và quản lý một hoặc nhiều nhóm này tại một thời điểm
Hãy cùng nhau tạo bộ lọc luồng tùy chỉnh
Quy trình cần 3 bước
- Tạo bộ lọc triển khai php_user_filter()
- Đăng ký bộ lọc mới này
- Sử dụng bộ lọc hoàn toàn mới trong tập lệnh thực tế
Tạo bộ lọc
Trong các ví dụ này, chúng tôi sẽ tạo một bộ lọc chỉnh sửa các từ tục tĩu hoặc spam từ các tệp văn bản
Như đã nói trước đây, chúng ta cần tạo một lớp cần triển khai php_user_filter hơn là triển khai phương thức filter()
class DirtyWordsFilter extends php_user_filter { public function filter($in, $out, &$consumed, $closing) { $words = ['grime', 'dirt', 'grease']; $wordData = []; foreach ($words as $word) { $replacement = array_fill(0, mb_strlen($word), '*'); $wordData[$word] = implode('', $replacement); } $bad = array_keys($wordData); $good = array_values($wordData); // Iterate each bucket while ($bucket = stream_bucket_make_writeable($in)) { // Censor dirty words $bucket->data = str_replace($bad, $good, $bucket->data); // increment total data consumed $consumed += $bucket->datalen; // send bucket to downstream brigade stream_bucket_append($out, $bucket); } // Return the code that indicates that the userspace filter returned buckets in $out return PSFS_PASS_ON; } }
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
Bây giờ bộ lọc đã sẵn sàng, chúng ta cần đăng ký nó, khá đơn giản
Chúng ta chỉ cần sử dụng hàm stream_filter_register() và chuyển tên bộ lọc xác định bộ lọc mới của chúng ta và tên của lớp.
stream_filter_register('dirty_words_filter', 'DirtyWordsFilter');
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
Đây là trang từ hướng dẫn sử dụng PHP chính thức
Chúng tôi đã sẵn sàng sử dụng bộ lọc của mình như chúng tôi đã làm trong các ví dụ trên
$handle = fopen('file.txt', 'rb'); stream_filter_append($handle, 'dirty_words_filter'); while(feof($handle) !== true) { echo fgets($handle); } fclose($handle);
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
Vậy là xong, chúng ta đã an toàn và sẽ không còn lời lẽ bậy bạ nào nữa
Bối cảnh truyền phát
Phần cuối cùng về chủ đề này là về ngữ cảnh,
Xem bối cảnh luồng giống như một trình bao bọc cho một tập hợp các tùy chọn có thể sửa đổi hành vi của luồng
Để tạo ngữ cảnh luồng, bạn cần sử dụng hàm stream_context_create()
Phải mất hai tham số, cả hai đều là mảng kết hợp tùy chọn
Hãy sử dụng bối cảnh luồng cho một thứ gì đó lạ như gửi yêu cầu HTTP POST bằng file_get_contents()
________số 8
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
Bối cảnh luồng là một mảng kết hợp trong đó khóa trên cùng là tên trình bao bọc luồng
Đi đến hướng dẫn để biết thêm thông tin về bối cảnh luồng
Nếu bạn khám phá ra điều gì đó mới, việc tìm hiểu thêm sẽ dễ dàng như việc chạm vào hình ảnh bên dưới
Sự kết luận
Đôi khi việc đi du lịch có thể gây căng thẳng và bạn có thể cần phải đi làm để thư giãn một chút
Bây giờ nếu bạn cần sử dụng các tệp trong tập lệnh của mình hoặc quản lý kho lưu trữ mà bạn biết,
Các luồng PHP giúp bạn trong việc đó
Không có nhiều trường hợp bạn có thể sử dụng chúng và trên thực tế, khả năng sử dụng của chúng khá ẩn đối với hầu hết các nhà phát triển web
Nhưng chúng thực sự dễ sử dụng và theo tôi, nội dung này có thể giúp bạn khám phá viên ngọc nhỏ này của ngôn ngữ PHP