Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Einführung in den Swoole-Laufmodus zur Beschleunigung der Laravel-Anwendung

Detaillierte Einführung in den Swoole-Laufmodus zur Beschleunigung der Laravel-Anwendung

不言
不言nach vorne
2018-12-29 09:52:253703Durchsuche

Dieser Artikel bietet Ihnen eine detaillierte Einführung in den Swoole-Laufmodus zur Beschleunigung von Laravel-Anwendungen. Ich hoffe, dass er für Freunde in Not hilfreich ist.

1. Swoole ist bekannt dafür, PHP neu definiert zu haben. Es handelt sich um eine PHP-Erweiterung, die die asynchrone Ausführung von PHP ermöglicht. und kann auch Sockets verwenden, wodurch PHP eine Reihe asynchroner E/A-, ereignisgesteuerter und paralleler Datenstrukturfunktionen bereitstellt. Swoole4 unterstützt ein vollständiges Coroutine-Programmiermodell und kann vollständig synchronen Code verwenden, um asynchrone Programme zu implementieren. Es ist nicht erforderlich, dem PHP-Code zusätzliche Schlüsselwörter hinzuzufügen. Die unterste Ebene führt automatisch eine Coroutine-Planung durch, um asynchrone E/A zu implementieren.

Fast alle Swoole, die NodeJS erreichen kann, können realisiert werden, und die Leistung ist höher als die von NodeJS. Schließlich ist NodeJS Single-Threaded und kann die CPU-Leistung nicht vollständig ausnutzen, während Swoole Multi-Threaded ist und diese vollständig ausnutzen kann die CPU-Leistung.

Was ist der Unterschied zwischen der Effizienz von Swoole und der herkömmlichen Webentwicklung? Wie kann die Effizienz von Swoole neben dem traditionellen synchronen LAMP/LNMP-Entwicklungsmodell aufrechterhalten werden?

2.
Traditionelles Webentwicklungsmodell

PHP-Webentwicklung übernimmt die LAMP/LNMP-Architektur, nämlich Linux, Nginx, Mysql und PHP. Hier ist Nginx als Beispiel. Die allgemeine Struktur ist:

Detaillierte Einführung in den Swoole-Laufmodus zur Beschleunigung der Laravel-AnwendungWenn die Anfrage eingeht, überträgt der Webserver die Anfrage an PHP-FPM. PHP-FPM ist ein FastCGI-Dienst mit einer Prozesspoolarchitektur und einem integrierten PHP-Interpreter. FPM ist für die Interpretation und Ausführung von PHP-Dateien verantwortlich, um Antworten zu generieren, die letztendlich an den Webserver zurückgegeben und im Frontend angezeigt werden. Viele Geschäftslogiken sind in PHP-Dateien implementiert, einschließlich MySQL- und Nosql-Zugriff, Aufruf von Drittanbieteranwendungen usw. Bei einer solchen Struktur funktioniert die Zusammenarbeit zwischen PHP-FPM und Nginx gut genug, aber da PHP-FPM selbst ein synchrones Blockierungsprozessmodell ist, werden alle Ressourcen (einschließlich einer Reihe von Objekten, die durch die Framework-Initialisierung erstellt wurden) danach freigegeben Die Anfrage ist abgeschlossen. Dies führt dazu, dass der PHP-Prozess „inaktiv“ ist (erstellen zerstören erstellen) und eine große Menge an CPU-Ressourcen verbraucht, was zu einer begrenzten Durchsatzkapazität einer einzelnen Maschine führt.

Jeder Anforderungsverarbeitungsprozess bedeutet unnötige zeitaufwändige Vorgänge wie das Parsen von PHP-Dateien und Umgebungseinstellungen. Der PHP-Prozess wird nach der Verarbeitung zerstört. Es ist unmöglich, Verbindungspooling und andere Technologien in PHP-Programmen zu verwenden, um eine Leistungsoptimierung zu erreichen .

3.

Swoole-Betriebsmodus

Swoole löst die oben genannten Probleme basierend auf der PHP-Erweiterung. Wir haben das Prozessmodell von Swoole bereits verstanden. Im Vergleich zur herkömmlichen Architektur ist das größte Merkmal des Swoole-Prozessmodells sein Multithread-Reaktormodus zur Verarbeitung von Netzwerkanforderungen, der es ihm ermöglicht, eine große Anzahl von Verbindungen problemlos zu verarbeiten.

Darüber hinaus sind weitere Vorteile:

Vollständig asynchron und nicht blockierend, geringer Ressourcenverbrauch und hohe Effizienz der Programmausführung

Das Programm analysiert und lädt nur die PHP-Datei Einmaliges Laden für jede Anfrage vermeiden

Der Prozess ist resident und ermöglicht die Implementierung von Verbindungspooling und Informationsübertragung zwischen Anfragen

Warum Laravel auf Swoole ausführen? >

Das Laravel-Framework muss beim Start viele Dateien laden. Darüber hinaus ist es für seine gute ökologische Umgebung bekannt, sodass wir während des Entwicklungsprozesses feststellen werden, dass es viele bereits gebaute Räder gibt Das bedeutet, dass die Festplatten-E/A des Laravel-Starts sehr hoch ist (das heißt, es müssen viele Dateien geladen werden).

Der Laravel-Lebenszyklus muss jedes Mal ausgeführt werden, wenn er angefordert wird. Denn die durch eine einzelne Anfrage erstellte Umgebung wird unmittelbar nach der Ausführung der Anfrage zerstört.

