Cachify - Version 2.0.1

Version Description

  • Verbesserter Autoload-Prozess
  • Diverse Umbenennungen der Optionen
  • Cache-Neuaufbau bei geplanten Beitrgen (Cachify DB)
Download this release

Release Info

Developer sergej.mueller
Plugin Icon 128x128 Cachify
Version 2.0.1
Comparing to
See all releases

Version 2.0.1

apc/proxy.php ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ if (
3
+ extension_loaded('apc')
4
+ && ( !empty($_SERVER['PHP_SELF']) && strpos($_SERVER['PHP_SELF'], '/wp-admin/') === false )
5
+ && ( !empty($_SERVER['HTTP_ACCEPT_ENCODING']) && strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== false )
6
+ && ( $cache = apc_fetch(md5($_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']) . '.cachify') )
7
+ ) {
8
+ ini_set('zlib.output_compression', 'Off');
9
+
10
+ header('Vary: Accept-Encoding');
11
+ header('X-Powered-By: Cachify');
12
+ header('Content-Encoding: gzip');
13
+ header('Content-Length: '.strlen($cache));
14
+ header('Content-Type: text/html; charset=utf-8');
15
+
16
+ echo $cache;
17
+ exit;
18
+ }
cachify.php ADDED
@@ -0,0 +1,73 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ Plugin Name: Cachify
4
+ Description: Smarter Cache für WordPress. Reduziert die Ladezeit der Blogseiten, indem Inhalte in statischer Form abgelegt und ausgeliefert werden.
5
+ Author: Sergej M&uuml;ller
6
+ Author URI: http://wpseo.de
7
+ Plugin URI: http://cachify.de
8
+ Version: 2.0.1
9
+ */
10
+
11
+
12
+ /* Sicherheitsabfrage */
13
+ if ( !class_exists('WP') ) {
14
+ die();
15
+ }
16
+
17
+
18
+ /* Filter */
19
+ if ( ! (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) ) {
20
+ /* PHP-Check */
21
+ if ( ! function_exists('spl_autoload_register') ) {
22
+ wp_die('Cachify benötigt mindestens PHP 5.1.2');
23
+ }
24
+
25
+ /* Autoload */
26
+ spl_autoload_register('cachify_autoload');
27
+
28
+ /* Konstanten */
29
+ define('CACHIFY_FILE', __FILE__);
30
+ define('CACHIFY_BASE', plugin_basename(__FILE__));
31
+ define('CACHIFY_CACHE_DIR', WP_CONTENT_DIR. '/cache/cachify');
32
+
33
+ /* Init */
34
+ add_action(
35
+ 'plugins_loaded',
36
+ array(
37
+ 'Cachify',
38
+ 'init'
39
+ )
40
+ );
41
+
42
+ /* Install */
43
+ register_activation_hook(
44
+ __FILE__,
45
+ array(
46
+ 'Cachify',
47
+ 'install'
48
+ )
49
+ );
50
+
51
+ /* Uninstall */
52
+ register_uninstall_hook(
53
+ __FILE__,
54
+ array(
55
+ 'Cachify',
56
+ 'uninstall'
57
+ )
58
+ );
59
+ }
60
+
61
+
62
+ /* Autoload */
63
+ function cachify_autoload($class) {
64
+ if ( in_array($class, array('Cachify', 'Cachify_APC', 'Cachify_DB', 'Cachify_HDD')) ) {
65
+ require_once(
66
+ sprintf(
67
+ '%s/inc/%s.class.php',
68
+ dirname(__FILE__),
69
+ strtolower($class)
70
+ )
71
+ );
72
+ }
73
+ }
css/style.css ADDED
@@ -0,0 +1 @@
 
1
+ #icon-cachify{background:url('../img/icon32.png') no-repeat;}#cachify_sidebar_icon{width:11px;height:9px;border:0;display:inline-block;background:url(../img/icon.png) no-repeat;}#wp-admin-bar-cachify .ab-icon{position:relative;float:left;width:16px;height:16px;margin-top:6px;background:url(../img/icon16.png) no-repeat 0 -1px;}#cachify_main .table{width:460px;height:1%;margin:20px 0 0;padding:0 0 5px;overflow:hidden;border:1px solid #dfdfdf;}#cachify_main .form-table{margin:0;}#cachify_main .form-table th{width:230px;vertical-align:middle;}#cachify_main .form-table th small{color:#8f8f8f;display:block;text-shadow:none;}#cachify_main .form-table caption{width:100%;color:#8f8f8f;margin:0 0 5px;background:whiteSmoke;line-height:20px;text-shadow:1px 1px #FFF;}#cachify_main .rounded{border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;}#cachify_main input,#cachify_main select{width:172px;}#cachify_main input.small{width:50px;}#cachify_main .submit{width:460px;height:1%;overflow:hidden;}#cachify_main .help{float:right;color:#bebebe;font-size:11px;text-align:right;line-height:11px;}
css/style.dev.css ADDED
@@ -0,0 +1,93 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* @group Icon */
2
+
3
+ #icon-cachify {
4
+ background: url('../img/icon32.png') no-repeat;
5
+ }
6
+
7
+ /* @end group */
8
+
9
+
10
+ /* @group Sidebar */
11
+
12
+ #cachify_sidebar_icon {
13
+ width: 11px;
14
+ height: 9px;
15
+ border: 0;
16
+ display: inline-block;
17
+ background: url(../img/icon.png) no-repeat;
18
+ }
19
+
20
+ /* @end group */
21
+
22
+
23
+ /* @group Adminbar */
24
+
25
+ #wp-admin-bar-cachify .ab-icon {
26
+ position: relative;
27
+ float: left;
28
+ width: 16px;
29
+ height: 16px;
30
+ margin-top: 6px;
31
+ background: url(../img/icon16.png) no-repeat 0 -1px;
32
+ }
33
+
34
+ /* @end group */
35
+
36
+
37
+ /* @group GUI */
38
+
39
+ #cachify_main .table {
40
+ width: 460px;
41
+ height: 1%;
42
+ margin: 20px 0 0;
43
+ padding: 0 0 5px;
44
+ overflow: hidden;
45
+ border: 1px solid #DFDFDF;
46
+ }
47
+ #cachify_main .form-table {
48
+ margin: 0;
49
+ }
50
+ #cachify_main .form-table th {
51
+ width: 230px;
52
+ vertical-align: middle;
53
+ }
54
+ #cachify_main .form-table th small {
55
+ color: #8F8F8F;
56
+ display: block;
57
+ text-shadow: none;
58
+ }
59
+ #cachify_main .form-table caption {
60
+ width: 100%;
61
+ color: #8F8F8F;
62
+ margin: 0 0 5px;
63
+ background: whiteSmoke;
64
+ line-height: 20px;
65
+ text-shadow: 1px 1px #FFF;
66
+ }
67
+ #cachify_main .rounded {
68
+ border-radius: 3px;
69
+ -moz-border-radius: 3px;
70
+ -webkit-border-radius: 3px;
71
+ }
72
+
73
+ #cachify_main input,
74
+ #cachify_main select {
75
+ width: 172px;
76
+ }
77
+ #cachify_main input.small {
78
+ width: 50px;
79
+ }
80
+ #cachify_main .submit {
81
+ width: 460px;
82
+ height: 1%;
83
+ overflow: hidden;
84
+ }
85
+ #cachify_main .help {
86
+ float: right;
87
+ color: #bebebe;
88
+ font-size: 11px;
89
+ text-align: right;
90
+ line-height: 11px;
91
+ }
92
+
93
+ /* @end group */
img/icon.png ADDED
Binary file
img/icon16.png ADDED
Binary file
img/icon32.png ADDED
Binary file
inc/cachify.class.php ADDED
@@ -0,0 +1,1359 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+
4
+ /**
5
+ * Cachify
6
+ */
7
+
8
+ final class Cachify {
9
+
10
+
11
+ /**
12
+ * Plugin-Optionen
13
+ *
14
+ * @since 2.0
15
+ * @var array
16
+ */
17
+
18
+ private static $options;
19
+
20
+
21
+ /**
22
+ * Cache-Methode
23
+ *
24
+ * @since 2.0
25
+ * @var object
26
+ */
27
+
28
+ private static $method;
29
+
30
+
31
+ /**
32
+ * Initialisierung des Plugins
33
+ *
34
+ * @since 1.0
35
+ * @change 2.0.1
36
+ */
37
+
38
+ public static function init()
39
+ {
40
+ /* Variablen */
41
+ self::_set_vars();
42
+
43
+ /* Publish Single */
44
+ add_action(
45
+ 'publish_future_post',
46
+ array(
47
+ __CLASS__,
48
+ 'publish_post'
49
+ )
50
+ );
51
+ add_action(
52
+ 'publish_post',
53
+ array(
54
+ __CLASS__,
55
+ 'publish_post'
56
+ )
57
+ );
58
+ add_action(
59
+ 'publish_page',
60
+ array(
61
+ __CLASS__,
62
+ 'publish_page'
63
+ )
64
+ );
65
+
66
+ /* Backend */
67
+ if ( is_admin() ) {
68
+ add_action(
69
+ 'wpmu_new_blog',
70
+ array(
71
+ __CLASS__,
72
+ 'install_later'
73
+ )
74
+ );
75
+ add_action(
76
+ 'delete_blog',
77
+ array(
78
+ __CLASS__,
79
+ 'uninstall_later'
80
+ )
81
+ );
82
+
83
+ add_action(
84
+ 'admin_init',
85
+ array(
86
+ __CLASS__,
87
+ 'register_settings'
88
+ )
89
+ );
90
+ add_action(
91
+ 'admin_init',
92
+ array(
93
+ __CLASS__,
94
+ 'receive_flush'
95
+ )
96
+ );
97
+ add_action(
98
+ 'admin_menu',
99
+ array(
100
+ __CLASS__,
101
+ 'add_page'
102
+ )
103
+ );
104
+ add_action(
105
+ 'admin_print_styles',
106
+ array(
107
+ __CLASS__,
108
+ 'add_css'
109
+ )
110
+ );
111
+
112
+ add_action(
113
+ 'transition_comment_status',
114
+ array(
115
+ __CLASS__,
116
+ 'touch_comment'
117
+ ),
118
+ 10,
119
+ 3
120
+ );
121
+ add_action(
122
+ 'edit_comment',
123
+ array(
124
+ __CLASS__,
125
+ 'edit_comment'
126
+ )
127
+ );
128
+ add_action(
129
+ 'admin_bar_menu',
130
+ array(
131
+ __CLASS__,
132
+ 'add_menu'
133
+ ),
134
+ 90
135
+ );
136
+ add_action(
137
+ 'right_now_table_end',
138
+ array(
139
+ __CLASS__,
140
+ 'add_count'
141
+ )
142
+ );
143
+
144
+ add_filter(
145
+ 'plugin_row_meta',
146
+ array(
147
+ __CLASS__,
148
+ 'row_meta'
149
+ ),
150
+ 10,
151
+ 2
152
+ );
153
+ add_filter(
154
+ 'plugin_action_links_' .CACHIFY_BASE,
155
+ array(
156
+ __CLASS__,
157
+ 'action_links'
158
+ )
159
+ );
160
+
161
+ /* Frontend */
162
+ } else {
163
+ add_action(
164
+ 'preprocess_comment',
165
+ array(
166
+ __CLASS__,
167
+ 'add_comment'
168
+ ),
169
+ 1
170
+ );
171
+ add_action(
172
+ 'template_redirect',
173
+ array(
174
+ __CLASS__,
175
+ 'manage_cache'
176
+ ),
177
+ 0
178
+ );
179
+ }
180
+ }
181
+
182
+
183
+ /**
184
+ * Plugin-Installation für MU-Blogs
185
+ *
186
+ * @since 1.0
187
+ * @change 1.0
188
+ */
189
+
190
+ public static function install()
191
+ {
192
+ /* Multisite & Network */
193
+ if ( is_multisite() && !empty($_GET['networkwide']) ) {
194
+ /* Blog-IDs */
195
+ $ids = self::_get_blog_ids();
196
+
197
+ /* Loopen */
198
+ foreach ($ids as $id) {
199
+ switch_to_blog( (int)$id );
200
+ self::_install_backend();
201
+ }
202
+
203
+ /* Wechsel zurück */
204
+ restore_current_blog();
205
+
206
+ } else {
207
+ self::_install_backend();
208
+ }
209
+ }
210
+
211
+
212
+ /**
213
+ * Plugin-Installation bei neuen MU-Blogs
214
+ *
215
+ * @since 1.0
216
+ * @change 1.0
217
+ */
218
+
219
+ public static function install_later($id) {
220
+ /* Kein Netzwerk-Plugin */
221
+ if ( !is_plugin_active_for_network(CACHIFY_BASE) ) {
222
+ return;
223
+ }
224
+
225
+ /* Wechsel */
226
+ switch_to_blog( (int)$id );
227
+
228
+ /* Installieren */
229
+ self::_install_backend();
230
+
231
+ /* Wechsel zurück */
232
+ restore_current_blog();
233
+ }
234
+
235
+
236
+ /**
237
+ * Eigentliche Installation der Optionen
238
+ *
239
+ * @since 1.0
240
+ * @change 2.0
241
+ */
242
+
243
+ private static function _install_backend()
244
+ {
245
+ add_option(
246
+ 'cachify',
247
+ array()
248
+ );
249
+
250
+ /* Flush */
251
+ self::flush_cache();
252
+ }
253
+
254
+
255
+ /**
256
+ * Deinstallation des Plugins pro MU-Blog
257
+ *
258
+ * @since 1.0
259
+ * @change 1.0
260
+ */
261
+
262
+ public static function uninstall()
263
+ {
264
+ /* Global */
265
+ global $wpdb;
266
+
267
+ /* Multisite & Network */
268
+ if ( is_multisite() && !empty($_GET['networkwide']) ) {
269
+ /* Alter Blog */
270
+ $old = $wpdb->blogid;
271
+
272
+ /* Blog-IDs */
273
+ $ids = self::_get_blog_ids();
274
+
275
+ /* Loopen */
276
+ foreach ($ids as $id) {
277
+ switch_to_blog($id);
278
+ self::_uninstall_backend();
279
+ }
280
+
281
+ /* Wechsel zurück */
282
+ switch_to_blog($old);
283
+ } else {
284
+ self::_uninstall_backend();
285
+ }
286
+ }
287
+
288
+
289
+ /**
290
+ * Deinstallation des Plugins bei MU & Network
291
+ *
292
+ * @since 1.0
293
+ * @change 1.0
294
+ */
295
+
296
+ public static function uninstall_later($id)
297
+ {
298
+ /* Kein Netzwerk-Plugin */
299
+ if ( !is_plugin_active_for_network(CACHIFY_BASE) ) {
300
+ return;
301
+ }
302
+
303
+ /* Wechsel */
304
+ switch_to_blog( (int)$id );
305
+
306
+ /* Installieren */
307
+ self::_uninstall_backend();
308
+
309
+ /* Wechsel zurück */
310
+ restore_current_blog();
311
+ }
312
+
313
+
314
+ /**
315
+ * Eigentliche Deinstallation des Plugins
316
+ *
317
+ * @since 1.0
318
+ * @change 1.0
319
+ */
320
+
321
+ private static function _uninstall_backend()
322
+ {
323
+ /* Option */
324
+ delete_option('cachify');
325
+
326
+ /* Cache leeren */
327
+ self::flush_cache();
328
+ }
329
+
330
+
331
+ /**
332
+ * Rückgabe der IDs installierter Blogs
333
+ *
334
+ * @since 1.0
335
+ * @change 1.0
336
+ *
337
+ * @return array Blog-IDs
338
+ */
339
+
340
+ private static function _get_blog_ids()
341
+ {
342
+ /* Global */
343
+ global $wpdb;
344
+
345
+ return $wpdb->get_col(
346
+ $wpdb->prepare("SELECT blog_id FROM `$wpdb->blogs`")
347
+ );
348
+ }
349
+
350
+
351
+ /**
352
+ * Eigenschaften des Objekts
353
+ *
354
+ * @since 2.0
355
+ * @change 2.0
356
+ */
357
+
358
+ private static function _set_vars()
359
+ {
360
+ /* Optionen */
361
+ self::$options = self::_get_options();
362
+
363
+ /* Methode */
364
+ if ( self::$options['use_apc'] === 1 && extension_loaded('apc') ) {
365
+ self::$method = new Cachify_APC;
366
+ } else if ( self::$options['use_apc'] === 2 ) {
367
+ self::$method = new Cachify_HDD;
368
+ } else {
369
+ self::$method = new Cachify_DB;
370
+ }
371
+ }
372
+
373
+
374
+ /**
375
+ * Rückgabe der Optionen
376
+ *
377
+ * @since 2.0
378
+ * @change 2.0
379
+ *
380
+ * @return array $diff Array mit Werten
381
+ */
382
+
383
+ private static function _get_options()
384
+ {
385
+ return wp_parse_args(
386
+ get_option('cachify'),
387
+ array(
388
+ 'only_guests' => 1,
389
+ 'compress_html' => 0,
390
+ 'cache_expires' => 12,
391
+ 'without_ids' => '',
392
+ 'without_agents' => '',
393
+ 'use_apc' => 0
394
+ )
395
+ );
396
+ }
397
+
398
+
399
+ /**
400
+ * Hinzufügen der Action-Links
401
+ *
402
+ * @since 1.0
403
+ * @change 1.0
404
+ *
405
+ * @param array $data Bereits existente Links
406
+ * @return array $data Erweitertes Array mit Links
407
+ */
408
+
409
+ public static function action_links($data)
410
+ {
411
+ /* Rechte? */
412
+ if ( !current_user_can('manage_options') ) {
413
+ return $data;
414
+ }
415
+
416
+ return array_merge(
417
+ $data,
418
+ array(
419
+ sprintf(
420
+ '<a href="%s">%s</a>',
421
+ add_query_arg(
422
+ array(
423
+ 'page' => 'cachify'
424
+ ),
425
+ admin_url('options-general.php')
426
+ ),
427
+ __('Settings')
428
+ )
429
+ )
430
+ );
431
+ }
432
+
433
+
434
+ /**
435
+ * Meta-Links des Plugins
436
+ *
437
+ * @since 0.5
438
+ * @change 1.3
439
+ *
440
+ * @param array $data Bereits vorhandene Links
441
+ * @param string $page Aktuelle Seite
442
+ * @return array $data Modifizierte Links
443
+ */
444
+
445
+ public static function row_meta($data, $page)
446
+ {
447
+ /* Rechte */
448
+ if ( $page != CACHIFY_BASE ) {
449
+ return $data;
450
+ }
451
+
452
+ return array_merge(
453
+ $data,
454
+ array(
455
+ '<a href="http://flattr.com/profile/sergej.mueller" target="_blank">Plugin flattern</a>',
456
+ '<a href="https://plus.google.com/110569673423509816572" target="_blank">Auf Google+ folgen</a>'
457
+ )
458
+ );
459
+ }
460
+
461
+
462
+ /**
463
+ * Hinzufügen eines Admin-Bar-Menüs
464
+ *
465
+ * @since 1.2
466
+ * @change 1.2.1
467
+ *
468
+ * @param object Objekt mit Menü-Eigenschaften
469
+ */
470
+
471
+ public static function add_menu($wp_admin_bar)
472
+ {
473
+ /* Aussteigen */
474
+ if ( !is_admin_bar_showing() or !is_super_admin() ) {
475
+ return;
476
+ }
477
+
478
+ /* Hinzufügen */
479
+ $wp_admin_bar->add_menu(
480
+ array(
481
+ 'id' => 'cachify',
482
+ 'title' => '<span class="ab-icon" title="Cache leeren"></span>',
483
+ 'href' => add_query_arg('_cachify', 'flush'),
484
+ 'parent' => 'top-secondary'
485
+ )
486
+ );
487
+ }
488
+
489
+
490
+ /**
491
+ * Anzeige des Spam-Counters auf dem Dashboard
492
+ *
493
+ * @since 2.0
494
+ * @change 2.0
495
+ */
496
+
497
+ public static function add_count()
498
+ {
499
+ /* Größe */
500
+ if ( !$size = get_transient('cachify_cache_size') ) {
501
+ /* Auslesen */
502
+ $size = (int) call_user_func(
503
+ array(
504
+ self::$method,
505
+ 'get_stats'
506
+ )
507
+ );
508
+
509
+ /* Speichern */
510
+ set_transient(
511
+ 'cachify_cache_size',
512
+ $size,
513
+ 60 * 15
514
+ );
515
+ }
516
+
517
+ /* Ausgabe */
518
+ echo sprintf(
519
+ '<tr>
520
+ <td class="b b-spam" style="font-size:18px">%s</td>
521
+ <td class="last t">Cache</td>
522
+ </tr>',
523
+ ( $size ? size_format($size) : 0 )
524
+ );
525
+ }
526
+
527
+
528
+ /**
529
+ * Verarbeitung der Plugin-Meta-Aktionen
530
+ *
531
+ * @since 0.5
532
+ * @change 1.2
533
+ *
534
+ * @param array $data Metadaten der Plugins
535
+ */
536
+
537
+ public static function receive_flush($data)
538
+ {
539
+ /* Leer? */
540
+ if ( empty($_GET['_cachify']) or $_GET['_cachify'] !== 'flush' ) {
541
+ return;
542
+ }
543
+
544
+ /* Global */
545
+ global $wpdb;
546
+
547
+ /* Multisite & Network */
548
+ if ( is_multisite() && is_plugin_active_for_network(CACHIFY_BASE) ) {
549
+ /* Alter Blog */
550
+ $old = $wpdb->blogid;
551
+
552
+ /* Blog-IDs */
553
+ $ids = self::_get_blog_ids();
554
+
555
+ /* Loopen */
556
+ foreach ($ids as $id) {
557
+ switch_to_blog($id);
558
+ self::flush_cache();
559
+ }
560
+
561
+ /* Wechsel zurück */
562
+ switch_to_blog($old);
563
+
564
+ /* Notiz */
565
+ add_action(
566
+ 'network_admin_notices',
567
+ array(
568
+ __CLASS__,
569
+ 'flush_notice'
570
+ )
571
+ );
572
+ } else {
573
+ /* Leeren */
574
+ self::flush_cache();
575
+
576
+ /* Notiz */
577
+ add_action(
578
+ 'admin_notices',
579
+ array(
580
+ __CLASS__,
581
+ 'flush_notice'
582
+ )
583
+ );
584
+ }
585
+ }
586
+
587
+
588
+ /**
589
+ * Hinweis nach erfolgreichem Cache-Leeren
590
+ *
591
+ * @since 1.2
592
+ * @change 1.2
593
+ */
594
+
595
+ public static function flush_notice()
596
+ {
597
+ /* Kein Admin */
598
+ if ( !is_super_admin() ) {
599
+ return false;
600
+ }
601
+
602
+ echo '<div id="message" class="updated"><p><strong>Cachify-Cache geleert.</strong></p></div>';
603
+ }
604
+
605
+
606
+ /**
607
+ * Löschung des Cache beim Kommentar-Editieren
608
+ *
609
+ * @since 0.1
610
+ * @change 0.4
611
+ *
612
+ * @param integer $id ID des Kommentars
613
+ */
614
+
615
+ public static function edit_comment($id)
616
+ {
617
+ self::_delete_cache(
618
+ get_permalink(
619
+ get_comment($id)->comment_post_ID
620
+ )
621
+ );
622
+ }
623
+
624
+
625
+ /**
626
+ * Löschung des Cache beim neuen Kommentar
627
+ *
628
+ * @since 0.1
629
+ * @change 0.1
630
+ *
631
+ * @param array $comment Array mit Eigenschaften
632
+ * @return array $comment Array mit Eigenschaften
633
+ */
634
+
635
+ public static function add_comment($comment)
636
+ {
637
+ self::_delete_cache(
638
+ get_permalink($comment['comment_post_ID'])
639
+ );
640
+
641
+ return $comment;
642
+ }
643
+
644
+
645
+ /**
646
+ * Löschung des Cache beim Editieren der Kommentare
647
+ *
648
+ * @since 0.1
649
+ * @change 0.4
650
+ *
651
+ * @param string $new_status Neuer Status
652
+ * @param string $old_status Alter Status
653
+ * @param object $comment Array mit Eigenschaften
654
+ */
655
+
656
+ public static function touch_comment($new_status, $old_status, $comment)
657
+ {
658
+ if ( $new_status != $old_status ) {
659
+ self::_delete_cache(
660
+ get_permalink($comment->comment_post_ID)
661
+ );
662
+ }
663
+ }
664
+
665
+
666
+ /**
667
+ * Leerung des Cache bei neuen Beiträgen
668
+ *
669
+ * @since 0.1
670
+ * @change 0.9.1
671
+ *
672
+ * @param intval $id ID des Beitrags
673
+ */
674
+
675
+ public static function publish_post($id)
676
+ {
677
+ /* Post */
678
+ $post = get_post($id);
679
+
680
+ /* Löschen */
681
+ if ( in_array( $post->post_status, array('publish', 'future') ) ) {
682
+ self::flush_cache();
683
+ }
684
+ }
685
+
686
+
687
+ /**
688
+ * Leerung des Cache bei neuen Beiträgen
689
+ *
690
+ * @since 1.0
691
+ * @change 1.0
692
+ *
693
+ * @param intval $id ID des Beitrags
694
+ */
695
+
696
+ public static function publish_page($id)
697
+ {
698
+ /* Page */
699
+ $page = get_page($id);
700
+
701
+ /* Löschen */
702
+ if ( $page->post_status == 'publish' ) {
703
+ self::flush_cache();
704
+ }
705
+ }
706
+
707
+
708
+ /**
709
+ * Rückgabe der Cache-Gültigkeit
710
+ *
711
+ * @since 2.0
712
+ * @change 2.0
713
+ *
714
+ * @return intval Gültigkeit in Sekunden
715
+ */
716
+
717
+ private static function _cache_expires()
718
+ {
719
+ return 60 * 60 * self::$options['cache_expires'];
720
+ }
721
+
722
+
723
+ /**
724
+ * Rückgabe des Cache-Hash-Wertes
725
+ *
726
+ * @since 0.1
727
+ * @change 2.0
728
+ *
729
+ * @param string $url URL für den Hash-Wert [optional]
730
+ * @return string Cachify-Hash-Wert
731
+ */
732
+
733
+ private static function _cache_hash($url = '')
734
+ {
735
+ return md5(
736
+ empty($url) ? ( $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] ) : ( parse_url($url, PHP_URL_HOST) . parse_url($url, PHP_URL_PATH) )
737
+ ) . '.cachify';
738
+ }
739
+
740
+
741
+ /**
742
+ * Splittung nach Komma
743
+ *
744
+ * @since 0.9.1
745
+ * @change 1.0
746
+ *
747
+ * @param string $input Zu splittende Zeichenkette
748
+ * @return array Konvertierter Array
749
+ */
750
+
751
+ private static function _preg_split($input)
752
+ {
753
+ return (array)preg_split('/,/', $input, -1, PREG_SPLIT_NO_EMPTY);
754
+ }
755
+
756
+
757
+ /**
758
+ * Prüfung der WordPress-Version
759
+ *
760
+ * @since 2.0
761
+ * @change 2.0
762
+ *
763
+ * @param integer $version Gesuchte WP-Version
764
+ * @return boolean TRUE, wenn mindestens gesuchte
765
+ */
766
+
767
+ private static function _is_wp($version) {
768
+ return version_compare(
769
+ $GLOBALS['wp_version'],
770
+ $version. 'alpha',
771
+ '>='
772
+ );
773
+ }
774
+
775
+
776
+ /**
777
+ * Prüfung auf Index
778
+ *
779
+ * @since 0.6
780
+ * @change 1.0
781
+ *
782
+ * @return boolean TRUE bei Index
783
+ */
784
+
785
+ private static function _is_index()
786
+ {
787
+ return basename($_SERVER['SCRIPT_NAME']) != 'index.php';
788
+ }
789
+
790
+
791
+ /**
792
+ * Prüfung auf Mobile Devices
793
+ *
794
+ * @since 0.9.1
795
+ * @change 1.0
796
+ *
797
+ * @return boolean TRUE bei Mobile
798
+ */
799
+
800
+ private static function _is_mobile()
801
+ {
802
+ return ( strpos(TEMPLATEPATH, 'wptouch') or strpos(TEMPLATEPATH, 'carrington') );
803
+ }
804
+
805
+
806
+ /**
807
+ * Prüfung auf eingeloggte und kommentierte Nutzer
808
+ *
809
+ * @since 2.0
810
+ * @change 2.0
811
+ *
812
+ * @return boolean $diff TRUE bei "vermerkten" Nutzern
813
+ */
814
+
815
+ private static function _is_logged_in()
816
+ {
817
+ /* Eingeloggt */
818
+ if ( is_user_logged_in() ) {
819
+ return true;
820
+ }
821
+
822
+ /* Cookie? */
823
+ if ( empty($_COOKIE) ) {
824
+ return false;
825
+ }
826
+
827
+ /* Loopen */
828
+ foreach ( $_COOKIE as $k => $v) {
829
+ if ( preg_match('/^(wp-postpass|wordpress|comment_author)_/', $k) ) {
830
+ return true;
831
+ }
832
+ }
833
+ }
834
+
835
+
836
+ /**
837
+ * Definition der Ausnahmen für den Cache
838
+ *
839
+ * @since 0.2
840
+ * @change 2.0
841
+ *
842
+ * @return boolean TRUE bei Ausnahmen
843
+ */
844
+
845
+ private static function _skip_cache()
846
+ {
847
+ /* Optionen */
848
+ $options = self::$options;
849
+
850
+ /* Filter */
851
+ if ( !empty($_POST) or self::_is_index() or is_search() or is_404() or is_feed() or is_trackback() or is_robots() or is_preview() or post_password_required() ) {
852
+ return true;
853
+ }
854
+
855
+ /* Logged in */
856
+ if ( $options['only_guests'] && self::_is_logged_in() ) {
857
+ return true;
858
+ }
859
+
860
+ /* WP Touch */
861
+ if ( self::_is_mobile() ) {
862
+ return true;
863
+ }
864
+
865
+ /* Post IDs */
866
+ if ( $options['without_ids'] && is_singular() ) {
867
+ if ( in_array( $GLOBALS['wp_query']->get_queried_object_id(), self::_preg_split($options['without_ids']) ) ) {
868
+ return true;
869
+ }
870
+ }
871
+
872
+ /* User Agents */
873
+ if ( $options['without_agents'] && isset($_SERVER['HTTP_USER_AGENT']) ) {
874
+ if ( array_filter( self::_preg_split($options['without_agents']), create_function('$a', 'return strpos($_SERVER["HTTP_USER_AGENT"], $a);') ) ) {
875
+ return true;
876
+ }
877
+ }
878
+
879
+ return false;
880
+ }
881
+
882
+
883
+ /**
884
+ * Minimierung des HTML-Codes
885
+ *
886
+ * @since 0.9.2
887
+ * @change 2.0.1
888
+ *
889
+ * @param string $data Zu minimierender Datensatz
890
+ * @return string $data Minimierter Datensatz
891
+ */
892
+
893
+ private static function _minify_cache($data) {
894
+ /* Minimierung? */
895
+ if ( !self::$options['compress_html'] ) {
896
+ return($data);
897
+ }
898
+
899
+ /* Verkleinern */
900
+ $cleaned = preg_replace(
901
+ array(
902
+ '/<!--[^\[><](.*?)-->/s',
903
+ '#(?ix)(?>[^\S ]\s*|\s{2,})(?=(?:(?:[^<]++|<(?!/?(?:textarea|pre)\b))*+)(?:<(?>textarea|pre)\b|\z))#'
904
+ ),
905
+ array(
906
+ '',
907
+ ' '
908
+ ),
909
+ (string) $data
910
+ );
911
+
912
+ /* Fehlerhaft? */
913
+ if ( strlen($cleaned) <= 1 ) {
914
+ return($data);
915
+ }
916
+
917
+ return $cleaned;
918
+ }
919
+
920
+
921
+ /**
922
+ * Löschung des Cache für eine URL
923
+ *
924
+ * @since 0.1
925
+ * @change 2.0
926
+ *
927
+ * @param string $url URL für den Hash-Wert
928
+ */
929
+
930
+ private static function _delete_cache($url)
931
+ {
932
+ call_user_func(
933
+ array(
934
+ self::$method,
935
+ 'delete_item'
936
+ ),
937
+ self::_cache_hash($url),
938
+ $url
939
+ );
940
+ }
941
+
942
+
943
+ /**
944
+ * Zurücksetzen des kompletten Cache
945
+ *
946
+ * @since 0.1
947
+ * @change 2.0
948
+ */
949
+
950
+ public static function flush_cache()
951
+ {
952
+ /* DB */
953
+ Cachify_DB::clear_cache();
954
+
955
+ /* APC */
956
+ Cachify_APC::clear_cache();
957
+
958
+ /* HD */
959
+ Cachify_HDD::clear_cache();
960
+
961
+ /* Transient */
962
+ delete_transient('cachify_cache_size');
963
+ }
964
+
965
+
966
+ /**
967
+ * Zuweisung des Cache
968
+ *
969
+ * @since 0.1
970
+ * @change 2.0
971
+ *
972
+ * @param string $data Inhalt der Seite
973
+ * @return string $data Inhalt der Seite
974
+ */
975
+
976
+ public static function set_cache($data)
977
+ {
978
+ /* Leer? */
979
+ if ( empty($data) ) {
980
+ return '';
981
+ }
982
+
983
+ /* Speicherung */
984
+ call_user_func(
985
+ array(
986
+ self::$method,
987
+ 'store_item'
988
+ ),
989
+ self::_cache_hash(),
990
+ self::_minify_cache($data),
991
+ self::_cache_expires()
992
+ );
993
+
994
+ return $data;
995
+ }
996
+
997
+
998
+ /**
999
+ * Verwaltung des Cache
1000
+ *
1001
+ * @since 0.1
1002
+ * @change 2.0
1003
+ */
1004
+
1005
+ public static function manage_cache()
1006
+ {
1007
+ /* Kein Caching? */
1008
+ if ( self::_skip_cache() ) {
1009
+ return;
1010
+ }
1011
+
1012
+ /* Daten im Cache */
1013
+ $cache = call_user_func(
1014
+ array(
1015
+ self::$method,
1016
+ 'get_item'
1017
+ ),
1018
+ self::_cache_hash()
1019
+ );
1020
+
1021
+ /* Kein Cache? */
1022
+ if ( empty($cache) ) {
1023
+ ob_start('Cachify::set_cache');
1024
+ return;
1025
+ }
1026
+
1027
+ /* Cache verarbeiten */
1028
+ call_user_func(
1029
+ array(
1030
+ self::$method,
1031
+ 'print_cache'
1032
+ ),
1033
+ $cache
1034
+ );
1035
+ }
1036
+
1037
+
1038
+ /**
1039
+ * Einbindung von CSS
1040
+ *
1041
+ * @since 1.0
1042
+ * @change 2.0
1043
+ */
1044
+
1045
+ public static function add_css()
1046
+ {
1047
+ /* Infos auslesen */
1048
+ $data = get_plugin_data(CACHIFY_FILE);
1049
+
1050
+ /* CSS registrieren */
1051
+ wp_register_style(
1052
+ 'cachify_css',
1053
+ plugins_url('css/style.css', CACHIFY_FILE),
1054
+ array(),
1055
+ $data['Version']
1056
+ );
1057
+
1058
+ /* CSS einbinden */
1059
+ wp_enqueue_style('cachify_css');
1060
+ }
1061
+
1062
+
1063
+ /**
1064
+ * Einfügen der Optionsseite
1065
+ *
1066
+ * @since 1.0
1067
+ * @change 2.0
1068
+ */
1069
+
1070
+ public static function add_page()
1071
+ {
1072
+ $page = add_options_page(
1073
+ 'Cachify',
1074
+ '<span id="cachify_sidebar_icon"></span>Cachify',
1075
+ 'manage_options',
1076
+ 'cachify',
1077
+ array(
1078
+ __CLASS__,
1079
+ 'options_page'
1080
+ )
1081
+ );
1082
+
1083
+ /* Hilfe */
1084
+ add_action(
1085
+ 'load-' .$page,
1086
+ array(
1087
+ __CLASS__,
1088
+ 'add_help'
1089
+ )
1090
+ );
1091
+ }
1092
+
1093
+
1094
+ /**
1095
+ * Hilfe-Tab oben rechts
1096
+ *
1097
+ * @since 2.0
1098
+ * @change 2.0
1099
+ */
1100
+
1101
+ public static function add_help()
1102
+ {
1103
+ /* WP zu alt? */
1104
+ if ( !self::_is_wp('3.3') ) {
1105
+ return;
1106
+ }
1107
+
1108
+ /* Screen */
1109
+ $screen = get_current_screen();
1110
+
1111
+ /* Tabs */
1112
+ $screen->add_help_tab(
1113
+ array(
1114
+ 'id' => 'cachify_settings',
1115
+ 'title' => 'Einstellungen',
1116
+ 'content' => '<p>Bereitgestellte Einstellungen in Schnellübersicht:</p>'.
1117
+ '<ul>'.
1118
+ '<li><em>Aufbewahrungsort für Cache</em><br />'.
1119
+ 'Je nach Verfügbarkeit stehen 3 Methoden der Cache-Speicherung zur Nutzung bereit: <em>Datenbank</em>, <em>APC</em>, <em>Festplatte</em>. Die Standard-Einstellung ist <em>Datenbank</em> - Cache-Inhalte werden dabei in der WordPress-Datenbank abgelegt und dort verwaltet. <em>APC</em> (Alternative PHP Cache) kann bei installiertem APC-PHP-Modul ausgewählt und verwendet werden. <em>Festplatte</em> als Methode ist erst bei eingeschalteten WordPress-Permalinks nutzbar. Bei der Auswahl <em>Festplatte</em> und <em>APC</em> sind Anpassungen in der Datei <em>.htaccess</em> / <em>nginx.conf</em> notwendig.</li>'.
1120
+
1121
+ '<li><em>Cache-Gültigkeit in Stunden</em><br />'.
1122
+ 'Gültigkeitsdauer der Aufbewahrung von Cache-Inhalten. Keine Verwendung bei <em>Festplatte</em> als Caching-Methode. <em>0</em> = <em>unbegrenzt</em></li>'.
1123
+
1124
+ '<li><em>Minimierung der Ausgabe</em><br />'.
1125
+ 'Durch die Entfernung von HTML-Kommentaren und Umbrüchen im Quelltext der Blogseiten kann die Ausgabegröße reduziert und die Übertragung beschleunigt werden. In Fehlerfällen ist die Option zu deaktivieren.</li>'.
1126
+ '</ul>'
1127
+ )
1128
+ );
1129
+ $screen->add_help_tab(
1130
+ array(
1131
+ 'id' => 'cachify_filter',
1132
+ 'title' => 'Filter',
1133
+ 'content' => '<p>Filter grenzen die Cache-Anwendung wie folgt ein:</p>'.
1134
+ '<ul>'.
1135
+ '<li><em>Ausnahme für (Post/Pages) IDs</em><br />'.
1136
+ 'IDs bestimmter Artikel oder/und Seiten, die vom Caching ausgeschlossen werden sollen. Kommaseparierte Liste.</li>'.
1137
+
1138
+ '<li><em>Ausnahme für User Agents</em><br />'.
1139
+ 'User Agents gewünschter Browser bzw. Apps, die eine zwischengespeicherte Version der Webseite nie angezeigt bekommen sollen. Gilt nicht bei <em>APC</em> und <em>Festplatte</em> als Caching-Methoden.</li>'.
1140
+
1141
+ '<li><em>Kein Cache für eingeloggte bzw. kommentierende Nutzer</em><br />'.
1142
+ 'Bei aktiver Option bekommen ausschließlich nicht angemeldete bzw. nicht kommentierende Blog-Nutzer die Cache-Variante einer Webseite angezeigt. Gilt nicht bei <em>APC</em>. Online-Dokumentation beachten.</li>'.
1143
+ '</ul>'
1144
+ )
1145
+ );
1146
+ $screen->add_help_tab(
1147
+ array(
1148
+ 'id' => 'cachify_dashboard',
1149
+ 'title' => 'Dashboard',
1150
+ 'content' => '<p>Auf dem Admin-Dashboard bildet Cachify die aktuelle Cache-Größe ab. Der Wert aktualisiert sich alle 15 Minuten.</p>'
1151
+ )
1152
+ );
1153
+ $screen->add_help_tab(
1154
+ array(
1155
+ 'id' => 'cachify_manual',
1156
+ 'title' => 'Dokumentation',
1157
+ 'content' => '<p>Ausführliche Dokumentation für das Cachify-Plugin online verfügbar:</p>'.
1158
+ '<p><a href="http://playground.ebiene.de/cachify-wordpress-cache/" target="_blank">http://playground.ebiene.de/cachify-wordpress-cache/</a></p>'
1159
+ )
1160
+ );
1161
+
1162
+ /* Sidebar */
1163
+ $screen->set_help_sidebar(
1164
+ '<p><strong>Mehr zum Autor</strong></p>'.
1165
+ '<p><a href="https://plus.google.com/110569673423509816572/" target="_blank">Google+</a></p>'.
1166
+ '<p><a href="http://ebiene.de" target="_blank">Portfolio</a></p>'.
1167
+ '<p><a href="http://flattr.com/profile/sergej.mueller" target="_blank">Flattr</a></p>'
1168
+ );
1169
+ }
1170
+
1171
+
1172
+ /**
1173
+ * Verfügbare Cache-Methoden
1174
+ *
1175
+ * @since 2.0
1176
+ * @change 2.0
1177
+ *
1178
+ * @param array $available Array mit verfügbaren Arten
1179
+ */
1180
+
1181
+ private static function _method_select()
1182
+ {
1183
+ /* Verfügbar */
1184
+ $available = array(
1185
+ 0 => 'Datenbank',
1186
+ 1 => 'APC',
1187
+ 2 => 'Festplatte'
1188
+ );
1189
+
1190
+ /* Kein APC */
1191
+ if ( !extension_loaded('apc') ) {
1192
+ unset($available[1]);
1193
+ }
1194
+
1195
+ /* Keine Permalinks */
1196
+ if ( !get_option('permalink_structure') ) {
1197
+ unset($available[2]);
1198
+ }
1199
+
1200
+ return $available;
1201
+ }
1202
+
1203
+
1204
+ /**
1205
+ * Registrierung der Settings
1206
+ *
1207
+ * @since 1.0
1208
+ * @change 1.0
1209
+ */
1210
+
1211
+ public static function register_settings()
1212
+ {
1213
+ register_setting(
1214
+ 'cachify',
1215
+ 'cachify',
1216
+ array(
1217
+ __CLASS__,
1218
+ 'validate_options'
1219
+ )
1220
+ );
1221
+ }
1222
+
1223
+
1224
+ /**
1225
+ * Valisierung der Optionsseite
1226
+ *
1227
+ * @since 1.0
1228
+ * @change 2.0
1229
+ *
1230
+ * @param array $data Array mit Formularwerten
1231
+ * @return array Array mit geprüften Werten
1232
+ */
1233
+
1234
+ public static function validate_options($data)
1235
+ {
1236
+ /* Cache leeren */
1237
+ self::flush_cache();
1238
+
1239
+ /* Hinweis */
1240
+ if ( self::$options['use_apc'] != $data['use_apc'] && $data['use_apc'] >= 1 ) {
1241
+ add_settings_error(
1242
+ 'cachify_method_tip',
1243
+ 'cachify_method_tip',
1244
+ 'Die Server-Konfigurationsdatei (z.B. .htaccess) muss jetzt erweitert werden [<a href="http://playground.ebiene.de/cachify-wordpress-cache/" target="_blank">?</a>]',
1245
+ 'error'
1246
+ );
1247
+ }
1248
+
1249
+ /* Rückgabe */
1250
+ return array(
1251
+ 'only_guests' => (int)(!empty($data['only_guests'])),
1252
+ 'compress_html' => (int)(!empty($data['compress_html'])),
1253
+ 'cache_expires' => (int)(@$data['cache_expires']),
1254
+ 'without_ids' => (string)sanitize_text_field(@$data['without_ids']),
1255
+ 'without_agents' => (string)sanitize_text_field(@$data['without_agents']),
1256
+ 'use_apc' => (int)$data['use_apc']
1257
+ );
1258
+ }
1259
+
1260
+
1261
+ /**
1262
+ * Darstellung der Optionsseite
1263
+ *
1264
+ * @since 1.0
1265
+ * @change 2.0
1266
+ */
1267
+
1268
+ public static function options_page()
1269
+ { ?>
1270
+ <div class="wrap" id="cachify_main">
1271
+ <?php screen_icon('cachify') ?>
1272
+
1273
+ <h2>
1274
+ Cachify
1275
+ </h2>
1276
+
1277
+ <form method="post" action="options.php">
1278
+ <?php settings_fields('cachify') ?>
1279
+
1280
+ <?php $options = self::_get_options() ?>
1281
+
1282
+ <div class="table rounded">
1283
+ <table class="form-table">
1284
+ <caption class="rounded">Einstellungen</caption>
1285
+
1286
+ <tr>
1287
+ <th>
1288
+ Aufbewahrungsort für Cache
1289
+ </th>
1290
+ <td>
1291
+ <select name="cachify[use_apc]">
1292
+ <?php foreach( self::_method_select() as $k => $v ) { ?>
1293
+ <option value="<?php echo esc_attr($k) ?>" <?php selected($options['use_apc'], $k); ?>><?php echo esc_html($v) ?></option>
1294
+ <?php } ?>
1295
+ </select>
1296
+ </td>
1297
+ </tr>
1298
+
1299
+ <tr>
1300
+ <th>
1301
+ Cache-Gültigkeit in Stunden
1302
+ </th>
1303
+ <td>
1304
+ <input type="text" name="cachify[cache_expires]" value="<?php echo $options['cache_expires'] ?>" class="small" />
1305
+ </td>
1306
+ </tr>
1307
+
1308
+ <tr>
1309
+ <th>
1310
+ Minimierung der Ausgabe
1311
+ </th>
1312
+ <td>
1313
+ <input type="checkbox" name="cachify[compress_html]" value="1" <?php checked('1', $options['compress_html']); ?> />
1314
+ </td>
1315
+ </tr>
1316
+ </table>
1317
+ </div>
1318
+
1319
+ <div class="table rounded">
1320
+ <table class="form-table">
1321
+ <caption class="rounded">Filter</caption>
1322
+
1323
+ <tr>
1324
+ <th>
1325
+ Ausnahme für (Post/Pages) IDs
1326
+ </th>
1327
+ <td>
1328
+ <input type="text" name="cachify[without_ids]" value="<?php echo $options['without_ids'] ?>" />
1329
+ </td>
1330
+ </tr>
1331
+
1332
+ <tr>
1333
+ <th>
1334
+ Ausnahme für User Agents
1335
+ </th>
1336
+ <td>
1337
+ <input type="text" name="cachify[without_agents]" value="<?php echo $options['without_agents'] ?>" />
1338
+ </td>
1339
+ </tr>
1340
+
1341
+ <tr>
1342
+ <th>
1343
+ Kein Cache für eingeloggte<br />bzw. kommentierende Nutzer
1344
+ </th>
1345
+ <td>
1346
+ <input type="checkbox" name="cachify[only_guests]" value="1" <?php checked('1', $options['only_guests']); ?> />
1347
+ </td>
1348
+ </tr>
1349
+ </table>
1350
+ </div>
1351
+
1352
+ <p class="submit">
1353
+ <span class="help">Beachte die Hilfe<br />oben rechts</span>
1354
+ <input type="submit" class="button-primary" value="<?php _e('Save Changes') ?>" />
1355
+ </p>
1356
+ </form>
1357
+ </div><?php
1358
+ }
1359
+ }
inc/cachify_apc.class.php ADDED
@@ -0,0 +1,159 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+
4
+ /* Secure check */
5
+ if ( !class_exists('Cachify') ) {
6
+ die();
7
+ }
8
+
9
+
10
+ /**
11
+ * Cachify_APC
12
+ */
13
+
14
+ final class Cachify_APC {
15
+
16
+
17
+ /**
18
+ * Speicherung im Cache
19
+ *
20
+ * @since 2.0
21
+ * @change 2.0
22
+ *
23
+ * @param string $hash Hash des Eintrags
24
+ * @param string $data Inhalt des Eintrags
25
+ * @param integer $lifetime Lebensdauer des Eintrags
26
+ */
27
+
28
+ public static function store_item($hash, $data, $lifetime)
29
+ {
30
+ /* Leer? */
31
+ if ( empty($hash) or empty($data) ) {
32
+ wp_die('APC add item: Empty input.');
33
+ }
34
+
35
+ /* Store */
36
+ apc_store(
37
+ $hash,
38
+ gzencode( $data . self::_cache_signatur(), 9),
39
+ $lifetime
40
+ );
41
+ }
42
+
43
+
44
+ /**
45
+ * Lesen aus dem Cache
46
+ *
47
+ * @since 2.0
48
+ * @change 2.0
49
+ *
50
+ * @param string $hash Hash des Eintrags
51
+ * @return mixed $diff Wert des Eintrags
52
+ */
53
+
54
+ public static function get_item($hash)
55
+ {
56
+ /* Leer? */
57
+ if ( empty($hash) ) {
58
+ wp_die('APC get item: Empty input.');
59
+ }
60
+
61
+ return ( function_exists('apc_exists') ? apc_exists($hash) : apc_fetch($hash) );
62
+ }
63
+
64
+
65
+ /**
66
+ * Entfernung aus dem Cache
67
+ *
68
+ * @since 2.0
69
+ * @change 2.0
70
+ *
71
+ * @param string $hash Hash des Eintrags
72
+ * @param string $url URL des Eintrags [optional]
73
+ */
74
+
75
+ public static function delete_item($hash, $url = '')
76
+ {
77
+ /* Leer? */
78
+ if ( empty($hash) ) {
79
+ wp_die('APC delete item: Empty input.');
80
+ }
81
+
82
+ /* Löschen */
83
+ apc_delete($hash);
84
+ }
85
+
86
+
87
+ /**
88
+ * Leerung des Cache
89
+ *
90
+ * @since 2.0
91
+ * @change 2.0
92
+ */
93
+
94
+ public static function clear_cache()
95
+ {
96
+ if ( extension_loaded('apc') ) {
97
+ apc_clear_cache('user');
98
+ }
99
+ }
100
+
101
+
102
+ /**
103
+ * Ausgabe des Cache
104
+ *
105
+ * @since 2.0
106
+ * @change 2.0
107
+ */
108
+
109
+ public static function print_cache()
110
+ {
111
+ return;
112
+ }
113
+
114
+
115
+ /**
116
+ * Ermittlung der Cache-Größe
117
+ *
118
+ * @since 2.0
119
+ * @change 2.0
120
+ *
121
+ * @return mixed $diff Cache-Größe
122
+ */
123
+
124
+ public static function get_stats()
125
+ {
126
+ /* Infos */
127
+ $data = apc_cache_info('user');
128
+
129
+ /* Leer */
130
+ if ( empty($data['mem_size']) ) {
131
+ return NULL;
132
+ }
133
+
134
+ return $data['mem_size'];
135
+ }
136
+
137
+
138
+ /**
139
+ * Generierung der Signatur
140
+ *
141
+ * @since 2.0
142
+ * @change 2.0
143
+ *
144
+ * @return string $diff Signatur als String
145
+ */
146
+
147
+ private static function _cache_signatur()
148
+ {
149
+ return sprintf(
150
+ "\n\n<!-- %s\n%s @ %s -->",
151
+ 'Cachify | http://bit.ly/cachify',
152
+ 'APC Cache',
153
+ date_i18n(
154
+ 'd.m.Y H:i:s',
155
+ current_time('timestamp')
156
+ )
157
+ );
158
+ }
159
+ }
inc/cachify_db.class.php ADDED
@@ -0,0 +1,236 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+
4
+ /* Secure check */
5
+ if ( !class_exists('Cachify') ) {
6
+ die();
7
+ }
8
+
9
+
10
+ /**
11
+ * Cachify_DB
12
+ */
13
+
14
+ final class Cachify_DB {
15
+
16
+
17
+ /**
18
+ * Speicherung im Cache
19
+ *
20
+ * @since 2.0
21
+ * @change 2.0
22
+ *
23
+ * @param string $hash Hash des Eintrags
24
+ * @param string $data Inhalt des Eintrags
25
+ * @param integer $lifetime Lebensdauer des Eintrags
26
+ */
27
+
28
+ public static function store_item($hash, $data, $lifetime)
29
+ {
30
+ /* Leer? */
31
+ if ( empty($hash) or empty($data) ) {
32
+ wp_die('DB add item: Empty input.');
33
+ }
34
+
35
+ /* Store */
36
+ set_transient(
37
+ $hash,
38
+ array(
39
+ 'data' => $data,
40
+ 'meta' => array(
41
+ 'queries' => self::_page_queries(),
42
+ 'timer' => self::_page_timer(),
43
+ 'memory' => self::_page_memory(),
44
+ 'time' => current_time('timestamp')
45
+ )
46
+ ),
47
+ $lifetime
48
+ );
49
+ }
50
+
51
+
52
+ /**
53
+ * Lesen aus dem Cache
54
+ *
55
+ * @since 2.0
56
+ * @change 2.0
57
+ *
58
+ * @param string $hash Hash des Eintrags
59
+ * @return mixed $diff Wert des Eintrags
60
+ */
61
+
62
+ public static function get_item($hash)
63
+ {
64
+ /* Leer? */
65
+ if ( empty($hash) ) {
66
+ wp_die('DB get item: Empty input.');
67
+ }
68
+
69
+ return get_transient($hash);
70
+ }
71
+
72
+
73
+ /**
74
+ * Entfernung aus dem Cache
75
+ *
76
+ * @since 2.0
77
+ * @change 2.0
78
+ *
79
+ * @param string $hash Hash des Eintrags
80
+ * @param string $url URL des Eintrags [optional]
81
+ */
82
+
83
+ public static function delete_item($hash, $url = '')
84
+ {
85
+ /* Leer? */
86
+ if ( empty($hash) ) {
87
+ wp_die('DB delete item: Empty input.');
88
+ }
89
+
90
+ /* Löschen */
91
+ delete_transient($hash);
92
+ }
93
+
94
+
95
+ /**
96
+ * Leerung des Cache
97
+ *
98
+ * @since 2.0
99
+ * @change 2.0
100
+ */
101
+
102
+ public static function clear_cache()
103
+ {
104
+ /* Init */
105
+ global $wpdb;
106
+
107
+ /* Löschen */
108
+ $wpdb->query("DELETE FROM `" .$wpdb->options. "` WHERE `option_name` LIKE ('_transient%.cachify')");
109
+
110
+ /* Optimieren */
111
+ $wpdb->query("OPTIMIZE TABLE `" .$wpdb->options. "`");
112
+ }
113
+
114
+
115
+ /**
116
+ * Ausgabe des Cache
117
+ *
118
+ * @since 2.0
119
+ * @change 2.0
120
+ */
121
+
122
+ public static function print_cache(array $cache)
123
+ {
124
+ /* Content */
125
+ echo $cache['data'];
126
+
127
+ /* Signatur */
128
+ if ( isset($cache['meta']) ) {
129
+ echo self::_cache_signatur($cache['meta']);
130
+ }
131
+
132
+ /* Raus */
133
+ exit;
134
+ }
135
+
136
+
137
+ /**
138
+ * Ermittlung der Cache-Größe
139
+ *
140
+ * @since 2.0
141
+ * @change 2.0
142
+ *
143
+ * @return integer $diff Spaltengröße
144
+ */
145
+
146
+ public static function get_stats()
147
+ {
148
+ /* Init */
149
+ global $wpdb;
150
+
151
+ /* Auslesen */
152
+ return $wpdb->get_var(
153
+ "SELECT SUM( CHAR_LENGTH(option_value) ) FROM `" .$wpdb->options. "` WHERE `option_name` LIKE ('_transient%.cachify')"
154
+ );
155
+ }
156
+
157
+
158
+ /**
159
+ * Generierung der Signatur
160
+ *
161
+ * @since 2.0
162
+ * @change 2.0
163
+ *
164
+ * @param array $meta Inhalt der Metadaten
165
+ * @return string $diff Signatur als String
166
+ */
167
+
168
+ private static function _cache_signatur(array $meta)
169
+ {
170
+ return sprintf(
171
+ "\n\n<!--\n%s\n%s\n%s\n%s\n-->",
172
+ 'Cachify | http://bit.ly/cachify',
173
+ sprintf(
174
+ 'Ohne Plugin: %d DB-Anfragen, %s Sekunden, %s',
175
+ $meta['queries'],
176
+ $meta['timer'],
177
+ $meta['memory']
178
+ ),
179
+ sprintf(
180
+ 'Mit Plugin: %d DB-Anfragen, %s Sekunden, %s',
181
+ self::_page_queries(),
182
+ self::_page_timer(),
183
+ self::_page_memory()
184
+ ),
185
+ sprintf(
186
+ 'Generiert: %s zuvor',
187
+ human_time_diff($meta['time'], current_time('timestamp'))
188
+ )
189
+ );
190
+ }
191
+
192
+
193
+ /**
194
+ * Rückgabe der Query-Anzahl
195
+ *
196
+ * @since 0.1
197
+ * @change 2.0
198
+ *
199
+ * @return intval $diff Query-Anzahl
200
+ */
201
+
202
+ private static function _page_queries()
203
+ {
204
+ return $GLOBALS['wpdb']->num_queries;
205
+ }
206
+
207
+
208
+ /**
209
+ * Rückgabe der Ausführungszeit
210
+ *
211
+ * @since 0.1
212
+ * @change 2.0
213
+ *
214
+ * @return intval $diff Anzahl der Sekunden
215
+ */
216
+
217
+ private static function _page_timer()
218
+ {
219
+ return timer_stop(0, 2);
220
+ }
221
+
222
+
223
+ /**
224
+ * Rückgabe des Speicherverbrauchs
225
+ *
226
+ * @since 0.7
227
+ * @change 2.0
228
+ *
229
+ * @return string $diff Konvertierter Größenwert
230
+ */
231
+
232
+ private static function _page_memory()
233
+ {
234
+ return ( function_exists('memory_get_usage') ? size_format(memory_get_usage(), 2) : 0 );
235
+ }
236
+ }
inc/cachify_hdd.class.php ADDED
@@ -0,0 +1,348 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+
4
+ /* Secure check */
5
+ if ( !class_exists('Cachify') ) {
6
+ die();
7
+ }
8
+
9
+
10
+ /**
11
+ * Cachify_HDD
12
+ */
13
+
14
+ final class Cachify_HDD {
15
+
16
+
17
+ /**
18
+ * Speicherung im Cache
19
+ *
20
+ * @since 2.0
21
+ * @change 2.0
22
+ *
23
+ * @param string $hash Hash des Eintrags [optional]
24
+ * @param string $data Inhalt des Eintrags
25
+ * @param integer $lifetime Lebensdauer des Eintrags [optional]
26
+ */
27
+
28
+ public static function store_item($hash, $data, $lifetime)
29
+ {
30
+ /* Leer? */
31
+ if ( empty($data) ) {
32
+ wp_die('HDD add item: Empty input.');
33
+ }
34
+
35
+ /* Speichern */
36
+ self::_create_files(
37
+ $data . self::_cache_signatur()
38
+ );
39
+ }
40
+
41
+
42
+ /**
43
+ * Lesen aus dem Cache
44
+ *
45
+ * @since 2.0
46
+ * @change 2.0
47
+ *
48
+ * @return boolean $diff TRUE wenn Cache vorhanden
49
+ */
50
+
51
+ public static function get_item()
52
+ {
53
+ return is_readable( self::_file_html() );
54
+ }
55
+
56
+
57
+ /**
58
+ * Entfernen aus dem Cache
59
+ *
60
+ * @since 2.0
61
+ * @change 2.0
62
+ *
63
+ * @param string $hash Hash des Eintrags [optional]
64
+ * @param string $url URL des Eintrags
65
+ */
66
+
67
+ public static function delete_item($hash = '', $url)
68
+ {
69
+ /* Leer? */
70
+ if ( empty($url) ) {
71
+ wp_die('HDD delete item: Empty input.');
72
+ }
73
+
74
+ /* Löschen */
75
+ self::_clear_dir(
76
+ self::_file_path($url)
77
+ );
78
+ }
79
+
80
+
81
+ /**
82
+ * Leerung des Cache
83
+ *
84
+ * @since 2.0
85
+ * @change 2.0
86
+ */
87
+
88
+ public static function clear_cache()
89
+ {
90
+ self::_clear_dir(
91
+ CACHIFY_CACHE_DIR
92
+ );
93
+ }
94
+
95
+
96
+ /**
97
+ * Ausgabe des Cache
98
+ *
99
+ * @since 2.0
100
+ * @change 2.0
101
+ */
102
+
103
+ public static function print_cache()
104
+ {
105
+ return;
106
+ }
107
+
108
+
109
+ /**
110
+ * Ermittlung der Cache-Größe
111
+ *
112
+ * @since 2.0
113
+ * @change 2.0
114
+ *
115
+ * @return integer $diff Ordnergröße
116
+ */
117
+
118
+ public static function get_stats()
119
+ {
120
+ return self::_dir_size( CACHIFY_CACHE_DIR );
121
+ }
122
+
123
+
124
+ /**
125
+ * Generierung der Signatur
126
+ *
127
+ * @since 2.0
128
+ * @change 2.0
129
+ *
130
+ * @return string $diff Signatur als String
131
+ */
132
+
133
+ private static function _cache_signatur()
134
+ {
135
+ return sprintf(
136
+ "\n\n<!-- %s\n%s @ %s -->",
137
+ 'Cachify | http://bit.ly/cachify',
138
+ 'HDD Cache',
139
+ date_i18n(
140
+ 'd.m.Y H:i:s',
141
+ current_time('timestamp')
142
+ )
143
+ );
144
+ }
145
+
146
+
147
+ /**
148
+ * Initialisierung des Cache-Speichervorgangs
149
+ *
150
+ * @since 2.0
151
+ * @change 2.0
152
+ *
153
+ * @param string $data Cache-Inhalt
154
+ */
155
+
156
+ private static function _create_files($data)
157
+ {
158
+ /* Ordner anlegen */
159
+ if ( !wp_mkdir_p( self::_file_path() ) ) {
160
+ wp_die('Unable to create directory.');
161
+ }
162
+
163
+ /* Dateien schreiben */
164
+ self::_create_file( self::_file_html(), $data );
165
+ self::_create_file( self::_file_gzip(), gzencode($data, 9) );
166
+ }
167
+
168
+
169
+ /**
170
+ * Anlegen der Cache-Datei
171
+ *
172
+ * @since 2.0
173
+ * @change 2.0
174
+ *
175
+ * @param string $file Pfad der Cache-Datei
176
+ * @param string $data Cache-Inhalt
177
+ */
178
+
179
+ private static function _create_file($file, $data)
180
+ {
181
+ /* Beschreibbar? */
182
+ if ( !$handle = @fopen($file, 'wb') ) {
183
+ wp_die('Could not write file.');
184
+ }
185
+
186
+ /* Schreiben */
187
+ @fwrite($handle, $data);
188
+ fclose($handle);
189
+ clearstatcache();
190
+
191
+ /* Permissions */
192
+ $stat = @stat( dirname($file) );
193
+ $perms = $stat['mode'] & 0007777;
194
+ $perms = $perms & 0000666;
195
+ @chmod($file, $perms);
196
+ clearstatcache();
197
+ }
198
+
199
+
200
+ /**
201
+ * Rekrusive Leerung eines Ordners
202
+ *
203
+ * @since 2.0
204
+ * @change 2.0
205
+ *
206
+ * @param string $dir Ordnerpfad
207
+ */
208
+
209
+ private static function _clear_dir($dir) {
210
+ /* Ordner? */
211
+ if ( !is_dir($dir) ) {
212
+ return;
213
+ }
214
+
215
+ /* Einlesen */
216
+ $objects = array_diff(
217
+ scandir($dir),
218
+ array('..', '.')
219
+ );
220
+
221
+ /* Leer? */
222
+ if ( empty($objects) ) {
223
+ return;
224
+ }
225
+
226
+ /* Loopen */
227
+ foreach ( $objects as $object ) {
228
+ /* Um Pfad erweitern */
229
+ $object = $dir. DIRECTORY_SEPARATOR .$object;
230
+
231
+ /* Ordner/Datei */
232
+ if ( is_dir($object) ) {
233
+ self::_clear_dir($object);
234
+ } else {
235
+ unlink($object);
236
+ }
237
+ }
238
+
239
+ /* Killen */
240
+ @rmdir($dir);
241
+
242
+ /* Aufräumen */
243
+ clearstatcache();
244
+ }
245
+
246
+
247
+ /**
248
+ * Ermittlung der Ordnergröße
249
+ *
250
+ * @since 2.0
251
+ * @change 2.0
252
+ *
253
+ * @param string $dir Ordnerpfad
254
+ * @return mixed $size Ordnergröße
255
+ */
256
+
257
+ public static function _dir_size($dir = '.')
258
+ {
259
+ /* Ordner? */
260
+ if ( !is_dir($dir) ) {
261
+ return;
262
+ }
263
+
264
+ /* Einlesen */
265
+ $objects = array_diff(
266
+ scandir($dir),
267
+ array('..', '.')
268
+ );
269
+
270
+ /* Leer? */
271
+ if ( empty($objects) ) {
272
+ return;
273
+ }
274
+
275
+ /* Init */
276
+ $size = 0;
277
+
278
+ /* Loopen */
279
+ foreach ( $objects as $object ) {
280
+ /* Um Pfad erweitern */
281
+ $object = $dir. DIRECTORY_SEPARATOR .$object;
282
+
283
+ /* Ordner/Datei */
284
+ if ( is_dir($object) ) {
285
+ $size += self::_dir_size($object);
286
+ } else {
287
+ $size += filesize($object);
288
+ }
289
+ }
290
+
291
+ return $size;
292
+ }
293
+
294
+
295
+ /**
296
+ * Pfad der Cache-Datei
297
+ *
298
+ * @since 2.0
299
+ * @change 2.0
300
+ *
301
+ * @param string $path Request-URI oder Permalink [optional]
302
+ * @return string $diff Pfad zur Cache-Datei
303
+ */
304
+
305
+ private static function _file_path($path = NULL)
306
+ {
307
+ return sprintf(
308
+ '%s%s%s%s',
309
+ CACHIFY_CACHE_DIR,
310
+ DIRECTORY_SEPARATOR,
311
+ $_SERVER['HTTP_HOST'],
312
+ parse_url(
313
+ ( $path ? $path : $_SERVER['REQUEST_URI'] ),
314
+ PHP_URL_PATH
315
+ )
316
+ );
317
+ }
318
+
319
+
320
+ /**
321
+ * Pfad der HTML-Datei
322
+ *
323
+ * @since 2.0
324
+ * @change 2.0
325
+ *
326
+ * @return string $diff Pfad zur HTML-Datei
327
+ */
328
+
329
+ private static function _file_html()
330
+ {
331
+ return self::_file_path(). 'index.html';
332
+ }
333
+
334
+
335
+ /**
336
+ * Pfad der GZIP-Datei
337
+ *
338
+ * @since 2.0
339
+ * @change 2.0
340
+ *
341
+ * @return string $diff Pfad zur GZIP-Datei
342
+ */
343
+
344
+ private static function _file_gzip()
345
+ {
346
+ return self::_file_path(). 'index.html.gz';
347
+ }
348
+ }
readme.txt ADDED
@@ -0,0 +1,128 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ === Cachify ===
2
+ Contributors: sergej.mueller
3
+ Tags: apc, cache, caching, performance
4
+ Donate link: http://flattr.com/profile/sergej.mueller
5
+ Requires at least: 3.1
6
+ Tested up to: 3.4
7
+ Stable tag: trunk
8
+
9
+
10
+
11
+ Turbo für WordPress. Smarte, aber effiziente Cache-Lösung für WordPress. Mit der Konzentration aufs Wesentliche.
12
+
13
+
14
+
15
+ == Description ==
16
+
17
+ = Unkompliziert und ausbaufähig =
18
+ *Cachify* optimiert Ladezeit der Blogseiten, indem Seiteninhalte in statischer Form wahlweise in der Datenbank, auf der Festplatte des Webservers oder im APC (Alternative PHP Cache) abgelegt und beim Seitenaufruf ohne Umwege ausgegeben werden. Die Anzahl der DB-Anfragen und PHP-Anweisungen reduziert sich je nach Methode um Faktor 10.
19
+
20
+ = Stärken =
21
+ * Speicherungsmethoden: DB, HDD und APC
22
+ * "Cache leeren" in der Admin Bar
23
+ * Inline- und Online-Handbuch
24
+ * Optionale Komprimierung der HTML-Ausgabe
25
+ * Ausnahmelisten für Beiträge und User Agents
26
+ * Manueller und automatischer Cache-Reset
27
+ * Ausgabe der "davor, danach" Informationen im Quelltext
28
+ * Verständliche Oberfläche zum Sofortstart
29
+ * Automatisches Management des Cache-Bestandes
30
+ * Cache-Belegung auf dem Dashboard
31
+
32
+ = Information =
33
+ * [Offizielle Homepage](http://cachify.de "Cachify WordPress Cache")
34
+ * [Online-Dokumentation](http://playground.ebiene.de/cachify-wordpress-cache/ "Cachify Online-Doku")
35
+
36
+ = Autor =
37
+ * [Google+](https://plus.google.com/110569673423509816572 "Google+")
38
+ * [Portfolio](http://ebiene.de "Portfolio")
39
+
40
+
41
+
42
+ == Changelog ==
43
+
44
+ = 2.0.1 =
45
+ * Verbesserter Autoload-Prozess
46
+ * Diverse Umbenennungen der Optionen
47
+ * Cache-Neuaufbau bei geplanten Beiträgen (Cachify DB)
48
+
49
+ = 2.0 =
50
+ * Überarbeitung der GUI
51
+ * Source Code-Modularisierung
52
+ * Cache-Größe auf dem Dashboard
53
+ * Festplatte als Ablageort für Cache
54
+ * Produktseite online: http://cachify.de
55
+ * Cache-Neuaufbau bei Kommentarstatusänderungen
56
+ * APC-Anforderungen: APC 3.0.0, empfohlen 3.1.4
57
+ * Optional: Kein Cache für kommentierende Nutzer
58
+ * Schnellübersicht der Optionen als Inline-Hilfe
59
+ * Mindestanforderungen: WordPress 3.1 & PHP 5.1.2
60
+
61
+ = 1.5.1 =
62
+ * `zlib.output_compression = Off` für Apache Webserver
63
+
64
+ = 1.5 =
65
+ * Überarbeitung des Regexp für HTML-Minify
66
+ * Reduzierung des Toolbar-Buttons auf das Icon
67
+ * Formatierung und Kommentierung des Quelltextes
68
+
69
+ = 1.4 =
70
+ * Xmas Edition
71
+
72
+ = 1.3 =
73
+ * Unterstützung für APC (Alternative PHP Cache)
74
+ * Umpositionierung des Admin Bar Buttons
75
+
76
+ = 1.2.1 =
77
+ * Icon für die "Cache leeren" Schaltfläche in der Admin Bar
78
+
79
+ = 1.2 =
80
+ * Schaltfläche "Cache leeren" in der Adminbar (ab WordPress 3.1)
81
+ * `flush_cache` auf public gesetzt, um von [wpSEO](http://wpseo.de "WordPress SEO Plugin") ansprechen zu können
82
+ * Ausführliche Tests unter WordPress 3.3
83
+
84
+ = 1.1 =
85
+ * Interne Prüfung auf fehlerhafte Cache-Generierung
86
+ * Anpassungen an der Code-Struktur
87
+ * Entfernung der Inline-Hilfe
88
+ * Verknüpfung der Online-Hilfe mit Optionen
89
+
90
+ = 1.0 =
91
+ * Leerung des Cache beim Aktualisieren von statischen Seiten
92
+ * Seite mit Plugin-Einstellungen
93
+ * Inline-Dokumentation in der Optionsseite
94
+ * Ausschluss von Passwort-geschützten Seiten
95
+ * WordPress 3.2 Support
96
+ * Unterstützung der WordPress Multisite Blogs
97
+ * Umstellung auf den template_redirect-Hook (Plugin-Kompatibilität)
98
+ * Interne Code-Bereinigung
99
+
100
+ = 0.9.2 =
101
+ * HTML-Kompression
102
+ * Flattr-Link
103
+
104
+ = 0.9.1 =
105
+ * Cache-Reset bei geplanten Beiträgen
106
+ * Unterstützung für das Carrington-Mobile Theme
107
+
108
+ = 0.9 =
109
+ * Workaround für Redirects
110
+
111
+ = 0.8 =
112
+ * Blacklist für PostIDs
113
+ * Blacklist für UserAgents
114
+ * Ausnahme für WP Touch
115
+ * Ausgabe des Zeitpunktes der Generierung
116
+ * Umbenennung der Konstanten
117
+
118
+ = 0.7 =
119
+ * Ausgabe des Speicherverbrauchs
120
+
121
+ = 0.6 =
122
+ * Live auf wordpress.org
123
+
124
+
125
+
126
+ == Screenshots ==
127
+
128
+ 1. Cachify Optionen
screenshot-1.png ADDED
Binary file