关于webman使用全局类的一些问题

dgkerry

问题描述

我有一个类order,这个类由于data变量占用内存比较大,所以我做成全局类,如果通过workerman实现,则如代码【2】所示,先创建一个全局类,然后在onWorkerStart中更新一次data数据(执行upBaseData方法),然后定时每30秒更新一次data数据(执行upBaseData方法),这样我就可以在onMessage中通过global $golbal_order;方式引入,在任意地方使用这个全局类
现在使用了webman,之前也问过一些关于webman的问题(https://www.workerman.net/q/13885)

问题:要是我用webman来实现以上要求,请问如何写呢?

<?php
use app\service;
class order{
    protected $data;
    public function __construct(){

    }
    public function upBaseData(){
        //*这里会更新下单所用到的基础数据,这个数据是通过请求外部连接来获取到,数据比较大 */
        //*代码省略 */
        //请求到后最终储存在这个变量上$this->data
        return true;
    }
    public function add(){
        //这里进行下单操作
    }
    public function edit(){
        //这里进行编辑订单操作
    }
    public function pay(){
        //这里进行支付操作
    }
}

【2】workerman:
use Workerman\Worker;
use Workerman\Timer;
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
use app\service\order;
require_once __DIR__ . '/vendor/autoload.php';
$http_worker = new Worker("http://0.0.0.0:2345");
$http_worker->count = 4;
$golbal_order = new order();//这里创建一个全局order类
$http_worker->onWorkerStart = function(Worker $task){
    global $golbal_order;
    $golbal_order->upBaseData();
    //定时刷新数据
    Timer::add(30, function()
    {
        $golbal_order->upBaseData();
    });
}
$http_worker->onMessage = function(TcpConnection $connection, Request $request)
{
    global $golbal_order;
    $golbal_order->add();
    //忽略剩余业务代码
    $connection->send('ok');
};
Worker::runAll();
?>
207 4 0
4个回答

gddd

全局类是什么东西?我只知道static和global定义的数组,就是常驻内存的,可以无限增加。
无论用什么方法都能去修改数组,不需要你说的这个什么类。可以在项目的任何地址直接修改数组

  • 暂无评论
oliver.

可用容器+单例实现。至于定时更新数据的问题,可以写个刷新单例 data 的接口,再定时请求接口刷数据

  • 暂无评论
shiroi

定个static就完事啦,哪有这么复杂

  • 暂无评论

如果确实数据量比较大,考虑是否经常读写。使用文件缓存或者redis缓存来处理。有精力可以将其中数据根据一定条件:如常用程度,数据关联度等进行分组为多个缓存key,这样就不会占用程序本身的内存

  • 暂无评论
×
🔝