Rumah  >  Artikel  >  rangka kerja php  >  Cuba cara menukar Laravel kepada versi Swoole

Cuba cara menukar Laravel kepada versi Swoole

藏色散人
藏色散人ke hadapan
2022-12-02 16:29:021200semak imbas

Artikel ini akan memberi anda pengetahuan yang berkaitan tentang Laravel dan Swoole Kandungan utama adalah untuk mengajar anda cara menukar Laravel kepada versi Swoole (cuba belajar, tidak disyorkan untuk menukar projek sedia ada). lihat bersama-sama. Saya harap ia akan berguna kepada semua orang.

Kata Pengantar

Tidak disyorkan untuk persekitaran pengeluaran

Buat projek laravel baharu

laravel new swoole-laravel

Tukar Laravel kepada versi Swoole

Buat fail swoole_server.php dalam direktori root Laravel, dan kemudian salin kod dalam public/index.php ke atas [Pembelajaran yang disyorkan: laravel Tutorial video ]

<?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);

Langkah pertama ialah memuatkan fail rangka kerja, dan ia harus dimuatkan dalam proses utama Tidak perlu sub-proses atau coroutine untuk memuatkannya berulang kali. . Oleh itu, keperluan di atas tidak perlu disentuh.

Langkah kedua ialah memulakan perkhidmatan HTTP Swoole Perkara ini telah disebut berkali-kali sebelum ini.

$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();

Adakah ini baik-baik saja? Apa kata anda mencubanya dahulu. Dalam keadaan biasa, anda mungkin tidak boleh mendapatkan sebarang input atau output Mengapa ini?

Langkah ketiga ialah menyelesaikan masalah input Sebenarnya, pembolehubah super global tidak berfungsi dalam Swoole, jadi pembolehubah seperti $_GET akan menjadi tidak sah dan objek berkaitan Permintaan dalam Laravel tidak akan dapat. mendapatkan data. Apa yang perlu dilakukan? Kami hanya mendapatkan data ini daripada parameter onRequest dan kemudian memasukkannya semula ke dalam $_GET dalam coroutine proses semasa.

$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());
    }
});

Tiga keping kod di atas menyelesaikan masalah $_SERVER, $_GET dan $_POST masing-masing. Sekarang jika anda mencuba lagi, parameter boleh diterima, tetapi mengapa output dicetak pada konsol?

Langkah keempat ialah menyelesaikan masalah output, letakkan semua output dalam bingkai ke dalam penimbal keluaran, dan kemudian gunakan Respons Swoole untuk kembali.

$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);
});

Kandungan ob_start () terakhir juga adalah apa yang telah kami pelajari sebelum ini, jadi kami tidak akan menerangkannya dengan lebih lanjut.

Semua kod

start();

Pada ketika ini, transformasi rangka kerja kami yang paling mudah selesai, mari cuba kesannya.

Jalankan

php swoole_server.php

Lawati

http://47.113.xxx.xx:9501/

Cuba kesan coroutine

Tentukan laluan dahulu. Atau kita boleh terus mengubah suai laluan lalai.

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;);
});

Sebilangan besar perkara dicetak, tetapi semuanya mesti biasa, dua yang pertama ialah output ID coroutine dan maklumat coroutine, dan kemudian kami SwooleCoroutine::sleep () selama 10 saat, dan. kemudian cetak Berikut ialah ID proses.

Kemudian kami membuka penyemak imbas dan bersedia untuk mengakses kedua-dua tab bersama-sama.

// 第一个访问的页面
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

Adakah anda melihatnya? Setiap acara onRequest sebenarnya membuka coroutine baharu untuk mengendalikan permintaan, jadi ID coroutine mereka adalah berbeza. Pada masa yang sama, permintaan kedua tidak akan menunggu sehingga 20 saat untuk kembali kerana permintaan pertama disekat. Akhir sekali, dalam status coroutine, kita juga melihat bahawa terdapat dua coroutine_nums dipaparkan dalam permintaan kedua, menunjukkan bahawa pada masa ini terdapat dua tugas pemprosesan coroutine. Pada akhirnya, proses adalah sama, semuanya mengikut proses yang sama.

Cuba kesan berbilang proses

Secara lalai, kod di atas ialah proses utama dan proses Pekerja, dan kemudian menggunakan keupayaan coroutine. Malah, kesan ini boleh membunuh kesan PHP-FPM biasa dengan serta-merta. Tetapi kita perlu menggunakan sepenuhnya prestasi mesin berbilang teras, iaitu, kita mendayakan pelbagai proses dan menggunakan mod pemprosesan berbilang proses dan berbilang coroutine yang sangat berkuasa. Cara paling mudah ialah dengan menetapkan terus bilangan pekerja proses untuk perkhidmatan HTTP.

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

Sekarang jalankan pelayan dan anda boleh melihat beberapa lagi proses. Kemudian kami mencipta laluan ujian baharu

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

Sekarang lawati halaman utama dan halaman /a ini sekali lagi.

// 首页一
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
)
1562
// 首页二
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
)
1563
// /a 页面
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
)
1564

Tidak, ID proses mereka berbeza Jika tiada sekatan, proses akan ditukar terlebih dahulu Jika semua proses disekat, coroutine akan dibuat dalam gelung untuk pemprosesan dalam proses.

Atas ialah kandungan terperinci Cuba cara menukar Laravel kepada versi Swoole. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:learnku.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam