[已解决] 基于workerman5.0 的 改造 PHP+HTML的混合开发,Session处理方案

yidaodao

php+html 转为 基于workerman5.0的改造

代码举例:
2 个文件,server.php 如下

<?php

require_once __DIR__ . '/init.php';

require_once __DIR__ . '/vendor/autoload.php';

use Workerman\Worker;
use Workerman\Protocols\Http\Session\FileSessionHandler;
use Workerman\Connection\TcpConnection as ConTcpConnection;
use Workerman\Protocols\Http\Request as HttpRequest;
use Workerman\Protocols\Http\Response as HttpResponse;

// 设置 Workerman 日志文件路径
Worker::$logFile = DIR_LOG . '/workerman.log';

// 设置session文件存储位置
FileSessionHandler::sessionSavePath(DIR_SESSION);

$w = new Worker("http://0.0.0.0:2345");

$w->count = 4;

// 初始化全局对象(常驻内存)
$w->onWorkerStart = function($worker)
{
    //require_once __DIR__ . '/kii.php';
    //$worker->myObject = new MyClass();

    /**
     * 初始化容器,并设置到子进程
     */
    $container = new Container();
    $container->set('view', new Tmep());

    $worker->box = $container;

};

$w->onMessage = function(ConTcpConnection $tcp_connection, HttpRequest $http_request) use ($w)
{
    // 初始化响应对象
    $http_response = new HttpResponse();

    try
    {
        // 解析路径部分
        $path = parse_url($http_request->uri(), PHP_URL_PATH);

        // 构建文件路径
        $baseDir = __DIR__.'/www';
        $filePath = $baseDir . $path . '.php';

        // 检查文件是否存在
        if (file_exists($filePath))
        {
            $context['ggx'] = $w->box;  //对象
            $context['ggx']['request']  = $http_request;
            $context['ggx']['response'] = $http_response;

            // 使用匿名函数,将容器注入到页面作用域
            $get_render = function () use ($filePath,$context) {
                extract($context, EXTR_SKIP);
                include $filePath;
            };

            // 加载并执行文件
            ob_start();
            $get_render();
            $responseContent = ob_get_clean();

            $http_response->withBody($responseContent);
        } else {
            // 文件不存在,返回404错误
            $http_response->withStatus(404);
            $http_response->withBody('403 Not Found');
        }

        // 向浏览器发送响应
        $tcp_connection->send($http_response);

    }catch (CoreException $fpmEx){
        //....
        $tcp_connection->send($http_response);
    }

};

// 运行worker
Worker::runAll();

2,假设目前是 业务时login, 对应请求域名是 www.aa.com/login
login.php 如下:

<?php 
try
{
    //实例
    if (isset($ggx))
    {
        /**
         * @var object $view
         * @var Workerman\Protocols\Http\Request $request
         */
        $view = $ggx->view;
        $request  = $ggx->request;
        $session  = $request->session();
        $response = $ggx->response;

        //业务相关
        $cookie_language = $request->cookie('language') ?? 'zh-cn';

        $userId =  $session->get('user_id');
        $session->set('user_key', 1001);
        $session->save();
    }
}catch (CoreException $ex){
    echo '.....';
}

/**
 * ***************************
 */

// 定义要传递给模板的数据
$data = [
    'errors' => ['Invalid username or password'.$ss],
    'time' => date('Y-m-d H:i:s'),
];

// 渲染模板
$responseContent = $view->render($data, '/www/login');

echo $responseContent;

3, 我希望session 在 login.php 里面 统一处理 如何处理比较好

以上就属于 正常处理 没有问题

180 1 0
1个回答

10bang

为什么不直接用webman?

×
🔝