Sai*_*ung 8 php redis phpredis
我试图将用户的请求URL作为密钥存储,并将与该密钥对应的PHP对象存储为Redis中的值.我尝试了以下方法:
$redisClient = new Redis();
$redisClient->connect('localhost', 6379);
$redisClient->set($_SERVER['REQUEST_URI'], $this->page);
$redisTest = $redisClient->get($_SERVER['REQUEST_URI']);
var_dump($redisTest);
Run Code Online (Sandbox Code Playgroud)
但是,使用此代码时,存储在Redis中的URL键的值是类型,string其值等于"Object"而不是实际的PHP对象.有没有办法存储PHP对象而不进行序列化?
正如您在Redis数据类型中看到的,Redis仅支持以下5种数据类型:
因此,没有对象数据类型,因此您无法将对象直接存储为值.您必须先将其序列化(或者使用该json_encode函数对其进行JSON编码).
串行化是否存在直接存储对象的问题?
更新:根据您在评论中所说的内容,您可以使用此答案中指出的方法
所以你可以使用:
$xml = $simpleXmlElem->asXML();
Run Code Online (Sandbox Code Playgroud)
在序列化之前,然后unserialize()使用以下代码:
$simpleXmlElem = simplexml_load_string($xml);
Run Code Online (Sandbox Code Playgroud)
这样,您不必SimpleXmlElement直接序列化PHP内置对象,也不会出现问题.
序列化将是最直接的方法。
另一种方法是json_encode仅使用稍后重建对象所需的参数。一种方法是使用 PHP 5.4 的 JsonSerialize 接口。您需要使用 jsonSerialize 提取各种属性,然后在从 Redis 提取项目时提供将它们传递回您的类的方法。
class MyPage implements JsonSerializable
{
protected $p1;
protected $p2;
/**
* @param mixed $p1
*/
public function setP1($p1)
{
$this->p1 = $p1;
}
/**
* @param mixed $p2
*/
public function setP2($p2)
{
$this->p2 = $p2;
}
/**
* (PHP 5 >= 5.4.0)<br/>
* Specify data which should be serialized to JSON
* @link http://php.net/manual/en/jsonserializable.jsonserialize.php
* @return mixed data which can be serialized by <b>json_encode</b>,
* which is a value of any type other than a resource.
*/
public function jsonSerialize()
{
return [
'p1' => $this->p1,
'p2' => $this->p2,
];
}
}
Run Code Online (Sandbox Code Playgroud)
通过这种方式,您可以轻松地从 JSON 进行重建。您可以添加一个辅助方法来执行此操作,或者只调用设置器。
| 归档时间: |
|
| 查看次数: |
13950 次 |
| 最近记录: |