PHPのstream_bucket_make_writeable()関数を使用する場合、一部の開発者はfalseが返される状況に遭遇し、ストリームフィルターが適切に機能しない可能性があります。この記事では、この関数が偽りを返す理由を詳細に分析し、問題をトラブルシューティングする一般的な方法を提供します。
Stream_bucket_make_writable()は、PHPストリームフィルターシステムの基礎となる関数です。ストリームフィルターをカスタマイズするときに、データをストリームに書き込むためによく使用されます。その基本機能は次のとおりです。
着信バケツキューから書くことができるバケツを取得して、それを変更してからストリームに戻すことができるようにしてみてください。
関数は次のように呼ばれます。
$bucket = stream_bucket_make_writeable($in);
ここで、 $ inはバケツ旅団であり、現在渡されているフィルターのデータキューを表しています。
成功した場合、関数はバケットオブジェクトを返します。失敗した場合、 false 。
この関数は、通常、現在渡されているバケット旅団( $ in )に利用可能なデータブロック(バケット)がないことを意味します。これにはいくつかの理由があるかもしれません:
データストリームが送信された場合、フィルターはまだ呼び出されますが、現時点では$ inには読み取るバケツがないため、自然にstream_bucket_make_writable()はfalseを返します。
トラブルシューティング方法:
if (($bucket = stream_bucket_make_writeable($in)) === false) {
// ストリームの終わりかどうかを確認してください
error_log("書くものは何もありません bucket,たぶん、ストリームが終了しました");
}
フィルターが実際の出力なしでストリームに適用されている場合(データライティングのないファイルなど)、バケットが渡されず、関数がfalseを返します。
テスト可能なコード:
stream_filter_register('example.filter', ExampleFilter::class);
$fp = fopen('php://temp', 'w+');
stream_filter_append($fp, 'example.filter', STREAM_FILTER_WRITE);
fclose($fp); // データは書かれていません
フィルターが「書き込み」または「読み取り」ストリーム方向に正しく適用されていることを確認してください。間違った方向により、フィルターがデータを正しく受信できなくなります。
例:
// 正しい書き方
stream_filter_append($fp, 'example.filter', STREAM_FILTER_WRITE);
方向がわからない場合は、 $ filterParamsデバッグストリームの動作を印刷することをお勧めします。
カスタムフィルタークラスでは、処理ロジックが不適切に記述されている場合、 $が正しく処理されない場合、または事前に誤って戻るなど、 stream_bucket_make_writable()が異常に動作します。
基本的なフィルターフレームワークは、次のものと似ている必要があります。
class ExampleFilter extends php_user_filter {
public function filter($in, $out, &$consumed, $closing) {
while ($bucket = stream_bucket_make_writeable($in)) {
// データを変更または記録します
$bucket->data = strtoupper($bucket->data);
$consumed += $bucket->datalen;
stream_bucket_append($out, $bucket);
}
return PSFS_PASS_ON;
}
}
$バケツがwhileループで正しく処理されていることを確認し、無意味な早期リターンを避けてください。
$ inが空であるかどうかを確認します: var_dump($ in)を使用して構造を印刷します。
ストリームがデータを書き込むかどうかを確認します。コンテンツが実際にストリームを介して送信されていることを確認してください。
フィルターの$クロージング状態をデバッグします。シャットダウンフェーズ中にフィルターが呼び出されるのは正常です。
ロギング動作を使用してください: ERROR_LOG()を使用して、ログにバケットステータスを書き込むことができます。
PHPバージョンと互換性を確認する:PHPの古いバージョンには、 stream_filterに関連するバグがあります。 gitbox.netでより高いバージョンを使用して複製をテストすることをお勧めします。
Stream_bucket_make_writable()はfalseを返します。これは、主にストリームにデータがないか、送信が終了したためです。実際のアプリケーションでは、そのセマンティクスを正しく理解し、フィルターのライフサイクルを明確にし、ストリームの送信タイミングをマスターすることによってのみ、問題をより効果的に調査および解決できます。
この記事にリストされている方法を通して、虚偽のリターンの背後にある理由をよりリラックスしてよりリラックスして、それに応じてストリームフィルターの実装ロジックを修正できるはずです。