laravel的octane在启动时,相关`request`回调函数的疑问?

1. 运行环境

docker / linux
Linux: alpine3.15.0

1). 当前使用的 Laravel 版本?

"name": "laravel/framework",
"version": "v8.81.0", 

2). 当前使用的 php/php-fpm 版本?

PHP 版本:8.1

3). 当前系统

Linux: alpine3.15.0

4). 业务环境

5). 相关软件版本

"laravel/octane": "^1.2"

2. 问题描述?

以下代码$server->on('request'.....)闭包函数的$workerState参数继承自父作用域,可父作用域中没有设置workerState->worker , 那么函数体内怎么可以调用workerState->worker。

require_once __DIR__.'/WorkerState.php';

$workerState = new WorkerState;

$workerState->cacheTable = require __DIR__.'/createSwooleCacheTable.php';

$workerState->timerTable = $timerTable;

$workerState->tables = require __DIR__.'/createSwooleTables.php';

$server->on('workerstart', fn (Server $server, $workerId) =>

    (fn ($basePath) => (new OnWorkerStart(

        new SwooleExtension, $basePath, $serverState, $workerState

    ))($server, $workerId))($bootstrap($serverState))

);

$server->on('request', function ($request, $response) use ($server, $workerState, $serverState) {

$workerState->lastRequestTime = microtime(true);

if ($workerState->timerTable) {

    $workerState->timerTable->set($workerState->workerId, [

        'worker_pid' => $workerState->workerPid,

        'time' => time(),

    ]);

}

$workerState->worker->handle(...$workerState->client->marshalRequest(new RequestContext([

    'swooleRequest' => $request,

    'swooleResponse' => $response,

    'publicPath' => $serverState['publicPath'],

    'octaneConfig' => $serverState['octaneConfig'],

])));

if ($workerState->timerTable) {

    $workerState->timerTable->del($workerState->workerId);

}

});

3. 您期望得到的结果?

以上代码`$server->on('request'.....)`闭包函数的$workerState参数继承自父作用域,可父作用域中没有设置workerState->worker ,  那么函数体内怎么可以调用workerState->worker。

4. 您实际得到的结果?

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 4

鼠标点一下就可以看到

file

在 workerstart 时,里面的 OnWorkerStart 被调用时就设置了。

2年前 评论
after_school (楼主) 2年前
Rache1 (作者) 2年前

多谢带出是PHP对象引用传递这个点,$workerState->work怎么来的疑问解决了。

紧接着,后续程序的逻辑我的猜想是这样的——根据swoole文档,workerstart是异步的,每当新的worker进程或task进程被创建就会执行workerstart函数.

那么, $workerState就会是最后一个,因此octane中也应该一样才对。

但有趣的事情来了,为了证明猜想,进行了打印输出。 借用swoole例子,图1中的workerId,在workerstart中赋给了$a->wid,在打印结果里是有序的(0-N的顺序),证明了,workerstart是异步执行的,且函数中引用的对象,即:use($a),将会是最后赋值的那一个$a->wid=最后的workerId。 此处抛个问题,如果workerId永远是最后那一个了,那怎么实现的多任务?

当请求服务器的时候,request事件会被执行,输出结果: $a->wid是最后一次workerstart里的$a->wid对象。 但是在octane中(图2)不是这样的逻辑(所以我的疑问一直是octane中的$workerState到底是哪个值)



图1

file

图2

file

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!