Heim PHP-Framework Laravel Versuchen Sie, die Laravel-Version in die Swoole-Version zu ändern

Versuchen Sie, die Laravel-Version in die Swoole-Version zu ändern

Dec 02, 2022 pm 04:29 PM
laravel swoole

Dieser Artikel vermittelt Ihnen relevantes Wissen über Laravel und Swoole. Der Hauptinhalt besteht darin, Ihnen beizubringen, wie Sie Laravel auf die Swoole-Version umstellen (versuchen Sie es zu lernen, es wird nicht empfohlen, das vorhandene Projekt zu ändern). Ich hoffe, es wird für alle hilfreich sein!

Forword

not für die Produktionsumgebung empfohlen

Schalten Sie ein neues Laravel Project

rrree

change Laravel zu, um eine Datei der SWOOLE -Version zu erhalten. / Kopieren Sie den Code in index.php [Empfohlenes Lernen: Laravel-Video-Tutorial

]

laravel new swoole-laravel
Nach dem Login kopieren
Der erste Schritt besteht darin, die Framework-Datei zu laden. Sie sollte im Hauptprozess geladen werden, ohne dass Unterprozesse oder Unterprozesse erforderlich sind Die Coroutine wird erneut geladen werden. Daher müssen die oben genannten Anforderungen nicht berührt werden.

Der zweite Schritt besteht darin, einen HTTP-Swoole-Dienst zu starten. Dies wurde bereits oft erwähnt. Beachten Sie, dass wir in onRequest den $kernel-bezogenen Code einfügen sollten.

<?php
use Illuminate\Contracts\Http\Kernel;
use Illuminate\Http\Request;
define(&#39;LARAVEL_START&#39;, microtime(true));
require __DIR__.&#39;/../vendor/autoload.php&#39;;
$app = require_once __DIR__.&#39;/../bootstrap/app.php&#39;;
$kernel = $app->make(Kernel::class);
$response = $kernel->handle(
    $request = Request::capture()
)->send();
$kernel->terminate($request, $response);
Nach dem Login kopieren

Ist das genug? Warum probieren Sie es nicht erst einmal aus? Unter normalen Umständen können Sie möglicherweise keine Ein- oder Ausgabe erhalten. Warum ist das so?

Der dritte Schritt besteht darin, das Eingabeproblem zu lösen. Tatsächlich funktionieren superglobale Variablen in Swoole nicht, sodass Variablen wie $_GET ungültig werden und anforderungsbezogene Objekte in Laravel keine Daten abrufen können. Was zu tun? Wir erhalten diese Daten einfach aus den Parametern von onRequest und fügen sie dann wieder in $_GET in der aktuellen Prozess-Coroutine ein.

$http = new Swoole\Http\Server(&#39;0.0.0.0&#39;, 9501);
$http->on(&#39;Request&#39;, function ($req, $res) use($app) {
    try {
        $kernel = $app->make(Kernel::class);
        $response = $kernel->handle(
            $request = Request::capture()
        )->send();
        $kernel->terminate($request, $response);
    }catch(\Exception $e){
        print_r($e->getMessage());
    }
});
echo "服务启动", PHP_EOL;
$http->start();
Nach dem Login kopieren

Die oben genannten drei Codeteile lösen jeweils die Probleme von $_SERVER, $_GET und $_POST. Wenn Sie es nun erneut versuchen, können die Parameter empfangen werden, aber warum wird die Ausgabe auf der Konsole gedruckt?

Der vierte Schritt besteht darin, das Ausgabeproblem zu lösen, die gesamte Ausgabe im Frame in den Ausgabepuffer zu legen und dann die Antwort von Swoole für die Rückkehr zu verwenden.

$http->on(&#39;Request&#39;, function ($req, $res) use($app) {
    $_SERVER = [];
    if(isset($req->server)){
        foreach($req->server as $k => $v){
            $_SERVER[strtoupper($k)] = $v;
        }
    }
    $_GET = [];
    if(isset($req->get)){
        foreach ($req->get as $k => $v){
            $_GET[$k] = $v;
        }
    }
    $_POST = [];
    if(isset($req->post)){
        foreach ($req->post as $k => $v){
            $_POST[$k] = $v;
        }
    }
    try {
        $kernel = $app->make(Kernel::class);
        $response = $kernel->handle(
            $request = Request::capture()
        )->send();
        $kernel->terminate($request, $response);
    }catch(\Exception $e){
        print_r($e->getMessage());
    }
});
Nach dem Login kopieren

Der letzte ob_start()-Inhalt ist auch das, was wir zuvor studiert haben, daher werden wir ihn nicht weiter erklären.

Alle Codes

