Luồng PHP là gì

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”

Luồng PHP là gì

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

  1. Tạo bộ lọc triển khai php_user_filter()
  2. Đăng ký bộ lọc mới này
  3. 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

Luồng PHP là gì

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

Bối cảnh luồng php là gì?

Ngữ cảnh luồng ¶ . Bối cảnh được tạo bằng cách sử dụng stream_context_create() và có thể được chuyển đến hầu hết các hàm tạo luồng liên quan đến hệ thống tệp (i. e. fopen(), file(), file_get_contents(), v.v. ). a set of parameters and wrapper specific options which modify or enhance the behavior of a stream. Contexts are created using stream_context_create() and can be passed to most filesystem related stream creation functions (i.e. fopen(), file(), file_get_contents(), etc...).

Trình bao bọc luồng php là gì?

Lớp streamWrapper ¶ . ). Ghi chú. Đây KHÔNG phải là một lớp thực, chỉ là một nguyên mẫu về cách một lớp xác định giao thức của chính nó. Allows you to implement your own protocol handlers and streams for use with all the other filesystem functions (such as fopen(), fread() etc.). Note: This is NOT a real class, only a prototype of how a class defining its own protocol should be.

Đầu vào php có nghĩa là gì?

php. // đầu vào là luồng chỉ đọc cho phép bạn đọc dữ liệu thô từ phần thân yêu cầu . php. // đầu vào không khả dụng với enctype="multipart/form-data".

thiết bị xuất chuẩn trong php là gì?

php. //đầu ra là đầu ra của máy khách, thiết bị xuất chuẩn là đầu ra tiêu chuẩn của máy chủ PHP .