Mit anderen Worten: Im traditionellen PHP-Lebenszyklus wird viel Zeit damit verschwendet, Ressourcen für die Skriptausführung zu erstellen und zu zerstören. Stellen Sie sich ein Framework wie Laravel vor. Wie viele Dateien müssen in jeder Anfrage geladen werden? Es verschwendet auch viele E/A-Vorgänge. Was wäre, wenn wir Swoole zum Erstellen eines Servers auf Anwendungsebene verwenden und alle Skriptdateien nach einmaligem Laden im Speicher gespeichert werden könnten? Aus diesem Grund müssen wir versuchen, Laravel auf Swoole auszuführen. Swoole kann eine leistungsstarke Leistung bieten, während Laravel eine elegante Verwendung der Codestruktur ermöglichen kann. Diese beiden sind wirklich eine perfekte Kombination!

5.
Verwenden Sie Swoole, um die Leistung von Laravel zu verbessern

Unter den vorhandenen Rädern finde ich die folgenden beiden immer noch sehr gut, Sie kann selbst wählen

swooletw/laravel-swoole

  • garveen/laravoole

  • Ich habe gewählt die erste So testen Sie die

    -Installation mit Composer:

    composer require swooletw/laravel-swoole
  • Wenn Sie Laravel verwenden, fügen Sie
SwooleTW\Http\LaravelServiceProvider::class,

zum Provider-Array in config/app.php hinzu, wenn Sie Lumen verwenden , Fügen Sie dann den folgenden Code zu bootstrap/app.php hinzu

$app->register(SwooleTW\Http\LumenServiceProvider::class);
Exportieren Sie die Konfigurationsdatei in das Konfigurationsverzeichnis

php artisan vendor:publish --provider="SwooleTW\Http\HttpServiceProvider"
Anschließend können Sie zu config/swoole_http.php gehen, um die Informationen zu konfigurieren

'server' => [
        'host' => env('SWOOLE_HTTP_HOST', '0.0.0.0'),//监听任意ip
        'port' => env('SWOOLE_HTTP_PORT', '1215'),
        'options' => [
            'pid_file' => env('SWOOLE_HTTP_PID_FILE', base_path('storage/logs/swoole_http.pid')),
            'log_file' => env('SWOOLE_HTTP_LOG_FILE', base_path('storage/logs/swoole_http.log')),
            'daemonize' => env('SWOOLE_HTTP_DAEMONIZE', 1),//1-程序将转入后台作为守护进程运行
        ],
],
swoole_http.php bietet auch eine Reihe von Konfigurationsanbietern

'providers' => [
    // App\Providers\AuthServiceProvider::class,
]
Da diese Anbieter nach der Verwendung von swoole als http im Speicher gespeichert werden, ist hier eine Neuregistrierung und ein Neustart erforderlich jede Anfrage.

Jetzt können Sie den folgenden Befehl ausführen, um den Swoole HTTP-Dienst zu starten.

$ php artisan swoole:http start

然后你可以看到以下信息:

Starting swoole http server...
Swoole http server started: <http:></http:>

现在可以通过访问 http://127.0.0.1:1215 来进入 Laravel 应用。
注意:该拓展是不支持热启动的,所以每次有代码更新都要重启服务 php artisan swoole:http restart

六、性能测试
使用Apache的ab测试工具

ab -n 1000 -c 10 http://127.0.0.1:1215/

参数说明:-n 1000个请求 -c 10个并发数

Detaillierte Einführung in den Swoole-Laufmodus zur Beschleunigung der Laravel-Anwendung

Detaillierte Einführung in den Swoole-Laufmodus zur Beschleunigung der Laravel-Anwendung

图一是使用swoole作为应用服务器,图二是apache服务器
测试环境在虚拟机中,电脑配置也较差,性能没有完全发挥出来,可以看到apache只完成197次请求就扛不住压力了,swoole HTTP服务 完成了压测,性功完全碾压apache服务器。

七、使用Nginx代理

swoole在官网也提到过:swoole_http_server对Http协议的支持并不完整,建议仅作为应用服务器。并且在前端增加Nginx作为代理。
那么,我们就增加需要配置nginx.conf里的server:

server {
    listen 80;
    server_name your.domain.com;
    root /path/to/laravel/public;
    index index.php;

    location = /index.php {
        # Ensure that there is no such file named "not_exists"
        # in your "public" directory.
        try_files /not_exists @swoole;
    }

    location / {
        try_files $uri $uri/ @swoole;
    }

    location @swoole {
        set $suffix "";

        if ($uri = /index.php) {
            set $suffix "/";
        }

        proxy_set_header Host $host;
        proxy_set_header SERVER_PORT $server_port;
        proxy_set_header REMOTE_ADDR $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        # IF https
        # proxy_set_header HTTPS "on";

        proxy_pass http://127.0.0.1:1215$suffix;
    }
}

配置可参考swoole方文档官 Nginx/Apache配置
至此,大功告成,你可以像平常一样访问你的网站了。

八、使用swoole和传统php开发的缺点
本文主要介绍了使用swoole作为laravel的应服务器,最后说下使用swoole和传统php开发的缺点。
1、更难上手。这要求开发人员对于多进程的运行模式有更清晰的认识
2、更容易内存泄露。在处理全局变量,静态变量的时候一定要小心,这种不会被GC清理的变量会存在整个生命周期中,如果没有正确的处理,很容易消耗完所有的内存。在php-fpm下,php代码执行完内存就会被完全释放。


Das obige ist der detaillierte Inhalt vonDetaillierte Einführung in den Swoole-Laufmodus zur Beschleunigung der Laravel-Anwendung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen
Vorheriger Artikel:Was ist Julia?Nächster Artikel:Was ist Julia?