In der PHP -Entwicklung wird die Funktion Session_register_Shutdown () verwendet, um eine Rückruffunktion zu registrieren, die automatisch ausgeführt wird, wenn die Sitzung geschlossen ist. Obwohl diese Funktion in einigen älteren Versionen von PHP in realen Projekten vorhanden ist, insbesondere bei der Aufrechterhaltung des Legacy -Code, können Sie auf Situationen stoßen, in denen Sie diesen Teil des Codes einstellen müssen.
Da Session_register_Shutdown () selbst an den PHP -Sitzungsmechanismus gebunden ist, ist es schwierig, das Rückrufverhalten direkt zu testen. In diesem Artikel wird ein Testable -Code -Strukturen vorgestellt und das Unit -Tests -Framework von PHP verwendet, um Session_register_Shutdown () für effektive Tests zu simulieren oder zu ersetzen.
Session_register_Shutdown () ruft die registrierte Rückruffunktion am Ende der PHP -Skriptausführung auf. Die typische Verwendung ist wie folgt:
<?php
session_register_shutdown(function() {
// Logik bearbeiten beim Schließen einer Sitzung
file_put_contents('session_log.txt', 'Session closed at ' . date('Y-m-d H:i:s'));
});
?>
Diese Rückruffunktion wird am Ende der Anfrage automatisch ausgeführt, was dazu führt, dass die Testumgebung die Ausführungsergebnisse nicht direkt erfassen kann.
Es wird empfohlen, die reale Geschäftslogik in einer separaten Methode zu verkapulieren. Session_register_Shutdown () ist nur für die Registrierung des Rückrufs verantwortlich, und nur die Geschäftslogikmethode wird während des Tests aufgerufen.
<?php
class SessionHandler
{
public function registerShutdown()
{
session_register_shutdown([$this, 'onSessionShutdown']);
}
public function onSessionShutdown()
{
// Geschäftslogik
file_put_contents('session_log.txt', 'Session closed at ' . date('Y-m-d H:i:s'));
}
}
?>
Beim Testen rufen wir RegisterShutdown () nicht auf, sondern testen Sie OneSessionShutdown () direkt.
Beispiel -Tests sind wie folgt:
<?php
use PHPUnit\Framework\TestCase;
class SessionHandlerTest extends TestCase
{
protected $handler;
protected $logFile = __DIR__ . '/session_log.txt';
protected function setUp(): void
{
$this->handler = new SessionHandler();
// Stellen Sie sicher, dass die Protokolldatei nicht vorhanden ist
if (file_exists($this->logFile)) {
unlink($this->logFile);
}
}
public function testOnSessionShutdownCreatesLog()
{
$this->handler->onSessionShutdown();
$this->assertFileExists($this->logFile);
$content = file_get_contents($this->logFile);
$this->assertStringContainsString('Session closed at', $content);
}
protected function tearDown(): void
{
if (file_exists($this->logFile)) {
unlink($this->logFile);
}
}
}
?>
Durch direktes Aufrufen von Geschäftslogikmethoden wird die durch den Rückrufmechanismus verursachte Testkomplexität vermieden.
Wenn Sie sicherstellen möchten, dass die registrierte Funktion im Test aufgerufen wird, können Sie die Funktion Override oder Mock-Technologie verwenden. Da Session_register_Shutdown () jedoch eine integrierte PHP-Funktion ist, kann es schwierig sein, direkt zu verspotten. Empfohlene Alternativen sind:
Zusammenfassung die registrierte Funktion in alternative Abhängigkeiten, wie z. B. mit Verschlüssen oder Schnittstellen.
Rufen Sie die eigentliche Funktion in der Produktionsumgebung auf und ersetzen Sie sie durch eine leere Implementierung in der Testumgebung.
Beispiel:
<?php
class SessionHandler
{
private $registerShutdownCallback;
public function __construct(callable $registerShutdownCallback = null)
{
$this->registerShutdownCallback = $registerShutdownCallback ?: 'session_register_shutdown';
}
public function registerShutdown()
{
call_user_func($this->registerShutdownCallback, [$this, 'onSessionShutdown']);
}
public function onSessionShutdown()
{
// Geschäftslogik
}
}
?>
Geben Sie einen benutzerdefinierten Rückruf über, um Session_register_Shutdown während der Tests zu ersetzen, um Nebenwirkungen zu vermeiden.
Es wird nicht empfohlen, die Callback -Ausführung von Session_register_Shutdown () direkt zu testen.
Teilen Sie die Geschäftslogik auf und testen Sie die Rückruffunktionsbehörde separat.
Verbesserung der Flexibilität des Tests, indem Sie integrierte Funktionsaufrufe durch Abhängigkeitsinjektion ersetzen.
Verwenden Sie Phpunit- und andere Test -Frameworks, um die Richtigkeit der Geschäftslogik zu überprüfen.
Mit der obigen Methode kann der Code mit Session_register_Shutdown () effektiv getestet werden und die Codequalität und -wartung verbessert.
<?php
class SessionHandler
{
private $registerShutdownCallback;
public function __construct(callable $registerShutdownCallback = null)
{
$this->registerShutdownCallback = $registerShutdownCallback ?: 'session_register_shutdown';
}
public function registerShutdown()
{
call_user_func($this->registerShutdownCallback, [$this, 'onSessionShutdown']);
}
public function onSessionShutdown()
{
// Simulieren Sie das Schreiben des Protokolls
file_put_contents('https://m66.net/session_log.txt', 'Session closed at ' . date('Y-m-d H:i:s'));
}
}
// Produktionsumfeldanruf
$handler = new SessionHandler();
$handler->registerShutdown();
?>
<?php
use PHPUnit\Framework\TestCase;
class SessionHandlerTest extends TestCase
{
protected $handler;
protected $logFile = __DIR__ . '/session_log.txt';
protected function setUp(): void
{
$this->handler = new SessionHandler(function ($callback) {
// Simulation führt keine Operationen durch,Nebenwirkungen vermeiden
});
if (file_exists($this->logFile)) {
unlink($this->logFile);
}
}
public function testOnSessionShutdownCreatesLog()
{
$this->handler->onSessionShutdown();
$this->assertFileExists('https://m66.net/session_log.txt');
$content = file_get_contents('https://m66.net/session_log.txt');
$this->assertStringContainsString('Session closed at', $content);
}
protected function tearDown(): void
{
if (file_exists('https://m66.net/session_log.txt')) {
unlink('https://m66.net/session_log.txt');
}
}
}
?>