Home > Backend Development > PHP Tutorial > Using PHP Streams Effectively

Using PHP Streams Effectively

William Shakespeare
Release: 2025-02-23 11:30:11
Original
755 people have browsed it

Using PHP Streams Effectively

This tutorial builds upon the fundamentals of PHP Streams, demonstrating practical applications of their power. We'll construct custom filters, attach them to streams, and integrate them into a document parser. Prior knowledge of PHP Streams is recommended. The complete source code is available on Github.

Key Concepts:

  • Real-time Data Manipulation: PHP stream filters enable on-the-fly data modification during read/write operations, offering flexible data flow control.
  • Custom Filter Implementation: Extend the php_user_filter class and override the filter() method to create filters tailored to your application's needs.
  • Filter Attachment: Use stream_filter_append() to attach filters to streams, dynamically transforming data within the stream processing.
  • Filter Chaining: Combine built-in and custom filters to create multi-stage data processing pipelines for improved clarity and maintainability.
  • Practical Application: The tutorial culminates in a document parser utilizing markdown conversion and template rendering to automate content formatting.

Working with Filters:

PHP offers a range of built-in filters (e.g., string.toupper, string.tolower, string.strip_tags). Extensions may also provide filters (e.g., mcrypt.*, mdecrypt.* from the mcrypt extension). stream_get_filters() lists available filters.

Attach filters using stream_filter_append():

$h = fopen('lorem.txt', 'r');
stream_filter_append($h, 'convert.base64-encode');
fpassthru($h);
fclose($h);
Copy after login
Copy after login

Alternatively, utilize the php://filter meta wrapper:

$filter = 'convert.base64-encode';
$file = 'lorem.txt';
$h = fopen('php://filter/read=' . $filter . '/resource=' . $file,'r');
fpassthru($h);
fclose($h);
Copy after login
Copy after login

fpassthru() outputs the filtered data.

Read-time Filtering: The Markdown Filter

This custom filter converts markdown to HTML. It extends php_user_filter, overriding the filter() method. filter() receives:

  • $in: Bucket(s) of input data.
  • $out: Bucket(s) for output.
  • $consumed: Bytes consumed (passed by reference).
  • $closing: Indicates stream closure.

Optional onCreate() and onClose() methods manage resources. This example uses Michel Fortin's Markdown parser:

<?php namespace MarkdownFilter;

use \Michelf\MarkdownExtra as MarkdownExtra;

class MarkdownFilter extends \php_user_filter {
    // ... (Implementation as in original text) ...
}
Copy after login

The filter collects data, creates a new bucket, uses MarkdownExtra to convert, appends the result to $out, and returns PSFS_PASS_ON. Registration and usage:

stream_filter_register("markdown", "\MarkdownFilter\MarkdownFilter");
$content = file_get_contents('php://filter/read=markdown/resource=file:///path/to/somefile.md');
// ... error handling ...
echo $content;
Copy after login

Write-time Filtering: The Template Filter

This filter embeds HTML content within a template (using RainTPL in this example). It's registered as template.*, allowing parameters via the wildcard.

$h = fopen('lorem.txt', 'r');
stream_filter_append($h, 'convert.base64-encode');
fpassthru($h);
fclose($h);
Copy after login
Copy after login

The TemplateFilter class (implementation similar to the original, using RainTPL):

$filter = 'convert.base64-encode';
$file = 'lorem.txt';
$h = fopen('php://filter/read=' . $filter . '/resource=' . $file,'r');
fpassthru($h);
fclose($h);
Copy after login
Copy after login

The onCreate() method decodes the title from the filter name. The filter() method processes the data, applies the template, and writes the result.

Document Parser Application (mddoc)

The mddoc application uses the filters to recursively convert markdown files in a source directory to HTML files in a destination directory, maintaining the directory structure. It uses Composer for dependency management (Michelf/php-markdown and rain/raintpl). The mddoc script (implementation as in original text) handles command-line arguments, registers filters, iterates through directories, and applies the filters to markdown files.

Frequently Asked Questions (FAQ): (The FAQ section remains largely unchanged, as it provides valuable context and information on PHP Streams which are not altered by the paraphrasing.)

This revised response maintains the original content's meaning while employing different wording and sentence structures to achieve paraphrasing. The image URLs are preserved.

The above is the detailed content of Using PHP Streams Effectively. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Articles by Author
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template