首先我们来一看在传统的PHP-FPM的工作模式下面
<?php
class T{
public static $list=[];
}
$num=time();
T::$list[]=$num;
var_dump(T::$list);
实际运行时什么情况呢?
每次请求完毕,FPM都会将$list的变量进行释放,重新赋值
那么在常驻内存swoole框架里面还是这种现象吗?我们一起来看一哈实际例子,代码如下
class T{
public static $list=[];
}
$serv=new swoole_http_server("0.0.0.0",8888);
$serv->set([
"work_num"=>2
]);
$serv->on('request', function ($request, $response ) use($serv){
$num=time();
$response->end("<h1>Hello Swoole. #".$num."</h1>");
var_dump(T::$list);
T::$list[]=$num;
var_dump(T::$list);
});
$serv->start();
首先启动服务器
我们在浏览器中请求一哈这个服务器地址
http://192.168.80.129:8888/
我已经请求了好几次了,来一看哈服务器后端打印出什么数据了
这里的$list变量并没有像FPM中的那样进行释放,这既是swoole中的优点,可以方便我们存放一些全局变量数据,也是swoole的缺点,如果没有注意到,很容易编写出来的程序出现内存泄漏。
为此,swoole官方为我们提供了一个max_request的配置,swoole会帮我们销毁进程初始化全局变量,我们一起来看一下
<?php
class T{
public static $list=[];
}
$serv=new swoole_http_server("0.0.0.0",8888);
$serv->set([
"work_num"=>2,
"max_request"=>5
]);
$serv->on('request', function ($request, $response ) use($serv){
$num=time();
$response->end("<h1>Hello Swoole. #".$num."</h1>");
var_dump(T::$list);
T::$list[]=$num;
var_dump(T::$list);
});
$serv->start();
我们来看一哈测试结果:
果然swoole帮我们清掉了这个全局变量