本文實(shí)例講述了PHP實(shí)現(xiàn)的Cookies操作類及其用法,分享給大家供大家參考。具體分析如下:
一、功能:
1.保存,讀取,更新,清除cookies數(shù)據(jù)。
2.可設(shè)置前綴。
3.強(qiáng)制超時(shí)控制。
4.cookies數(shù)據(jù)可以是字符串,數(shù)組,對(duì)象等。
二、用法:
Cookies.class.php類文件如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
|
<?php /** Cookies class 保存,讀取,更新,清除cookies數(shù)據(jù)。可設(shè)置前綴。強(qiáng)制超時(shí)。數(shù)據(jù)可以是字符串,數(shù)組,對(duì)象等。 * Date: 2013-12-22 * Author: fdipzone * Ver: 1.0 * * Func: * public set 設(shè)置cookie * public get 讀取cookie * public update 更新cookie * public clear 清除cookie * public setPrefix 設(shè)置前綴 * public setExpire 設(shè)置過(guò)期時(shí)間 * private authcode 加密/解密 * private pack 將數(shù)據(jù)打包 * private unpack 將數(shù)據(jù)解包 * private getName 獲取cookie name,增加prefix處理 */ class Cookies{ // class start private $_prefix = '' ; // cookie prefix private $_securekey = 'ekOt4_Ut0f3XE-fJcpBvRFrg506jpcuJeixezgPNyALm' ; // encrypt key private $_expire = 3600; // default expire /** 初始化 * @param String $prefix cookie prefix * @param int $expire 過(guò)期時(shí)間 * @param String $securekey cookie secure key */ public function __construct( $prefix = '' , $expire =0, $securekey = '' ){ if ( is_string ( $prefix ) && $prefix != '' ){ $this ->_prefix = $prefix ; } if ( is_numeric ( $expire ) && $expire >0){ $this ->_expire = $expire ; } if ( is_string ( $securekey ) && $securekey != '' ){ $this ->_securekey = $securekey ; } } /** 設(shè)置cookie * @param String $name cookie name * @param mixed $value cookie value 可以是字符串,數(shù)組,對(duì)象等 * @param int $expire 過(guò)期時(shí)間 */ public function set( $name , $value , $expire =0){ $cookie_name = $this ->getName( $name ); $cookie_expire = time() + ( $expire ? $expire : $this ->_expire); $cookie_value = $this ->pack( $value , $cookie_expire ); $cookie_value = $this ->authcode( $cookie_value , 'ENCODE' , $this ->_securekey); if ( $cookie_name && $cookie_value && $cookie_expire ){ setcookie( $cookie_name , $cookie_value , $cookie_expire ); } } /** 讀取cookie * @param String $name cookie name * @return mixed cookie value */ public function get( $name ){ $cookie_name = $this ->getName( $name ); if (isset( $_COOKIE [ $cookie_name ])){ $cookie_value = $this ->authcode( $_COOKIE [ $cookie_name ], 'DECODE' , $this ->_securekey); $cookie_value = $this ->unpack( $cookie_value ); return isset( $cookie_value [0])? $cookie_value [0] : null; } else { return null; } } /** 更新cookie,只更新內(nèi)容,如需要更新過(guò)期時(shí)間請(qǐng)使用set方法 * @param String $name cookie name * @param mixed $value cookie value * @return boolean */ public function update( $name , $value ){ $cookie_name = $this ->getName( $name ); if (isset( $_COOKIE [ $cookie_name ])){ $old_cookie_value = $this ->authcode( $_COOKIE [ $cookie_name ], 'DECODE' , $this ->_securekey); $old_cookie_value = $this ->unpack( $old_cookie_value ); if (isset( $old_cookie_value [1]) && $old_cookie_vlaue [1]>0){ // 獲取之前的過(guò)期時(shí)間 $cookie_expire = $old_cookie_value [1]; // 更新數(shù)據(jù) $cookie_value = $this ->pack( $value , $cookie_expire ); $cookie_value = $this ->authcode( $cookie_value , 'ENCODE' , $this ->_securekey); if ( $cookie_name && $cookie_value && $cookie_expire ){ setcookie( $cookie_name , $cookie_value , $cookie_expire ); return true; } } } return false; } /** 清除cookie * @param String $name cookie name */ public function clear( $name ){ $cookie_name = $this ->getName( $name ); setcookie( $cookie_name ); } /** 設(shè)置前綴 * @param String $prefix cookie prefix */ public function setPrefix( $prefix ){ if ( is_string ( $prefix ) && $prefix != '' ){ $this ->_prefix = $prefix ; } } /** 設(shè)置過(guò)期時(shí)間 * @param int $expire cookie expire */ public function setExpire( $expire ){ if ( is_numeric ( $expire ) && $expire >0){ $this ->_expire = $expire ; } } /** 獲取cookie name * @param String $name * @return String */ private function getName( $name ){ return $this ->_prefix? $this ->_prefix. '_' . $name : $name ; } /** pack * @param Mixed $data 數(shù)據(jù) * @param int $expire 過(guò)期時(shí)間 用于判斷 * @return */ private function pack( $data , $expire ){ if ( $data === '' ){ return '' ; } $cookie_data = array (); $cookie_data [ 'value' ] = $data ; $cookie_data [ 'expire' ] = $expire ; return json_encode( $cookie_data ); } /** unpack * @param Mixed $data 數(shù)據(jù) * @return array(數(shù)據(jù),過(guò)期時(shí)間) */ private function unpack( $data ){ if ( $data === '' ){ return array ( '' , 0); } $cookie_data = json_decode( $data , true); if (isset( $cookie_data [ 'value' ]) && isset( $cookie_data [ 'expire' ])){ if (time()< $cookie_data [ 'expire' ]){ // 未過(guò)期 return array ( $cookie_data [ 'value' ], $cookie_data [ 'expire' ]); } } return array ( '' , 0); } /** 加密/解密數(shù)據(jù) * @param String $str 原文或密文 * @param String $operation ENCODE or DECODE * @return String 根據(jù)設(shè)置返回明文活密文 */ private function authcode( $string , $operation = 'DECODE' ){ $ckey_length = 4; // 隨機(jī)密鑰長(zhǎng)度 取值 0-32; $key = $this ->_securekey; $key = md5( $key ); $keya = md5( substr ( $key , 0, 16)); $keyb = md5( substr ( $key , 16, 16)); $keyc = $ckey_length ? ( $operation == 'DECODE' ? substr ( $string , 0, $ckey_length ): substr (md5(microtime()), - $ckey_length )) : '' ; $cryptkey = $keya .md5( $keya . $keyc ); $key_length = strlen ( $cryptkey ); $string = $operation == 'DECODE' ? base64_decode ( substr ( $string , $ckey_length )) : sprintf( '%010d' , 0). substr (md5( $string . $keyb ), 0, 16). $string ; $string_length = strlen ( $string ); $result = '' ; $box = range(0, 255); $rndkey = array (); for ( $i = 0; $i <= 255; $i ++) { $rndkey [ $i ] = ord( $cryptkey [ $i % $key_length ]); } for ( $j = $i = 0; $i < 256; $i ++) { $j = ( $j + $box [ $i ] + $rndkey [ $i ]) % 256; $tmp = $box [ $i ]; $box [ $i ] = $box [ $j ]; $box [ $j ] = $tmp ; } for ( $a = $j = $i = 0; $i < $string_length ; $i ++) { $a = ( $a + 1) % 256; $j = ( $j + $box [ $a ]) % 256; $tmp = $box [ $a ]; $box [ $a ] = $box [ $j ]; $box [ $j ] = $tmp ; $result .= chr (ord( $string [ $i ]) ^ ( $box [( $box [ $a ] + $box [ $j ]) % 256])); } if ( $operation == 'DECODE' ) { if (( substr ( $result , 0, 10) == 0 || substr ( $result , 0, 10) - time() > 0) && substr ( $result , 10, 16) == substr (md5( substr ( $result , 26). $keyb ), 0, 16)) { return substr ( $result , 26); } else { return '' ; } } else { return $keyc . str_replace ( '=' , '' , base64_encode ( $result )); } } } // class end ?> |
demo.php示例程序如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
<?php require 'Cookies.class.php' ; $type = isset( $_GET [ 'type' ])? strtolower ( $_GET [ 'type' ]) : '' ; if (!in_array( $type , array ( 'set' , 'get' , 'update' , 'clear' ))){ exit ( 'type not exists' ); } $obj = new Cookies( 'member' , 10); // obj switch ( $type ){ case 'set' : // 設(shè)置 $data = array ( 'name' => 'fdipzone' , 'gender' => 'male' ); $obj ->set( 'me' , $data , 5); echo 'set cookies' ; break ; case 'get' : // 讀取 $result = $obj ->get( 'me' ); echo '<pre>' ; print_r( $result ); echo '</pre>' ; echo 'get cookies' ; break ; case 'update' : // 更新 $data = array ( 'name' => 'angelababy' , 'gender' => 'female' ); $flag = $obj ->update( 'me' , $data ); if ( $flag ){ echo 'update cookies success' ; } else { echo 'update cookies false' ; } break ; case 'clear' : // 清除 $obj ->clear( 'me' ); echo 'clear cookies' ; break ; } ?> |
本文完整實(shí)例源碼點(diǎn)擊此處本站下載。
希望本文所述對(duì)大家的PHP程序設(shè)計(jì)有所幫助。