PHP ist eine Server-Skriptsprache und eine interpretierte Sprache. Es wird häufig bei der Erstellung kleiner und mittlerer Websites verwendet. Es ist nicht so schwer wie Java und lässt sich schneller entwickeln. Aber wie wird diese Skriptsprache vom Server analysiert?
Wir alle wissen, dass PHP in HTML eingebettet werden kann, aber das Suffix der Datei muss mit .php enden. Wenn es sich um .html handelt, wird der PHP-Codeausschnitt direkt vom Browser kommentiert Keine Demonstration mehr, schauen wir uns unten ein Beispiel an:
#test1.php <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>test</title> </head> <body> <?php echo "我是一段PHP脚本"; ?> </body> </html>
Das Ergebnis beim Zugriff über den Browser nach der Verwendung von PHPstudy:
Dies ist ein Absatz Sehr einfacher Code. Wir können sehen, dass der Server das analysierte Ergebnis direkt an den Browser weitergibt. Wenn der Server tatsächlich feststellt, dass das angeforderte Ressourcensuffix .php ist, ruft er den PHP-Parser auf, um ihn zu analysieren und auszuführen PHP-Code im Inneren. Dann antwortet die Ressource dem Client. Hier kommt also der Punkt: Wie wird PHP-Code analysiert? Zunächst müssen wir die verwandten Konzepte von CGI, FastCGI und PHP-FPM verstehen.
Verwandte Empfehlungen: „php-Einführungs-Tutorial“
Was ist CGI?
cgi (Common Gateway Interface) ist eigentlich ein Protokoll. Das Programm, das das CGI-Protokoll implementiert, kann als CGI-Programm bezeichnet werden, das mit dem Browser interagieren und auch über die Datenbank-API kommunizieren kann Datenquellen wie Datenbankserver und beziehen Daten von den Datenbankservern. Nach der Formatierung in ein HTML-Dokument wird es an den Browser gesendet, oder die vom Browser erhaltenen Daten können in die Datenbank eingegeben werden. Und php-cgi ist ein Protokoll zum Parsen von PHP-Code. Diese Vereinbarung hat jedoch mehrere Nachteile. Jedes Mal, wenn der Client eine PHP-Skriptdatei anfordert, forkt der Server zunächst einen Prozess auf und ruft den Parser auf, um das Skript zu analysieren. Wenn das Skript ausgeführt wird, wird der Prozess beendet und jeder Fork-Prozess wird über PHP ausgeführt. ini, um die Umgebung zu initialisieren. Der Prozess kann nicht wiederverwendet werden und der E/A-Overhead von php.ini wird erhöht. Begrenzt die Ausführungsgeschwindigkeit von PHP. Also entwickelte der intelligente PHP-Anbieter ein besseres CGI-Protokoll, nämlich das FastCGI-Protokoll, das später herauskam.
FastCGI-Protokoll
Gu Ming dachte, schnelleres CGI-Protokoll. Wo ist er also bald?
Fastcg löst zunächst die Probleme des ursprünglichen PHP-CGI. Es ermöglicht die Verarbeitung mehrerer Anforderungen in einem Prozess, anstatt den Prozess direkt nach der Verarbeitung einer Anforderung zu beenden den Webserver verbessern. Tatsächlich startet Fastcgi zunächst einen Master, analysiert die Konfigurationsdatei, initialisiert die Ausführungsumgebung und startet dann mehrere Worker. Wenn eine Anfrage eingeht, leitet der Master diese an einen Worker weiter und kann die nächste Anfrage sofort annehmen. Das vermeidet Doppelarbeit und ist natürlich hocheffizient. Und wenn nicht genügend Arbeiter vorhanden sind, kann der Master je nach Konfiguration mehrere Arbeiter vorab starten und warten. Wenn zu viele Arbeiter im Leerlauf sind, werden natürlich einige gestoppt, was die Leistung verbessert und Ressourcen spart.
php-fpm
PHP-FPM (FastCGI Process Manager: FastCGI Process Manager) ist ein PHPFastCGI-Manager für PHP vor 5.3.3. Für PHP, Es handelt sich um ein Patch-Paket, das die FastCGI-Prozessverwaltung in das PHP-Paket integrieren soll. Wenn Sie PHP vor PHP5.3.3 verwenden, müssen Sie es in Ihren PHP-Quellcode patchen und können es nach dem Kompilieren und Installieren von PHP verwenden. Tatsächlich können wir uns php-fpm als einen Interpreter vorstellen. Wir können den Befehl ps -aux | verwenden, um den entsprechenden Prozessstatus anzuzeigen, wie unten gezeigt:
Mit php-fpm können allgemeine Änderungen reibungslos neu gestartet werden Nach php.ini kann der php-cgi-Prozess nicht reibungslos neu gestartet werden, was bedeutet, dass Sie den Dienst neu starten müssen, um die neue Konfiguration neu zu laden. Der PHP-FPM-Verarbeitungsmechanismus hierfür besteht darin, dass neue Arbeiter neue Konfigurationen verwenden und bestehende Arbeiter sich nach der Verarbeitung der anstehenden Arbeit ausruhen können. Dieser Mechanismus wird verwendet, um den Übergang zu erleichtern.
但是传统的php-fpm的worker是同步阻塞的,这在一定程度下也限制了程序的运行速度,并且普通的PHP是无法常驻内存的,也就意味着我们每次执行代码都需要将相同的东西重新加载到新内存去,这点跟java的servlet就不同了,java的servlet在用户访问后实例化,下一个用户就不会再次进行实例化。为了解决这些问题,强大的Rango写出了swoole拓展,swoole和fpmd的进程模型是相同的,manager都是负责管理子进程的创建和回收。但php-fpm的worker进程是同步阻塞的,swoole的worker进程是异步非阻塞的。并且swoole的http-server和fpm的差异是http-server是内存常驻的,PHP程序变成长生命周期的了。变量和对象在使用请求结束后并不会销毁,可以复用。这也就是为什么我们说swoole开启了PHP的新世界。
我们可以用简单的几句就可以创建一个异步非阻塞的http-server甚至是http2协议的server。例如:
$http = new swoole_http_server("127.0.0.1", 9501); $http->on('request', function ($request, $response) { $response->end("<h1>Hello Swoole. #".rand(1000, 9999)."</h1>"); }); $http->start();
swoole的高性能体现在它是一个纯c编写的拓展,并且使用了全内存缓存和异步IO。使得它相对于Node.js默认是单线程的无法利用全部CPU,Golang的协程调度本身有一定性能消耗相比,有着更加不错的性能。
用图解析一波,php-fpm是这样的(图片来源于网络):
而swoole的http-server是这样的(这里的cache应该理解成框架初始化环境所使用的内存):
Das obige ist der detaillierte Inhalt vonWas wird PHP zum Parsen verwendet?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!