Home >Backend Development >PHP Tutorial >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:
php_user_filter
class and override the filter()
method to create filters tailored to your application's needs.stream_filter_append()
to attach filters to streams, dynamically transforming data within the stream processing.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()
:
<code class="language-php">$h = fopen('lorem.txt', 'r'); stream_filter_append($h, 'convert.base64-encode'); fpassthru($h); fclose($h);</code>
Alternatively, utilize the php://filter
meta wrapper:
<code class="language-php">$filter = 'convert.base64-encode'; $file = 'lorem.txt'; $h = fopen('php://filter/read=' . $filter . '/resource=' . $file,'r'); fpassthru($h); fclose($h);</code>
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:
<code class="language-php"><?php namespace MarkdownFilter; use \Michelf\MarkdownExtra as MarkdownExtra; class MarkdownFilter extends \php_user_filter { // ... (Implementation as in original text) ... }</code>
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:
<code class="language-php">stream_filter_register("markdown", "\MarkdownFilter\MarkdownFilter"); $content = file_get_contents('php://filter/read=markdown/resource=file:///path/to/somefile.md'); // ... error handling ... echo $content;</code>
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.
<code class="language-php">$h = fopen('lorem.txt', 'r'); stream_filter_append($h, 'convert.base64-encode'); fpassthru($h); fclose($h);</code>
The TemplateFilter
class (implementation similar to the original, using RainTPL):
<code class="language-php">$filter = 'convert.base64-encode'; $file = 'lorem.txt'; $h = fopen('php://filter/read=' . $filter . '/resource=' . $file,'r'); fpassthru($h); fclose($h);</code>
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!