Ich verstehe den Funktionsmechanismus von PHP nicht ganz. Bitte geben Sie mir eine Lösung.

WBOY
Freigeben: 2016-08-04 09:20:12
Original
1069 Leute haben es durchsucht

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?

Antwortinhalt:

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>
Nach dem Login kopieren

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:
Ich verstehe den Funktionsmechanismus von PHP nicht ganz. Bitte geben Sie mir eine Lösung.
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.

Ein bisschen gesunder Menschenverstand über PHP:

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.

Schließlich ähneln PHP-Daemon-Dienste wie Swoole/WorkerMan, die unter CLI funktionieren, Java/Node.

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. PHPDie 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! javaKapseln 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! setTimeoutEs 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

Kurz gesagt,

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 HTML

PHP 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 keine

- oder setInterval-Funktion ähnlich wie js hat? setTimeout

PHP verfügt über eine Verzögerungsfunktion (z. B.

) 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

Verwandte Etiketten:
php
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!