PHPでは、 Stream_Get_Filters()は、現在のシステムですべてのストリームフィルターを使用できるようにするための非常に便利な機能です。フィルター名を含む配列を返します。
たとえば、通常、次のようなものが表示されます。
print_r(stream_get_filters());
出力は似ています:
Array
(
[0] => string.rot13
[1] => string.toupper
[2] => string.tolower
[3] => convert.iconv.*
[4] => zlib.*
)
ただし、一部の開発者がこのコードを使用する場合、彼らが返すのは空の配列であることに気付きます。
Array
(
)
それで、なぜこれが起こるのですか?この記事では、いくつかの一般的な理由と対応するソリューションを分析します。
フローフィルターは、主にZLIB 、 ICONVなどの拡張機能によって提供されます。最小構成でコンパイルされたPHPを使用すると、多くの拡張機能が削除される場合があります。
関連する拡張機能が現在のPHPにロードされているかどうかを確認するには、次のコマンドを使用できます。
php -m
ZLIBやICONVなどの拡張機能が欠落していることがわかった場合は、PHPを再コンパイルするか、 PHP.iniを変更してこれらの拡張機能を有効にする必要があります。
一般的なLinux分布の場合、次のことを使用できます。
sudo apt install php-zlib php-iconv
インストール後にPHPサービスを再起動します。
一部の開発者は、コマンドライン(CLI)でStream_Get_Filters()をテストし、結果は空ですが、ブラウザでアクセスするのは普通です。これは通常、CLI環境とWeb環境が異なるphp.ini構成ファイルを使用しているためです。
次のコマンドを使用して、CLIの構成ファイルパスを確認してください。
php --ini
必要な拡張子がCLI構成ファイルにロードされていることを確認するには、その中のロードされた構成ファイルを確認してください。
FPMが異なるphp.iniを使用している場合、それらを確認して整列する必要があります。
一部の開発環境(一部のコンテナベースの画像など)は、ボリュームを減らすために、ほぼすべてのデフォルト拡張機能を削除します。この場合、PHPが正常に開始されたとしても、 Stream_Get_Filters()は空に戻る場合があります。
使用しているPHP画像またはインストールパッケージを確認し、それがフルバージョンであるかどうかを確認し、必要に応じて標準拡張機能を含むバージョンに変更します。
共有ホスティングなどの厳密に制限された環境では、 disable_functionsまたはその他の手段により、ストリーム関連の機能が無効になる場合があります。
phpinfo()またはphp -Iの出力を確認して、関連する関数がdisabled_functionsの設定にリストされているかどうかを確認します。
ホスティングプロバイダーによって無効になっている場合は、それらに連絡するか、より柔軟なホスティング環境に切り替える必要がある場合があります。
PHP環境にZLIBがないと仮定すると、次の方法で動的にロードできます(システムに対応する.soまたは.dllファイルがある場合):
if (!extension_loaded('zlib')) {
dl('zlib.so');
}
DL()関数は通常、CLIの下でのみ有効であり、Web環境ではサポートされていないことに注意してください。
<?php
$filters = stream_get_filters();
if (empty($filters)) {
echo "現在利用可能なストリームフィルターはありません,拡張機能と構成を確認します。\n";
echo "参考:https://gitbox.net/php/extensions-setup\n";
} else {
echo "利用可能なフローフィルター:\n";
print_r($filters);
}
?>
ここでは、 https://gitbox.net/php/extensions-setupを指します(ドメイン名が置き換えられていることに注意してください)。
Stream_get_filters()が空の配列を返していることがわかった場合は、パニックに陥らないでください。通常、環境構成や拡張機能が欠落している場合の問題です。上記の検査手順を通じて、原因を基本的に配置して解決することができます。
より多くの特別な問題が発生した場合は、コメントセクションまたはフォーラムで投稿して話し合うか、 gitbox.netにアクセスして、詳細を確認することもできます。