我在本机上使用swoole+yii2 bacic 模板测试。 fpm qps在300+,swoole可以到500+。但是有个问题是压测时swoole把整整4GB的空闲内存都吃光了,很明显这是worker执行的时候出现了内存泄露,因为结束之后内存并没有降下来,杀死进程后才释放了对应的内存。下面是我的代码,请问有什么问题?为什么在请求结束时没有释放对应的内存,还是说要手动清理?
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');
require(__DIR__ . '/../vendor/autoload.php');
require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php');
class AppServer{
public $httpServer;
public $config;
public function __construct(){
$this->config= require(__DIR__ . '/../config/web.php');
$this->httpServer=new swoole_http_server("0.0.0.0", 9501);
$this->httpServer->set(
array(
'worker_num' => 4,
'daemonize' => false,
'max_request' => 10000,
'dispatch_mode' => 1
)
);
$this->httpServer->on('workerStart',[$this,'onWorkerStart']);
$this->httpServer->on('request', function ($request, $response) {
if( isset($request->server) ) {
foreach ($request->server as $key => $value) {
$_SERVER[ strtoupper($key) ] = $value;
}
unset($_SERVER['PHP_SELF']);
}
if( isset($request->get) ) {
foreach ($request->get as $key => $value) {
$_GET[ $key ] = $value;
}
}
if( isset($request->post) ) {
foreach ($request->post as $key => $value) {
$_POST[ $key ] = $value;
}
}
ob_start();
//实例化yii对象
try {
$application = new yii\web\Application($this->config);
$application->request->setBaseUrl('');
//替换header
if(isset($request->header)){
foreach($request->header as $key =>$value){
$application->request->getHeaders()->set($key,$value);
}
}
$application->run();
$response->status($application->response->getStatusCode());
$headers=$application->response->getHeaders();
foreach ($headers as $name => $values) {
$name = str_replace(' ', '-', ucwords(str_replace('-', ' ', $name)));
// set replace for first occurrence of header but false afterwards to allow multiple
foreach ($values as $value) {
$response->header($name,$value);
}
}
} catch (Exception $e) {
var_dump($e);
}
$result = ob_get_contents();
ob_end_clean();
$response->end($result);
});
$this->httpServer->start();
}
public function onWorkerStart(){
}
}
new AppServer();