use*_*243 5 php memory serialization
有没有办法使用unserialize内存/大小限制?
目前我们有:
$data = unserialize($_SESSION['visits']);
Run Code Online (Sandbox Code Playgroud)
我们偶尔会得到:
PHP Fatal error: Allowed memory size of 134217728 bytes in the Unknown on line 0 (尝试分配 17645568 字节)
当访问者在短时间内进行了大量访问时(会话值存储有关访问的每个页面的信息)。
如果 的长度$_SESSION['visits']超过一百万个字符,则会导致问题,因此我可以对此进行简单检查,但是否有比这更好的解决方案:
if(strlen($_SESSION['visits']) <= 1000000) {
$data = unserialize($_SESSION['visits']);
} else {
$data = array();
}
Run Code Online (Sandbox Code Playgroud)
我认为try catch可能表现得更好,但没有被抓住:
try{
$data = unserialize($_SESSION['vists']);
} catch(\Exception $exception){
error_log('Caught memory limit');
}
Run Code Online (Sandbox Code Playgroud)
这个问题的答案不是增加内存大小。
有两种选择:
这可能会因内存限制错误而失败,并且可能仅返回您感兴趣的数据。
如何?
$argvexec()为了解决问题要求,您可以:
就像https://github.com/xKerman/restricted-unserialize一样,它允许:
上述两个选项可以满足您的要求。然而,我强烈的建议是将会话/访问数据存储在数据库中,然后仅存储它们的唯一 ID。