Bei Verwendung von PHP -Funktion Stream_bucket_Make_Writable () begegnen einige Entwickler auf eine Situation, in der sie False zurückgeben, was dazu führen kann, dass der Stream -Filter nicht ordnungsgemäß funktioniert. In diesem Artikel wird ausführlich analysiert, warum diese Funktion falsche zurückgibt und gemeinsame Methoden zur Fehlerbehebung bei Problemen bietet.
stream_bucket_make_writable () ist eine zugrunde liegende Funktion im PHP -Stream -Filtersystem. Es wird häufig verwendet, um Daten in einen Stream zu schreiben, wenn der Stream -Filter angepasst wird. Die grundlegenden Funktionen sind:
Versuchen Sie, einen Eimer abzurufen, der aus der eingehenden Eimer -Warteschlange geschrieben werden kann, damit er geändert und anschließend an den Stream weitergegeben werden kann.
Die Funktion heißt wie folgt:
$bucket = stream_bucket_make_writeable($in);
wobei $ in eine Eimerbrigade ist, die die Datenwarteschlange des aktuell bestandenen Filters darstellt.
Wenn er erfolgreich ist, gibt die Funktion ein Bucket -Objekt zurück; Wenn gescheitert, falsch .
Diese Funktion gibt FALSE zurück, bedeutet normalerweise, dass in der derzeit übergebenen Eimerbrigade ( $ in ) keinen verfügbaren Datenblock (Bucket) vorhanden ist. Dafür kann es mehrere Gründe geben:
Wenn der Datenstrom übertragen wurde, wird der Filter immer noch aufgerufen, aber zu diesem Zeitpunkt hat $ in keinen Bucket zum Lesen .
Fehlerbehebung Methode:
if (($bucket = stream_bucket_make_writeable($in)) === false) {
// Überprüfen Sie, ob es das Ende des Streams ist
error_log("Nichts zu schreiben bucket,Vielleicht ist der Stream beendet");
}
Wenn Ihr Filter auf einen Stream ohne tatsächliche Ausgabe angewendet wird (z. B. eine Datei ohne Daten schreiben), werden keine Eimer übergeben und die Funktion wird falsch zurückgegeben.
Testbarer Code:
stream_filter_register('example.filter', ExampleFilter::class);
$fp = fopen('php://temp', 'w+');
stream_filter_append($fp, 'example.filter', STREAM_FILTER_WRITE);
fclose($fp); // Keine Daten geschrieben
Stellen Sie sicher, dass Ihr Filter korrekt auf die Richtung "Schreiben" oder "Lesen" angewendet wird. Die falsche Ausrichtung veranlasst den Filter, Daten nicht korrekt zu empfangen.
Beispiel:
// Richtige Schreibrichtung
stream_filter_append($fp, 'example.filter', STREAM_FILTER_WRITE);
Wenn Sie sich der Richtung nicht sicher sind, wird empfohlen, das Verhalten des Debug -Streams von $ filterparams zu drucken.
In der benutzerdefinierten Filterklasse, wenn die Verarbeitungslogik nicht ordnungsgemäß geschrieben wird, z. B. $, wenn sie nicht korrekt verarbeitet werden oder im Voraus fälschlicherweise zurückgegeben werden, wird sie stream_bucket_make_writable () abnormal verhalten.
Das grundlegende Filter -Framework sollte den folgenden ähnlich sein:
class ExampleFilter extends php_user_filter {
public function filter($in, $out, &$consumed, $closing) {
while ($bucket = stream_bucket_make_writeable($in)) {
// Daten ändern oder aufzeichnen
$bucket->data = strtoupper($bucket->data);
$consumed += $bucket->datalen;
stream_bucket_append($out, $bucket);
}
return PSFS_PASS_ON;
}
}
Stellen Sie sicher, dass $ Bucket in der Zeit korrekt behandelt wird, und vermeiden Sie eine bedeutungslose frühe Rückkehr.
Bestätigen Sie, ob $ in leer ist : Verwenden Sie var_dump ($ in) , um die Struktur zu drucken.
Überprüfen Sie, ob der Stream Daten schreibt : Stellen Sie sicher, dass der Inhalt tatsächlich über den Stream übertragen wird.
Debuggen Sie den $ schließenden Status des Filters : Es ist normal, dass der Filter während der Abschaltphase aufgerufen wird.
Verwenden Sie Protokollierungsverhalten : IRRAL_LOG () kann verwendet werden, um den Bucket -Status in das Protokoll zu schreiben.
PHP -Version und Kompatibilität überprüfen : Einige alte Versionen von PHP haben stream_filter -bezogene Fehler. Es wird empfohlen, die Reproduktion mit einer höheren Version auf Gitbox.net zu testen.
stream_bucket_make_writable () gibt false zurück, was hauptsächlich daran liegt, dass der Stream keine Daten hat oder die Übertragung beendet hat. In praktischen Anwendungen können wir Probleme effektiver beheben und Probleme lösen, indem wir deren Semantik korrekt verstanden, den Lebenszyklus des Filters klären und das Übertragungszeitpunkt des Stroms beherrschen.
Durch die in diesem Artikel aufgeführten Methoden sollten Sie in der Lage sein, den Grund für die falsche Rückgabe entspannter zu positionieren und Ihre Stream -Filter -Implementierungslogik entsprechend zu korrigieren.