In PHP, stream_get_filters() is a very useful function to get all stream filters available in the current system. It returns an array containing the filter name.
For example, usually you will see something like:
print_r(stream_get_filters());
The output is similar:
Array
(
[0] => string.rot13
[1] => string.toupper
[2] => string.tolower
[3] => convert.iconv.*
[4] => zlib.*
)
However, when some developers use this code, they find that what they return is an empty array:
Array
(
)
So, why does this happen? This article will analyze several common reasons and corresponding solutions.
Flow filters are mainly provided by extensions, such as zlib , iconv , etc. If you use PHP compiled with a minimal configuration, many extensions may be removed, which will cause stream_get_filters() to return empty.
To check whether the relevant extensions are loaded in the current PHP, you can use the following command:
php -m
If you find that extensions such as zlib and iconv are missing, you need to recompile PHP or modify php.ini to enable these extensions.
For common Linux distributions, you can use:
sudo apt install php-zlib php-iconv
Restart the PHP service after installation.
Some developers test stream_get_filters() on the command line (CLI), and the result is empty, but it is normal to access it in the browser. This is usually because the CLI and web environments use different php.ini configuration files.
Check the configuration file path of the CLI with the following command:
php --ini
Check the Loaded Configuration File in it to make sure the extensions you need are loaded in the CLI configuration file.
If the FPM is using different php.ini , you also need to check and align them.
Some development environments (such as some container-based images) remove almost all default extensions in order to reduce volume. In this case, even if PHP starts normally, stream_get_filters() may return empty.
Check the PHP image or installation package you are using, confirm whether it is the full version, and change to a version containing a standard extension if necessary.
In some strictly restricted environments, such as shared hosting, stream-related features may be disabled through disable_functions or other means.
Check the output of phpinfo() or php -i to check whether relevant functions are listed in the disabled_functions setting.
If it is disabled by the hosting provider, you may need to contact them or switch to a more flexible hosting environment.
Assuming that your PHP environment lacks zlib , you can load dynamically in the following way (provided that the system has corresponding .so or .dll files):
if (!extension_loaded('zlib')) {
dl('zlib.so');
}
Please note that the dl() function is usually only valid under the CLI and may not be supported by the web environment.
<?php
$filters = stream_get_filters();
if (empty($filters)) {
echo "No stream filter available currently,Check extensions and configuration。\n";
echo "reference:https://gitbox.net/php/extensions-setup\n";
} else {
echo "Available flow filters:\n";
print_r($filters);
}
?>
Here we will point to https://gitbox.net/php/extensions-setup (note that the domain name is replaced).
If you find that stream_get_filters() returns an empty array, don't panic. It's usually just a problem with missing environment configuration or extensions. Through the above inspection steps, the cause can be basically located and solved.
If you encounter more special problems, you are also welcome to post and discuss in the comment section or forum, or visit gitbox.net directly for more help.