Heim > Artikel > Backend-Entwicklung > Ich verstehe den Funktionsmechanismus von PHP nicht ganz. Bitte geben Sie mir eine Lösung.
Wie Java und NodeJS sollte es ein Programm sein, das kontinuierlich auf dem Server läuft. Dieses Programm wird immer ausgeführt, belegt die CPU und den Speicher und verarbeitet die Netzwerkanfrage, wenn es sie empfängt.
PHP scheint kein Programm zu sein, es ähnelt eher HTML. Es wird nur ausgeführt, wenn niemand auf den PHP-Dienst zugreift der CPU. Das ist es.
Wenn dies der Fall ist, ist es für PHP dann nicht schwierig, Datenbankklassen zu kapseln? Weil jeder Benutzer hereinkommt und einen Prozess für ihn öffnen muss und die Prozesse nicht miteinander verbunden sind. Benutzer A kommt herein und öffnet eine Datenbankverbindung für ihn, und Benutzer B kommt herein und öffnet eine separate Datenbankverbindung für ihn. Stellt PHP also nicht ständig eine Verbindung zur Datenbank her und trennt sie auch wieder? Nachdem es mehr Benutzer gibt, sollte der Overhead sehr hoch sein, oder?
Ist das auch der Grund, warum PHP keine setInterval
- oder setTimeout
-Funktionen ähnlich wie js hat?
Wie Java und NodeJS sollte es ein Programm sein, das kontinuierlich auf dem Server läuft. Dieses Programm wird immer ausgeführt, belegt die CPU und den Speicher und verarbeitet die Netzwerkanfrage, wenn es sie empfängt.
PHP scheint kein Programm zu sein, es ähnelt eher HTML. Es wird nur ausgeführt, wenn niemand auf den PHP-Dienst zugreift ein bisschen CPU. Das ist es.
Wenn dies der Fall ist, ist es für PHP dann nicht schwierig, Datenbankklassen zu kapseln? Weil jeder Benutzer hereinkommt und einen Prozess für ihn öffnen muss und die Prozesse nicht miteinander verbunden sind. Benutzer A kommt herein und öffnet eine Datenbankverbindung für ihn, und Benutzer B kommt herein und öffnet eine separate Datenbankverbindung für ihn. Stellt PHP also nicht ständig eine Verbindung zur Datenbank her und trennt sie auch wieder? Wenn es mehr Benutzer gibt, sollten die Kosten sehr hoch sein, oder?
Ist das auch der Grund, warum PHP keine setInterval
- oder setTimeout
-Funktionen ähnlich wie js hat?
Nehmen Sie PHP-FPM als Beispiel (ähnlich wie Apache MOD_PHP), um über den Betriebsmechanismus von PHP zu sprechen.
Zuallererst ist PHP-FPM ein in C implementierter Multiprozess-FastCGI-Dienst.
Jeder PHP-FPM-Arbeitsprozess Es verfügt über einen integrierten PHP-Interpreter, ist nicht auf PHP-CGI angewiesen und unterstützt Hintergrundpersistenz, z. B. Konfiguration:
<code>nginx.conf: 访问io.php的请求都交给监听9001的PHP-FPM进程池处理 location = /io.php { include fastcgi_params; fastcgi_pass 127.0.0.1:9001; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } php-fpm: 正常脚本由静态www池处理,阻塞脚本由动态io池处理 [www] ;名为www的进程池监听9000端口,常驻进程数量为固定4个 listen = 127.0.0.1:9000 pm = static pm.max_children = 4 [io] ;名为io的进程池监听9001端口,进程数常驻4个,最大8个 listen = 127.0.0.1:9001 pm = dynamic pm.max_children = 8 pm.start_servers = 4 pm.min_spare_servers = 4 pm.max_spare_servers = 4</code>
Der PHP-FPM-Hauptprozess wird verwendet, um diese Arbeitsprozesse zu verwalten. Wenn beispielsweise ein Arbeitsprozess abgebrochen wird, erstellen Sie sofort einen neu.
PHP-FPM stellt pm.status_path bereit, um den gesamten Satz von PHP-FPM anzuzeigen. Der Arbeitsstatus des FPM-Dienstes.
Unterstützt werden beispielsweise das Aufgeben nach einer Zeitüberschreitung der Ausführung, das automatische Neustarten des Arbeitsprozesses nach Verarbeitung der angegebenen Anzahl von Anforderungen und die langsame Protokollierung (Ermitteln zeitaufwändiger Dateien und Funktionen).
Und nach der Aktivierung dauerhafter Verbindungen kann jeder PHP-FPM-Arbeitsprozess eine lange Verbindung zu MySQL aufrechterhalten, ohne sie freizugeben, wodurch wiederholte Verbindungen zur Datenbank vermieden werden.
Die folgende Abbildung zeigt beispielsweise zwei PHP-FPM-Prozesse und MySQL 2 lange Verbindungen aufgebaut:
Darüber hinaus implementieren die PECL-Erweiterungen für Memcached und Redis auch die Funktion persistenter Verbindungen.
Wir haben oben über das PHP-FPM-System gesprochen. Lassen Sie uns nun über den Lebenszyklus von PHP-Skripten unter dem PHP-FPM-System sprechen.
Der Lebenszyklus von Mengen (einschließlich globaler Variablen) in PHP-Skripten existiert nur für einen Wenn die Anforderungsverarbeitung abgeschlossen ist, gibt PHP-FPM die Ressourcen automatisch einmal pro Anforderung frei. Diese Art der Speicherfreigabe basiert auf der Referenzzählung, bevor das Programm beendet wird
Die hier freigegebenen Ressourcen beziehen sich auf die im Skript gesteuerten Ressourcen und beeinträchtigen weder den PHP-FPM-Residentprozess, noch wird der PHP-FPM-Prozess heruntergefahren, noch wird PHP-FPM die dauerhafte Verbindung schließen PHP-FPM ist nur für die Eingabe von PHP-Skripten und die Ausführung von PHP-Operationen verantwortlich. Wenn die ZendOpcache-Unterstützung hinzugefügt wird, können alle durch das Parsen von PHP-Skripten generierten Opcodes für die direkte Interpretation und Ausführung beim nächsten Mal zwischengespeichert werden opcache.file_cache opcode implementiert den Quellcodeschutz.
Datenbankverbindungspool: Die persistente PHP-Verbindung ist ein natürlicher und transparenter Verbindungspool, der keinen Programmeingriff erfordert und MySQL/Memcached/Redis usw. unterstützt.
Speicherresident: PHP- FPM-Prozess. Der Opcode von Skripten, die von ZendOpcache und Yac, entwickelt von Bird Brother, zwischengespeichert werden, sind alle speicherresident.
Garbage Collection: PHP-FPM gibt Ressourcen einmal pro Anfrage frei, was die Rolle von GC basierend auf der Referenzzählung schwächt.
Obwohl ich bereits von der Arbeit gekommen bin, kann ich es nicht ertragen zu sehen, dass das, was Sie gesagt haben, PHP
ähnlich ist wie html
. PHP
Die Funktion ist nicht vergleichbar mit html
. Nehmen Sie Ihr Beispiel für die Verbindung mit einer Datenbank. Kann der Datenbankinhalt gelesen werden? Auf keinen Fall! Außerdem haben Sie gesagt, dass mehrere Benutzer eine Datenbankverbindung öffnen müssen, damit jeder Benutzer darauf zugreifen kann html
. Das Kapseln einer Datenbankverbindungsklasse ist sehr einfach, daher werde ich es nicht veröffentlichen PHP
. Zu jeder Datenbankerweiterung im PHP-Handbuch gibt es eine Einführung und Beispiele für Ihre eigene Referenz. Da Sie code
erwähnt haben, müssen Sie auch das Singleton-Muster kennen! java
Kapseln Sie eine Datenbankverbindungsklasse und richten Sie den Singleton-Modus ein, um eine statische Datenverbindung zu erreichen. Egal wie viele Benutzer zu Besuch kommen, rufen Sie es einfach direkt auf und Sie können mehrere Prozesse öffnen, anstatt, wie Sie sagten, mehrere Benutzer zu besuchen. Und die PHP
und setInterval
, die Sie erwähnt haben, sind geplante Hinrichtungen! setTimeout
Es ist auch ok! Definieren Sie zunächst die Funktionen, die PHP implementieren möchte, und legen Sie dann PHP
auf dem Server fest. Legen Sie die Parameter einfach selbst fest, oder es gibt auch crontab
. Ich werde die Funktionen usw. nicht auflisten und die Antworten habe ich noch nicht formatiert, sodass Sie sie sich zunächst ansehen können. Ich muss von der Arbeit gehen und gehen. Wenn Sie Fragen haben, besprechen wir sie morgen weiter php-fpm
ist eine sehr gute Sprache mit sehr leistungsstarken Funktionen ... und sie entwickelt sich immer noch weiter ... leicht zu erlernen und zu verstehen! BruderPHP
PHP kann sich nicht im Speicher befinden. Nachdem jede HTTP-Anfrage geöffnet wurde, wird eine Verbindung zur Datenbank hergestellt. Wenn die Anfrage abgeschlossen ist, werden die Datenbankverbindung und verschiedene Variablen freigegeben.
Ihr Gesamtverständnis ist korrekt, aber nicht alle Sprachen sind speicherresident wie Java, weder Python, Go noch C. PHP verfügt nicht über das Konzept eines Verbindungspools. Der Prozess wird nach seiner Ausführung freigegeben und nicht anderen Prozessen zur Verwendung überlassen
Hier ist der Link zum ersten Abschnitt von Kapitel 2 von „Detailliertes Verständnis des PHP-Kerns“:
http://www.php-internals.com/...
Ihre Zweifel kommen nur daher, dass Sie nur die Oberfläche gesehen haben.
Wenn Sie Swoole verwendet haben, werden Sie diese Frage wahrscheinlich nicht stellen.
Äh, Sie dachten, PHP-FPM wäre nicht angekommen. . .
Und PHP scheint kein Programm zu sein, eher wie HTMLPHP kann nur in HTML eingebettet werden, aber es unterscheidet sich völlig von HTML. PHP verfügt über viele Erweiterungen, die unterschiedliche Dinge können.
Es wird nur ausgeführt, wenn niemand auf den PHP-Dienst zugreift, belegt PHP nicht einmal ein bisschen Speicher oder ein bisschen CPU. Stimmt das?PHP verfügt hauptsächlich über zwei Betriebsmodi (außer CLI):
1. Mod_php wird durch Apache dargestellt, zu diesem Zeitpunkt wird die Arbeit an Apache übergeben.
2. PHP-FPM (FastCGI-Prozessmanager), der von Nginx/Lighttpd verwendet wird. Dies ist ein residenter Daemon-Prozess.
Wie kann es also sein, dass es nicht CPU und Speicher belegt?
Wenn dies der Fall ist, ist es für PHP dann nicht schwierig, Datenbankklassen zu kapseln? Weil jeder Benutzer hereinkommt und einen Prozess für ihn öffnen muss und die Prozesse nicht miteinander verbunden sind. Benutzer A kommt herein und öffnet eine Datenbankverbindung für ihn, und Benutzer B kommt herein und öffnet eine separate Datenbankverbindung für ihn. Stellt PHP also nicht ständig eine Verbindung zur Datenbank her und trennt sie auch wieder? Wenn es mehr Benutzer gibt, sollten die Kosten sehr hoch sein, oder?Am Beispiel von MySQL: Wenn Sie beim Herstellen einer Verbindung pconnect (persistente Verbindung) auswählen, wird die bestehende Verbindung beim nächsten Mal direkt verwendet und die Verbindung wird nicht geschlossen.
PDO verfügt auch über eine lange Verbindungsoption.
Ist das auch der Grund, warum PHP keinePHP verfügt über eine Verzögerungsfunktion (z. B.- oder
setInterval
-Funktion ähnlich wie js hat?setTimeout
) und die Genauigkeit ist viel höher als die von JS (Mikrosekundenebene). sleep()
Es ist so lebhaft. Die Antworten und Kommentare von @ivanilla enthalten viele Informationen, danke.
Tatsächlich denke ich, dass der Funktionsmechanismus von PHP in der Antwort auf die Frage des ursprünglichen Posters darin besteht, Skripte zu interpretieren und auszuführen. PHP ist eine Skriptsprache, die serverseitige Unterstützung für kleine und mittlere Websites bietet. Sie bietet ein gutes Gleichgewicht zwischen Entwicklungsgeschwindigkeit und Betriebseffizienz.
Die anderen Ansichten des Posters sind also von geringem Wert, und selbst die Debatte ist bedeutungslos. Wenn PHP die Dinge hat, die Sie sich vorstellen, wird niemand diese Sprache verwenden, und jeder könnte genauso gut Java verwenden.
Der Autor verfügt über keine Grundkenntnisse in PHP, daher muss er PHP-Neuling sein. Vereinfacht ausgedrückt kann PHP in zwei Modi ausgeführt werden, z. B. durch Ausführen von php xxx.php in der Shell. Der andere besteht darin, die Ausführung nur zu starten, wenn eine Netzwerkanforderung vorliegt Einige werden im Apache-Erweiterungsmodus kompiliert, es gibt auch den Fast-CGI-Modus. Die mod_php-Methode von Apache besteht darin, einen Prozess zur Ausführung mit einer Anfrage zu starten. Sie ist sehr effizient und verfügt über verschiedene Parameteroptimierungen. Fast-CGI ist viel effizienter. Spezielle Poster können das entsprechende Handbuch lesen und üben.
Die Jungs oben sind so geduldig