我有一个类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();
?>
全局类是什么东西?我只知道static和global定义的数组,就是常驻内存的,可以无限增加。
无论用什么方法都能去修改数组,不需要你说的这个什么类。可以在项目的任何地址直接修改数组
可用容器+单例实现。至于定时更新数据的问题,可以写个刷新单例 data 的接口,再定时请求接口刷数据
定个static就完事啦,哪有这么复杂
如果确实数据量比较大,考虑是否经常读写。使用文件缓存或者redis缓存来处理。有精力可以将其中数据根据一定条件:如常用程度,数据关联度等进行分组为多个缓存key,这样就不会占用程序本身的内存