mirror of https://github.com/MISP/MISP
fix: [internal] PHP memory leak
parent
5fa6b135d4
commit
715ca6d1e2
|
@ -0,0 +1,33 @@
|
|||
<?php
|
||||
class BetterCakeEventManager extends CakeEventManager
|
||||
{
|
||||
/**
|
||||
* This method is similar as original dispatch, but do not return newly created event. With returning event, there is
|
||||
* big memory leak in PHP at least for PHP version 7.4.19.
|
||||
* @param CakeEvent $event
|
||||
*/
|
||||
public function dispatch($event)
|
||||
{
|
||||
$listeners = $this->listeners($event->name());
|
||||
if (empty($listeners)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
foreach ($listeners as $listener) {
|
||||
if ($event->isStopped()) {
|
||||
break;
|
||||
}
|
||||
if ($listener['passParams'] === true) {
|
||||
$result = call_user_func_array($listener['callable'], $event->data);
|
||||
} else {
|
||||
$result = $listener['callable']($event);
|
||||
}
|
||||
if ($result === false) {
|
||||
$event->stopPropagation();
|
||||
}
|
||||
if ($result !== null) {
|
||||
$event->result = $result;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -25,6 +25,7 @@ App::uses('LogableBehavior', 'Assets.models/behaviors');
|
|||
App::uses('RandomTool', 'Tools');
|
||||
App::uses('FileAccessTool', 'Tools');
|
||||
App::uses('JsonTool', 'Tools');
|
||||
App::uses('BetterCakeEventManager', 'Tools');
|
||||
|
||||
class AppModel extends Model
|
||||
{
|
||||
|
@ -3311,4 +3312,19 @@ class AppModel extends Model
|
|||
$dataSourceName = $dataSource->config['datasource'];
|
||||
return $dataSourceName === 'Database/Mysql' || $dataSourceName === 'Database/MysqlObserver' || $dataSourceName === 'Database/MysqlExtended' || $dataSource instanceof Mysql;
|
||||
}
|
||||
|
||||
/**
|
||||
* Use different CakeEventManager to fix memory leak
|
||||
* @return CakeEventManager
|
||||
*/
|
||||
public function getEventManager()
|
||||
{
|
||||
if (empty($this->_eventManager)) {
|
||||
$this->_eventManager = new BetterCakeEventManager();
|
||||
$this->_eventManager->attach($this->Behaviors);
|
||||
$this->_eventManager->attach($this);
|
||||
}
|
||||
|
||||
return $this->_eventManager;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue