leocavalcante / siler

⚡ Flat-files and plain-old PHP functions rockin'on as a set of general purpose high-level abstractions.
https://siler.leocavalcante.dev
MIT License
1.12k stars 90 forks source link

Question about Swoole and Container for parallel requests #632

Open yoh opened 3 years ago

yoh commented 3 years ago

Hi @leocavalcante ! I'm happy with Siler on PHP-FPM and I try to use it with Swoole now :)

I have probably a silly question about the mix of Siler Swoole and the Siler Container :

When parallel requests income (req A and req B), are we sure that there is no conflict on Container\get(SWOOLE_HTTP_REQUEST) ? I don't find doc about this on swoole website... How to store informations by request (logged user, config, etc.) and be sure there is no data leak between parallel (and/or one after the other) requests ?

Thanks !

leocavalcante commented 3 years ago

Hi @yoh Good question BTW, actually I'm not sure how it will behave, never thought about this before. I will try to make some tests. Thanks for bringing this up.

yoh commented 3 years ago

Hi @leocavalcante , thanks for the reply !

I use Siler v1.7.8 and Swoole v4.6.5 I made a simple route test (code below) :

<?php declare(strict_types=1);

require_once 'vendor/autoload.php';

use Siler\Swoole;
use Siler\Route;

$handler = function ($req, $res) {
    Route\get('/random', function (array $params) {
        $random = bin2hex(random_bytes(8));
        $req = Swoole\request();
        $req->random = $random;

        \Swoole\Coroutine\System::sleep(2);
        $req = Swoole\request();
        $code = $req->random === $random ? 200 : 500;

        return Swoole\json([
            'random' => $random,
            'req_random' => $req->random,
            'code' => $code,
        ], $code);
    });

    // None of the above short-circuited the response with Swoole\emit().
    Swoole\emit('Not found', 404);
};

Swoole\http($handler)->start();

When I call my route one by one, it's OK :

{
"random": "3dbbfb5d231e87ab",
"req_random": "3dbbfb5d231e87ab",
"code": 200
}

When I launch wrk and call my route at the same time, it's not OK : wrk -t4 -c100 -d5s http://0.0.0.0:9501/random

{
"random": "6cd213e83b72710a",
"req_random": "b6dbdc5b74d6a8ab",
"code": 500
}

After wrk terminate, when I call my route, it's OK.

I think using Swoole\request() is currently dangerous. What do you think about that ?