$http->on(&#39;Request&#39;, function ($req, $res) use($app) {
    $_SERVER = [];
    if(isset($req->server)){
        foreach($req->server as $k => $v){
            $_SERVER[strtoupper($k)] = $v;
        }
    }
    $_GET = [];
    if(isset($req->get)){
        foreach ($req->get as $k => $v){
            $_GET[$k] = $v;
        }
    }
    $_POST = [];
    if(isset($req->post)){
        foreach ($req->post as $k => $v){
            $_POST[$k] = $v;
        }
    }
    //把返回放到一个缓冲区里
    ob_start();
    try {
        $kernel = $app->make(Kernel::class);
        $response = $kernel->handle(
            $request = Request::capture()
        )->send();
        $kernel->terminate($request, $response);
    }catch(\Exception $e){
        print_r($e->getMessage());
    }
    $ob = ob_get_contents();
    ob_end_clean();
    $res->end($ob);
});
Nach dem Login kopieren

An diesem Punkt ist unsere einfachste Framework-Transformation abgeschlossen. Probieren wir den Effekt schnell aus.

Run

start();
Nach dem Login kopieren

Besuchen Sie

php swoole_server.php
Nach dem Login kopieren

Probieren Sie den Coroutine-Effekt aus

Definieren Sie zunächst eine Route. Oder wir können die Standardroute direkt ändern.

http://47.113.xxx.xx:9501/
Nach dem Login kopieren

Eine Menge Dinge gedruckt, aber sie sollten alle bekannt sein. Die ersten beiden sind die Ausgabe der Coroutine-ID und der Coroutine-Informationen. Dann geben wir 10 Sekunden lang SwooleCoroutine::sleep () aus und geben dann die Prozess-ID aus.

Dann öffnen wir den Browser und bereiten den gemeinsamen Zugriff auf die beiden Registerkarten vor.

Route::get(&#39;/&#39;, function () {
    echo Swoole\Coroutine::getCid(), "<br/>";
    print_r(Swoole\Coroutine::stats());
    Swoole\Coroutine::sleep(10);
    echo "<br/>";
    echo getmypid(), "<br/>";
//    return view(&#39;welcome&#39;);
});
Nach dem Login kopieren

Hast du es gesehen? Jedes onRequest-Ereignis öffnet tatsächlich eine neue Coroutine, um die Anfrage zu bearbeiten, daher sind ihre Coroutine-IDs unterschiedlich. Gleichzeitig wartet die zweite Anfrage nicht bis zur Rückkehr 20 Sekunden, da die erste Anfrage blockiert ist. Schließlich sehen wir im Coroutine-Status auch, dass in der zweiten Anfrage zwei coroutine_nums angezeigt werden, was darauf hinweist, dass derzeit zwei Coroutinen Aufgaben verarbeiten. Letztendlich sind die Prozesse die gleichen, sie folgen alle dem gleichen Prozess.

Probieren Sie den Multiprozesseffekt aus

Standardmäßig ist der obige Code ein Hauptprozess und ein Worker-Prozess und verwendet dann die Coroutine-Funktion. Tatsächlich kann dieser Effekt den gewöhnlichen PHP-FPM-Effekt sofort zerstören. Aber wir müssen die Leistung von Multi-Core-Maschinen voll ausnutzen, das heißt, wir ermöglichen mehrere Prozesse und nutzen den superstarken Verarbeitungsmodus von Multi-Prozess + Multi-Coroutine. Der einfachste Weg besteht darin, die Anzahl der Prozessarbeiter für den HTTP-Dienst direkt festzulegen.

// 第一个访问的页面
1
Array
(
    [event_num] => 2
    [signal_listener_num] => 0
    [aio_task_num] => 0
    [aio_worker_num] => 0
    [aio_queue_size] => 0
    [c_stack_size] => 2097152
    [coroutine_num] => 1
    [coroutine_peak_num] => 1
    [coroutine_last_cid] => 1
)
1468
// 第二个访问的页面
2
Array
(
    [event_num] => 2
    [signal_listener_num] => 0
    [aio_task_num] => 0
    [aio_worker_num] => 0
    [aio_queue_size] => 0
    [c_stack_size] => 2097152
    [coroutine_num] => 2
    [coroutine_peak_num] => 2
    [coroutine_last_cid] => 2
)
1468
Nach dem Login kopieren

Starten Sie nun den Server und Sie können einige weitere Prozesse sehen. Dann erstellen wir eine neue Testroute

$http->set(array(
    &#39;worker_num&#39; => 4,
      // &#39;worker_num&#39; => 1,单进程
));
Nach dem Login kopieren

Besuchen Sie nun noch einmal die Homepage und diese /eine Seite.

Route::get(&#39;/a&#39;, function () {
    echo Swoole\Coroutine::getCid(), "<br/>";
    print_r(Swoole\Coroutine::stats());
    echo "<br/>";
    echo getmypid(), "<br/>";
});
Nach dem Login kopieren

Nein, ihre Prozess-IDs sind auch unterschiedlich, wenn keine Blockierung vorliegt, wird der Prozess zuerst umgeschaltet. Wenn alle Prozesse blockiert sind, werden Coroutinen in einer Schleife für die prozessinterne Verarbeitung erstellt.

Das obige ist der detaillierte Inhalt vonVersuchen Sie, die Laravel-Version in die Swoole-Version zu ändern. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Warum tritt bei der Installation einer Erweiterung mit PECL in einer Docker -Umgebung ein Fehler auf? Wie löst ich es? Warum tritt bei der Installation einer Erweiterung mit PECL in einer Docker -Umgebung ein Fehler auf? Wie löst ich es? Apr 01, 2025 pm 03:06 PM

Ursachen und Lösungen für Fehler Bei der Verwendung von PECL zur Installation von Erweiterungen in der Docker -Umgebung, wenn die Docker -Umgebung verwendet wird, begegnen wir häufig auf einige Kopfschmerzen ...

Wie bekomme ich den Rückgabecode, wenn das Senden von E -Mails in Laravel fehlschlägt? Wie bekomme ich den Rückgabecode, wenn das Senden von E -Mails in Laravel fehlschlägt? Apr 01, 2025 pm 02:45 PM

Methode zum Abholen des Rücksendecode, wenn das Senden von Laravel -E -Mails fehlschlägt. Wenn Sie Laravel zur Entwicklung von Anwendungen verwenden, stellen Sie häufig Situationen auf, in denen Sie Überprüfungscodes senden müssen. Und in Wirklichkeit ...

Laravel -Zeitplanaufgabe wird nicht ausgeführt: Was soll ich tun, wenn die Aufgabe nicht nach Zeitplan ausgeführt wird: Befehl ausführen? Laravel -Zeitplanaufgabe wird nicht ausgeführt: Was soll ich tun, wenn die Aufgabe nicht nach Zeitplan ausgeführt wird: Befehl ausführen? Mar 31, 2025 pm 11:24 PM

Laravel -Zeitplan -Aufgabe Ausführen nicht reagierende Fehlerbehebung Bei Verwendung der Zeitplanung von Laravel -Zeitplänen werden viele Entwickler auf dieses Problem stoßen: Zeitplan: Run ...

Wie kann man in Laravel mit der Situation umgehen, in der Überprüfungscodes nicht per E -Mail gesendet werden? Wie kann man in Laravel mit der Situation umgehen, in der Überprüfungscodes nicht per E -Mail gesendet werden? Mar 31, 2025 pm 11:48 PM

Die Methode zum Umgang mit Laravels E -Mail -Versagen zum Senden von Verifizierungscode besteht darin, Laravel zu verwenden ...

So implementieren Sie die benutzerdefinierte Tabellenfunktion des Klickens, um Daten im DCAT -Administrator hinzuzufügen? So implementieren Sie die benutzerdefinierte Tabellenfunktion des Klickens, um Daten im DCAT -Administrator hinzuzufügen? Apr 01, 2025 am 07:09 AM

So implementieren Sie die Tabellenfunktion von benutzerdefiniertem Klicken, um Daten in dcatadmin (laravel-admin) hinzuzufügen, wenn Sie DCAT verwenden ...

Von PHP zu gehen oder Frontend? Die Vorschläge und Verwirrungen der Realität von erfahrenen Menschen Von PHP zu gehen oder Frontend? Die Vorschläge und Verwirrungen der Realität von erfahrenen Menschen Apr 01, 2025 pm 02:12 PM

Verwirrung und die Ursache, kürzlich aus PHP zu wählen, erfuhr versehentlich das Gehalt von Kollegen in anderen Positionen wie Android und eingebettet C in der Firma und stellte fest, dass sie mehr sind ...

Laravel Redis -Verbindungsfreigabe: Warum wirkt sich die Auswahlmethode auf andere Verbindungen aus? Laravel Redis -Verbindungsfreigabe: Warum wirkt sich die Auswahlmethode auf andere Verbindungen aus? Apr 01, 2025 am 07:45 AM

Die Auswirkungen des Austauschs von Redis -Verbindungen im Laravel -Framework und der Auswahl von Methoden bei Verwendung von Laravel -Framework und Redis können Entwickler auf ein Problem stoßen: Durch Konfiguration ...

Laravel Multi-Tenant-Erweiterungsstanz/Mietverhältnis: Wie passen Sie die Host-Adresse einer Mieterdatenbankverbindung an? Laravel Multi-Tenant-Erweiterungsstanz/Mietverhältnis: Wie passen Sie die Host-Adresse einer Mieterdatenbankverbindung an? Apr 01, 2025 am 09:09 AM

Benutzerdefinierte Mieterdatenbankverbindung in Laravel Multi-Tenant-Erweiterungspaket Stanz/Mietverhältnis beim Erstellen von Multi-Mandanten-Anwendungen mit Laravel Multi-Tenant-Erweiterungspaket Stanz/Mietverhältnis, ...

See all articles