In der Konfiguration der PHP -Ausführungsumgebung ist Thread_Safe (Thread Safety) ein Konzept, das häufig erwähnt, aber leicht übersehen wird. Das Aktivieren des Thread_Safe- Modus in Multi-Thread-Servern (wie IIS, Apache mit Worker MPM) oder integrierter Umgebungen (wie FastCGI) ist besonders für die Auswirkungen von Datenbankoperationen von entscheidender Bedeutung. In diesem Artikel werden die Arbeitsprinzipien von PHP kombiniert, um die spezifischen Auswirkungen und den potenziellen Vorteile des Thread_Safe -Modus auf Datenbankoperationen tiefgreifend zu analysieren.
Thread_Safe (oder ZTS, Zend Thread Safety) ist ein Kompilierungsmodus von PHP. Wenn dieser Modus aktiviert ist, verwendet PHP intern Thread-sichere Datenstrukturen (z. B. TSRM: Thread Safe Resource Manager), um globale Variablen und Ressourcen zu verwalten, um Dateninterferenzen zwischen verschiedenen Threads in einer Multi-Thread-Umgebung zu vermeiden.
Um festzustellen, ob der aktuelle PHP Thread_Safe -Modus ist, können Sie ihn im Skript verwenden:
echo php_sapi_name();
echo PHP_ZTS ? 'Thread Safe' : 'Non Thread Safe';
Oder überprüfen Sie die Ausgabe von PHPINFO (), um zu bestätigen, ob die Option "Thread Safety" aktiviert ist.
Im Nicht-Thread-Safe-Modus können mehrere Threads dieselbe Datenbankverbindungsinstanz teilen, die im Status der Verbindungsressource Verwirrung verursacht, wenn sie nicht ordnungsgemäß betrieben wird. Nach dem Aktivieren des Thread_Safe -Modus verwaltet jeder Thread seine eigenen unabhängigen Datenbankverbindungsressourcen und vermeidet das Problem des Ressourcenwettbewerbs:
$mysqli = new mysqli('localhost', 'user', 'pass', 'db');
// existieren thread_safe Im Modus,Jeder Thread hat seinen eigenen $mysqli Beispiel
Diese Isolation ist besonders wichtig für gleichzeitig verbundene dichte Webanwendungen, insbesondere bei Zugriff auf Hochfrequenzdatenbanken wie MySQL, PostgreSQL oder Redis, was die Stabilität erheblich verbessern kann.
Wenn Sie in Ihrem Projekt bestimmte globale Variablen verwenden, um Datenbankverbindungen, Transaktionszustand usw. im Nicht-Thread-Safe-Modus zu speichern, können mehrere Anforderungen auf dieselbe globale Variable zugreifen, was zu Zustandverschmutzung führt:
global $db;
$db = new PDO('mysql:host=localhost;dbname=test', 'root', '');
// 非线程安全Im Modus,Diese Variable kann durch mehrere Anfragen geteilt werden,Konflikt verursachen
Im Thread_Safe -Modus hat jeder Thread einen eigenen unabhängigen variablen Kontext, so dass solche Konflikte effektiv vermieden werden.
In einigen Webserverkonfigurationen, wie z. B. PHP-FPM oder SWOOLE Multithread Coroutine-Modus, ist das Thread-Safe-PHP einfacher mit Mechanismen mit Thread-Pooling-Mechanismen. Zum Beispiel bei der Verwendung von SWOOLE \ COROUTINE \ MYSQL :
go(function () {
$mysql = new Swoole\Coroutine\MySQL();
$mysql->connect([
'host' => '127.0.0.1',
'user' => 'root',
'password' => '',
'database' => 'test'
]);
$result = $mysql->query('SELECT * FROM users');
});
Die Coroutine-Planung von SWOOLE basiert auf einer fadensicheren Umgebung, um zu laufen. Das Aktivieren von Thread_Safe kann unvorhersehbares Verhalten vermeiden, das durch gemeinsame Datenstrukturen in IO -Operationen verursacht wird.
Thread_Safe bringt höhere Sicherheit, aber es kommt nicht ohne Preis. Aufgrund der Verwendung einer großen Anzahl von Sperrmechanismen (wie Mutex-Sperren, Lesen und Schreiben von Sperrs usw.), um Daten zu schützen, ist die Gesamtleistung geringfügig niedriger als die der nicht-thread-sicheren Version. In der tatsächlichen Bereitstellung sollten Sie basierend auf Ihrem Webservermodell wählen.
Zum Beispiel:
Wenn Sie den MPM- Modus oder IIS von Apache verwenden, wird empfohlen, Thread_Safe in Multi-Thread-Umgebungen zu verwenden.
Wenn Sie den Pre-Onk-MPM oder PHP-FPM von Apache verwenden, wird jede Anforderung in einem separaten Vorgang ausgeführt und benötigt nicht Thread_Safe, um die Leistung zu verbessern.
Wenn die von Ihnen verwendeten PHP -Module (z. B. einige Datenbankerweiterungen) in einer Multithread -Umgebung Thread -Sicherheitsprobleme aufweisen, sollte Thread_Safe zuerst aktiviert werden.
Bei Bereitstellung von Anwendungen, die Threadpools, asynchrone Programmier- oder Coroutine -Frameworks (wie M66.net/swoole) verwenden, wird empfohlen, die Thread_Safe -Version PHP zu verwenden.
Lokale Entwicklungsumgebungen müssen im Allgemeinen nicht aktivieren, um eine höhere Leistung zu erzielen.