发生了一些非常奇怪的事情,花了我一段时间来弄清楚出了什么问题但是我能够做到这一点。
所以我有一个对象
class Client implements \Serializable{
....
protected $name;
protected $email;
/**
* @var string|null
*
*/
protected $color;
....
public function serialize()
{
return serialize([
$this->id,
$this->email,
$this->name
]);
}
public function unserialize($serialized)
{
list (
$this->id,
$this->email,
$this->name
) = unserialize($serialized);
}
}
在某些时候我想将这个对象存储在会话中(使用symfony作为通知)所以在存储它之后显然我无法从$session->$client->getColor()
检索颜色所以我只是将它添加到序列化中/ unserialize像这样的方法
public function serialize()
{
return serialize([
$this->id,
$this->email,
$this->name,
$this->color
]);
}
public function unserialize($serialized)
{
list (
$this->id,
$this->email,
$this->name,
$this->color
) = unserialize($serialized);
}
}
刷新页面崩溃了php-fpm,它不会重新启动应用程序,直到我从方法中删除颜色。现在我试图注销重新添加颜色序列化/反序列化功能和sunddenly php-fpm再次崩溃!! 是什么导致了这种行为是因为会话从未重置过吗?如果是,那里到底发生了什么?
在我注销后,php-fpm没有出现错误,添加代码然后再次登录。 php-fpm错误日志为空(idk为什么),导致崩溃的代码片段正好如下
$client = $this->get('session')->get('client');
$client->getColor();
,客户端在登录后直接设置在会话中
$clients = $user->getClients();
$this->get('session')->set('client',$clients->first());
这里是来自'var_dump($ client);'的客户端在添加颜色到序列化之前和
之后看起来像前
object(\Model\Client)#226 (16) { ["id":protected]=> int(36) ["name":protected]=> string(9) "testcolor" ["email":protected]=> string(22) ["color":protected]=> NULL .... }
后
object(\Model\Client)#226 (16) { ["id":protected]=> int(36) ["name":protected]=> string(9) "testcolor" ["email":protected]=> string(22) ["color":protected]=> string(9) #000fff .... }
你可以看到颜色区域的差异。
最后一次:)错误只发生在我登录并更改了序列化函数,否则我将无法从客户端对象获取颜色,因为它没有在会话中被序列化所以它将为NULL