我正在对某些查询进行一些sql缓存。我正在使用CakePHP,因此查询条件在数组中:
array (
0 =>
array (
0 => 'Tutorial.id IN ( SELECT tutorial_id FROM classifications WHERE classifications.product_id = 1 ) ',
),
1 =>
array (
'Tutorial.status_id ' =>
array (
0 => 4,
1 => 7,
),
),
'OR' =>
array (
'Tutorial.user_id' => '40',
),
);
我主要是在寻找product_id,但是还有一些其他可能的条件,所以我想将数组减少到校验和并将其附加到缓存文件的名称。这样我就有了tutorials_by_classification-413a86af之类的东西,而且我不需要通过数组来选择。
我已经看到了在php.net in the comments上破坏mutli-d数组的功能,但我想知道是否有更简单的方法来实现我的目标。
答案 0 :(得分:15)
serialize
和md5
怎么样? serialize
创建数组的字符串表示形式; md5
创建了它的哈希值。
示例:
$query = array (
0 =>
array (
0 => 'Tutorial.id IN ( SELECT tutorial_id FROM classifications WHERE classifications.product_id = 1 ) ',
),
1 =>
array (
'Tutorial.status_id ' =>
array (
0 => 4,
1 => 7,
),
),
'OR' =>
array (
'Tutorial.user_id' => '40',
),
);
$query_string = serialize($query);
$hash = md5($query_string);
echo $query_string, "\n\n\n", $hash, "\n";
/*
a:3:{i:0;a:1:{i:0;s:96:"Tutorial.id IN ( SELECT tutorial_id FROM classifications WHERE classifications.product_id = 1 ) ";}i:1;a:1:{s:19:"Tutorial.status_id ";a:2:{i:0;i:4;i:1;i:7;}}s:2:"OR";a:1:{s:16:"Tutorial.user_id";s:2:"40";}}
a5cb59f0ee259961e426c7ce9b7b8f32
*/
答案 1 :(得分:11)
我会这样做:
$checksum = md5(json_encode($array));
json_encode比序列化略快,但是你失去了序列化的一些好处。但是,对于你正在做的事情,这并不重要。