Einzelnen Beitrag anzeigen
  #5 (permalink)  
Alt 24-02-2016, 13:04
Benutzerbild von mermshaus mermshaus
 Registrierter Benutzer
Links : Onlinestatus : mermshaus ist offline
Registriert seit: Jun 2009
Beiträge: 452
mermshaus wird schon bald berühmt werden
Standard

Die Sache ist, dass diese „passiert am Ende des Scripts automatisch“-Geschichten in PHP nicht unbedingt in der Reihenfolge ablaufen, die man „erwarten“ würde.

Hier scheint es der Fall zu sein, dass die Garbage Collection zuerst läuft oder dass zumindest zuerst die Objekte aus dem Speicher freigegeben werden, bevor das Callback ausgeführt wird. (Das liegt nicht speziell an mysqli. Das liegt daran, dass mysqli-Instanzen Objekte sind, während mysql-„Instanzen“ Ressourcen sind.)

Lösungen:

- Beende den Output Buffer manuell am Scriptende via ob_get_clean und Co.
- Sichere die benötigten Variablen in einer Closure. (Das ist dann allerdings der Inhalt der Variablen zu dem Zeitpunkt der Erstellung der Closure.)

PHP-Code:
<?php

$db 
mysqli_connect('localhost''root''root''fiddle');
$test '123';

$cb = function ($s) use ($db$test) {

    
error_log('db inside: '.(isset($db)?"set":"unset"));
    
error_log('test inside: '.(isset($test)?"set":"unset"));

    return 
$s;
};

ob_start($cb);

error_log('db outside: '.(isset($db)?"set":"unset"));
error_log('test outside: '.(isset($test)?"set":"unset"));

Geändert von mermshaus (24-02-2016 um 13:08 Uhr)
Mit Zitat antworten