Deployed e3be2c0 to 5.4 with MkDocs 1.1.2 and mike 0.5.5
[GitHub/WoltLab/woltlab.github.io.git] / 5.4 / php / api / caches / index.html
CommitLineData
45ca63d0
TD
1
2<!doctype html>
3<html lang="en" class="no-js">
4 <head>
5
6 <meta charset="utf-8">
7 <meta name="viewport" content="width=device-width,initial-scale=1">
8
9
10
11
fb962f09
WG
12 <link rel="icon" href="../../../assets/default.favicon.ico">
13 <meta name="generator" content="mkdocs-1.1.2, mkdocs-material-7.1.0">
45ca63d0
TD
14
15
16
17 <title>Caches - WoltLab Suite Documentation</title>
18
19
20
fb962f09 21 <link rel="stylesheet" href="../../../assets/stylesheets/main.33e2939f.min.css">
45ca63d0
TD
22
23
fb962f09 24 <link rel="stylesheet" href="../../../assets/stylesheets/palette.ef6f36e2.min.css">
45ca63d0
TD
25
26
27
28 <meta name="theme-color" content="#009485">
29
30
31
32
33
fd8430cb
WG
34
35
45ca63d0
TD
36
37
38 <link rel="stylesheet" href="../../../stylesheets/extra.css">
39
40
41
42
43
44 </head>
45
46
47
48
49
50
51
52 <body dir="ltr" data-md-color-scheme="" data-md-color-primary="teal" data-md-color-accent="">
45ca63d0
TD
53
54
fb962f09
WG
55 <script>function __prefix(e){return new URL("../../..",location).pathname+"."+e}function __get(e,t=localStorage){return JSON.parse(t.getItem(__prefix(e)))}</script>
56
45ca63d0
TD
57 <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
58 <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
59 <label class="md-overlay" for="__drawer"></label>
60 <div data-md-component="skip">
61
62
63 <a href="#caches" class="md-skip">
64 Skip to content
65 </a>
66
67 </div>
68 <div data-md-component="announce">
69
70 <aside class="md-announce">
71 <div class="md-announce__inner md-grid md-typeset">
72
73 <a href="https://www.woltlab.com">Back to <strong>woltlab.com</strong></a>
74
75 </div>
76 </aside>
77
78 </div>
79
fb962f09 80 <header class="md-header" data-md-component="header">
45ca63d0 81 <nav class="md-header__inner md-grid" aria-label="Header">
fb962f09 82 <a href="../../.." title="WoltLab Suite Documentation" class="md-header__button md-logo" aria-label="WoltLab Suite Documentation" data-md-component="logo">
45ca63d0
TD
83
84 <img src="../../../assets/logo.png" alt="logo">
85
86 </a>
87 <label class="md-header__button md-icon" for="__drawer">
88 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2z"/></svg>
89 </label>
90 <div class="md-header__title" data-md-component="header-title">
91 <div class="md-header__ellipsis">
92 <div class="md-header__topic">
93 <span class="md-ellipsis">
94 WoltLab Suite Documentation
95 </span>
96 </div>
97 <div class="md-header__topic" data-md-component="header-topic">
98 <span class="md-ellipsis">
99
100 Caches
101
102 </span>
103 </div>
104 </div>
45ca63d0
TD
105 </div>
106
fb962f09
WG
107
108
a3639e76
WG
109 <label class="md-header__button md-icon" for="__search">
110 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5z"/></svg>
111 </label>
112
113<div class="md-search" data-md-component="search" role="dialog">
114 <label class="md-search__overlay" for="__search"></label>
115 <div class="md-search__inner" role="search">
116 <form class="md-search__form" name="search">
117 <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" data-md-state="active" required>
118 <label class="md-search__icon md-icon" for="__search">
119 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5z"/></svg>
120 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12z"/></svg>
121 </label>
122 <button type="reset" class="md-search__icon md-icon" aria-label="Clear" tabindex="-1">
fb962f09 123 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z"/></svg>
a3639e76
WG
124 </button>
125 </form>
126 <div class="md-search__output">
127 <div class="md-search__scrollwrap" data-md-scrollfix>
128 <div class="md-search-result" data-md-component="search-result">
129 <div class="md-search-result__meta">
130 Initializing search
131 </div>
132 <ol class="md-search-result__list"></ol>
133 </div>
134 </div>
135 </div>
136 </div>
137</div>
138
45ca63d0 139
7124f4cb
WG
140 <div class="md-header__source">
141
142<a href="https://github.com/WoltLab/docs.woltlab.com/" title="Go to repository" class="md-source" data-md-component="source">
143 <div class="md-source__icon md-icon">
144
fb962f09 145 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z"/></svg>
7124f4cb
WG
146 </div>
147 <div class="md-source__repository">
148 GitHub
149 </div>
150</a>
151 </div>
152
45ca63d0
TD
153 </nav>
154</header>
155
156 <div class="md-container" data-md-component="container">
157
158
159
160
161 <main class="md-main" data-md-component="main">
162 <div class="md-main__inner md-grid">
163
164
165
166 <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
167 <div class="md-sidebar__scrollwrap">
168 <div class="md-sidebar__inner">
169
170
171
45ca63d0
TD
172<nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
173 <label class="md-nav__title" for="__drawer">
fb962f09 174 <a href="../../.." title="WoltLab Suite Documentation" class="md-nav__button md-logo" aria-label="WoltLab Suite Documentation" data-md-component="logo">
45ca63d0
TD
175
176 <img src="../../../assets/logo.png" alt="logo">
177
178 </a>
179 WoltLab Suite Documentation
180 </label>
181
7124f4cb
WG
182 <div class="md-nav__source">
183
184<a href="https://github.com/WoltLab/docs.woltlab.com/" title="Go to repository" class="md-source" data-md-component="source">
185 <div class="md-source__icon md-icon">
186
fb962f09 187 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z"/></svg>
7124f4cb
WG
188 </div>
189 <div class="md-source__repository">
190 GitHub
191 </div>
192</a>
193 </div>
194
45ca63d0
TD
195 <ul class="md-nav__list" data-md-scrollfix>
196
197
198
199
200
201
202
203
204 <li class="md-nav__item">
205 <a href="../../../getting-started/" class="md-nav__link">
206 Getting Started
207 </a>
208 </li>
209
210
211
212
213
214
215
216
217
218
219
220
221
222 <li class="md-nav__item md-nav__item--active md-nav__item--nested">
223
224
225 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2" type="checkbox" id="__nav_2" checked>
226
227 <label class="md-nav__link" for="__nav_2">
228 PHP API
229 <span class="md-nav__icon md-icon"></span>
230 </label>
231 <nav class="md-nav" aria-label="PHP API" data-md-level="1">
232 <label class="md-nav__title" for="__nav_2">
233 <span class="md-nav__icon md-icon"></span>
234 PHP API
235 </label>
236 <ul class="md-nav__list" data-md-scrollfix>
237
238
239
240
241
242 <li class="md-nav__item">
243 <a href="../../pages/" class="md-nav__link">
244 Pages
245 </a>
246 </li>
247
248
249
250
251
252
253
254 <li class="md-nav__item">
255 <a href="../../database-objects/" class="md-nav__link">
256 Database Objects
257 </a>
258 </li>
259
260
261
262
263
264
265
266 <li class="md-nav__item">
267 <a href="../../database-access/" class="md-nav__link">
268 Database Access
269 </a>
270 </li>
271
272
273
274
275
276
277
278 <li class="md-nav__item">
279 <a href="../../exceptions/" class="md-nav__link">
280 Exceptions
281 </a>
282 </li>
283
284
285
286
287
288
289
290
291
292
293 <li class="md-nav__item md-nav__item--active md-nav__item--nested">
294
295
296 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_5" type="checkbox" id="__nav_2_5" checked>
297
298 <label class="md-nav__link" for="__nav_2_5">
299 API
300 <span class="md-nav__icon md-icon"></span>
301 </label>
302 <nav class="md-nav" aria-label="API" data-md-level="2">
303 <label class="md-nav__title" for="__nav_2_5">
304 <span class="md-nav__icon md-icon"></span>
305 API
306 </label>
307 <ul class="md-nav__list" data-md-scrollfix>
308
309
310
311
312
313
314
315 <li class="md-nav__item md-nav__item--active">
316
317 <input class="md-nav__toggle md-toggle" data-md-toggle="toc" type="checkbox" id="__toc">
318
319
320
321
322 <label class="md-nav__link md-nav__link--active" for="__toc">
323 Caches
324 <span class="md-nav__icon md-icon"></span>
325 </label>
326
327 <a href="./" class="md-nav__link md-nav__link--active">
328 Caches
329 </a>
330
331
332<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
333
334
335
336
337
338 <label class="md-nav__title" for="__toc">
339 <span class="md-nav__icon md-icon"></span>
340 Table of contents
341 </label>
342 <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
343
344 <li class="md-nav__item">
345 <a href="#understanding-caching" class="md-nav__link">
346 Understanding Caching
347 </a>
348
349 <nav class="md-nav" aria-label="Understanding Caching">
350 <ul class="md-nav__list">
351
352 <li class="md-nav__item">
353 <a href="#when-to-use-a-cache" class="md-nav__link">
354 When to Use a Cache
355 </a>
356
357</li>
358
359 <li class="md-nav__item">
360 <a href="#when-not-to-use-a-cache" class="md-nav__link">
361 When not to Use a Cache
362 </a>
363
364</li>
365
366 </ul>
367 </nav>
368
369</li>
370
371 </ul>
372
373</nav>
374
375 </li>
376
377
378
379
380
381
382
383 <li class="md-nav__item">
384 <a href="../comments/" class="md-nav__link">
385 Comments
386 </a>
387 </li>
388
389
390
391
392
393
394
395 <li class="md-nav__item">
396 <a href="../cronjobs/" class="md-nav__link">
397 Cronjobs
398 </a>
399 </li>
400
401
402
403
404
405
406
407 <li class="md-nav__item">
408 <a href="../events/" class="md-nav__link">
409 Events
410 </a>
411 </li>
412
413
414
415
416
417
418
419
420 <li class="md-nav__item md-nav__item--nested">
421
422
423 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_5_5" type="checkbox" id="__nav_2_5_5" >
424
425 <label class="md-nav__link" for="__nav_2_5_5">
426 Form Builder
427 <span class="md-nav__icon md-icon"></span>
428 </label>
429 <nav class="md-nav" aria-label="Form Builder" data-md-level="3">
430 <label class="md-nav__title" for="__nav_2_5_5">
431 <span class="md-nav__icon md-icon"></span>
432 Form Builder
433 </label>
434 <ul class="md-nav__list" data-md-scrollfix>
435
436
437
438
439
440 <li class="md-nav__item">
441 <a href="../form_builder/overview/" class="md-nav__link">
442 Overview
443 </a>
444 </li>
445
446
447
448
449
450
451
452 <li class="md-nav__item">
453 <a href="../form_builder/structure/" class="md-nav__link">
454 Structure
455 </a>
456 </li>
457
458
459
460
461
462
463
464 <li class="md-nav__item">
465 <a href="../form_builder/form_fields/" class="md-nav__link">
466 Fields
467 </a>
468 </li>
469
470
471
472
473
474
475
476 <li class="md-nav__item">
477 <a href="../form_builder/validation_data/" class="md-nav__link">
478 Validation and Data
479 </a>
480 </li>
481
482
483
484
485
486
487
488 <li class="md-nav__item">
489 <a href="../form_builder/dependencies/" class="md-nav__link">
490 Dependencies
491 </a>
492 </li>
493
494
495
496 </ul>
497 </nav>
498 </li>
499
500
501
502
503
504
505
506 <li class="md-nav__item">
507 <a href="../package_installation_plugins/" class="md-nav__link">
508 Package Installation Plugins
509 </a>
510 </li>
511
512
513
514
515
516
517
518 <li class="md-nav__item">
519 <a href="../user_activity_points/" class="md-nav__link">
520 User Activity Points
521 </a>
522 </li>
523
524
525
526
527
528
529
530 <li class="md-nav__item">
531 <a href="../user_notifications/" class="md-nav__link">
532 User Notifications
533 </a>
534 </li>
535
536
537
538
539
540
541
542 <li class="md-nav__item">
543 <a href="../sitemaps/" class="md-nav__link">
544 Sitemaps
545 </a>
546 </li>
547
548
549
550 </ul>
551 </nav>
552 </li>
553
554
555
556
557
558
559
560 <li class="md-nav__item">
561 <a href="../../code-style/" class="md-nav__link">
562 Code Style
563 </a>
564 </li>
565
566
567
568
569
570
571
572 <li class="md-nav__item">
573 <a href="../../apps/" class="md-nav__link">
574 Apps
575 </a>
576 </li>
577
578
579
580
581
582
583
584 <li class="md-nav__item">
585 <a href="../../gdpr/" class="md-nav__link">
586 GDPR
587 </a>
588 </li>
589
590
591
592 </ul>
593 </nav>
594 </li>
595
596
597
598
599
600
601
602
603
604
605
606 <li class="md-nav__item md-nav__item--nested">
607
608
609 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_3" type="checkbox" id="__nav_3" >
610
611 <label class="md-nav__link" for="__nav_3">
612 Languages, Templates & CSS
613 <span class="md-nav__icon md-icon"></span>
614 </label>
615 <nav class="md-nav" aria-label="Languages, Templates & CSS" data-md-level="1">
616 <label class="md-nav__title" for="__nav_3">
617 <span class="md-nav__icon md-icon"></span>
618 Languages, Templates & CSS
619 </label>
620 <ul class="md-nav__list" data-md-scrollfix>
621
622
623
624
625
626 <li class="md-nav__item">
627 <a href="../../../view/languages/" class="md-nav__link">
628 Languages
629 </a>
630 </li>
631
632
633
634
635
636
637
638 <li class="md-nav__item">
639 <a href="../../../view/templates/" class="md-nav__link">
640 Templates
641 </a>
642 </li>
643
644
645
646
647
648
649
650 <li class="md-nav__item">
651 <a href="../../../view/css/" class="md-nav__link">
652 CSS
653 </a>
654 </li>
655
656
657
658 </ul>
659 </nav>
660 </li>
661
662
663
664
665
666
667
668
669
670
671
672 <li class="md-nav__item md-nav__item--nested">
673
674
675 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4" type="checkbox" id="__nav_4" >
676
677 <label class="md-nav__link" for="__nav_4">
678 JavaScript API
679 <span class="md-nav__icon md-icon"></span>
680 </label>
681 <nav class="md-nav" aria-label="JavaScript API" data-md-level="1">
682 <label class="md-nav__title" for="__nav_4">
683 <span class="md-nav__icon md-icon"></span>
684 JavaScript API
685 </label>
686 <ul class="md-nav__list" data-md-scrollfix>
687
688
689
690
691
692 <li class="md-nav__item">
693 <a href="../../../javascript/general-usage/" class="md-nav__link">
694 General Usage
695 </a>
696 </li>
697
698
699
700
701
702
703
704
705 <li class="md-nav__item md-nav__item--nested">
706
707
708 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_2" type="checkbox" id="__nav_4_2" >
709
710 <label class="md-nav__link" for="__nav_4_2">
711 New API
712 <span class="md-nav__icon md-icon"></span>
713 </label>
714 <nav class="md-nav" aria-label="New API" data-md-level="2">
715 <label class="md-nav__title" for="__nav_4_2">
716 <span class="md-nav__icon md-icon"></span>
717 New API
718 </label>
719 <ul class="md-nav__list" data-md-scrollfix>
720
721
722
723
724
725 <li class="md-nav__item">
726 <a href="../../../javascript/new-api_writing-a-module/" class="md-nav__link">
727 Writing a module
728 </a>
729 </li>
730
731
732
733
734
735
736
737 <li class="md-nav__item">
738 <a href="../../../javascript/new-api_data-structures/" class="md-nav__link">
739 Data Structures
740 </a>
741 </li>
742
743
744
745
746
747
748
749 <li class="md-nav__item">
750 <a href="../../../javascript/new-api_core/" class="md-nav__link">
751 Core Functions
752 </a>
753 </li>
754
755
756
757
758
759
760
761 <li class="md-nav__item">
762 <a href="../../../javascript/new-api_dom/" class="md-nav__link">
763 DOM
764 </a>
765 </li>
766
767
768
769
770
771
772
773 <li class="md-nav__item">
774 <a href="../../../javascript/new-api_events/" class="md-nav__link">
775 Event Handling
776 </a>
777 </li>
778
779
780
781
782
783
784
785 <li class="md-nav__item">
786 <a href="../../../javascript/new-api_ajax/" class="md-nav__link">
787 Ajax
788 </a>
789 </li>
790
791
792
793
794
795
796
797 <li class="md-nav__item">
798 <a href="../../../javascript/new-api_dialogs/" class="md-nav__link">
799 Dialogs
800 </a>
801 </li>
802
803
804
805
806
807
808
809 <li class="md-nav__item">
810 <a href="../../../javascript/new-api_browser/" class="md-nav__link">
811 Browser and Screen Sizes
812 </a>
813 </li>
814
815
816
817
818
819
820
821 <li class="md-nav__item">
822 <a href="../../../javascript/new-api_ui/" class="md-nav__link">
823 User Interface
824 </a>
825 </li>
826
827
828
829 </ul>
830 </nav>
831 </li>
832
833
834
835
836
837
838
839 <li class="md-nav__item">
840 <a href="../../../javascript/legacy-api/" class="md-nav__link">
841 Legacy API
842 </a>
843 </li>
844
845
846
847
848
849
850
851 <li class="md-nav__item">
852 <a href="../../../javascript/helper-functions/" class="md-nav__link">
853 Helper Functions
854 </a>
855 </li>
856
857
858
859
860
861
862
863 <li class="md-nav__item">
864 <a href="../../../javascript/code-snippets/" class="md-nav__link">
865 Code Snippets
866 </a>
867 </li>
868
869
870
871 </ul>
872 </nav>
873 </li>
874
875
876
877
878
879
880
881
882
883
884
885 <li class="md-nav__item md-nav__item--nested">
886
887
888 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_5" type="checkbox" id="__nav_5" >
889
890 <label class="md-nav__link" for="__nav_5">
891 Package Components
892 <span class="md-nav__icon md-icon"></span>
893 </label>
894 <nav class="md-nav" aria-label="Package Components" data-md-level="1">
895 <label class="md-nav__title" for="__nav_5">
896 <span class="md-nav__icon md-icon"></span>
897 Package Components
898 </label>
899 <ul class="md-nav__list" data-md-scrollfix>
900
901
902
903
904
905 <li class="md-nav__item">
906 <a href="../../../package/package-xml/" class="md-nav__link">
907 package.xml
908 </a>
909 </li>
910
911
912
913
914
915
916
917
918 <li class="md-nav__item md-nav__item--nested">
919
920
921 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_5_2" type="checkbox" id="__nav_5_2" >
922
923 <label class="md-nav__link" for="__nav_5_2">
924 PIPs
925 <span class="md-nav__icon md-icon"></span>
926 </label>
927 <nav class="md-nav" aria-label="PIPs" data-md-level="2">
928 <label class="md-nav__title" for="__nav_5_2">
929 <span class="md-nav__icon md-icon"></span>
930 PIPs
931 </label>
932 <ul class="md-nav__list" data-md-scrollfix>
933
934
935
936
937
938 <li class="md-nav__item">
939 <a href="../../../package/pip/" class="md-nav__link">
940 Overview
941 </a>
942 </li>
943
944
945
946
947
948
949
950 <li class="md-nav__item">
951 <a href="../../../package/pip/acl-option/" class="md-nav__link">
952 aclOption
953 </a>
954 </li>
955
956
957
958
959
960
961
962 <li class="md-nav__item">
963 <a href="../../../package/pip/acp-menu/" class="md-nav__link">
964 acpMenu
965 </a>
966 </li>
967
968
969
970
971
972
973
974 <li class="md-nav__item">
975 <a href="../../../package/pip/acp-search-provider/" class="md-nav__link">
976 acpSearchProvider
977 </a>
978 </li>
979
980
981
982
983
984
985
986 <li class="md-nav__item">
987 <a href="../../../package/pip/acp-template/" class="md-nav__link">
988 acpTemplate
989 </a>
990 </li>
991
992
993
994
995
996
997
998 <li class="md-nav__item">
999 <a href="../../../package/pip/bbcode/" class="md-nav__link">
1000 bbcode
1001 </a>
1002 </li>
1003
1004
1005
1006
1007
1008
1009
1010 <li class="md-nav__item">
1011 <a href="../../../package/pip/box/" class="md-nav__link">
1012 box
1013 </a>
1014 </li>
1015
1016
1017
1018
1019
1020
1021
1022 <li class="md-nav__item">
1023 <a href="../../../package/pip/clipboard-action/" class="md-nav__link">
1024 clipboardAction
1025 </a>
1026 </li>
1027
1028
1029
1030
1031
1032
1033
1034 <li class="md-nav__item">
1035 <a href="../../../package/pip/core-object/" class="md-nav__link">
1036 coreObject
1037 </a>
1038 </li>
1039
1040
1041
1042
1043
1044
1045
1046 <li class="md-nav__item">
1047 <a href="../../../package/pip/cronjob/" class="md-nav__link">
1048 cronjob
1049 </a>
1050 </li>
1051
1052
1053
1054
1055
1056
1057
1058 <li class="md-nav__item">
1059 <a href="../../../package/pip/event-listener/" class="md-nav__link">
1060 eventListener
1061 </a>
1062 </li>
1063
1064
1065
1066
1067
1068
1069
1070 <li class="md-nav__item">
1071 <a href="../../../package/pip/file/" class="md-nav__link">
1072 file
1073 </a>
1074 </li>
1075
1076
1077
1078
1079
1080
1081
1082 <li class="md-nav__item">
1083 <a href="../../../package/pip/language/" class="md-nav__link">
1084 language
1085 </a>
1086 </li>
1087
1088
1089
1090
1091
1092
1093
1094 <li class="md-nav__item">
1095 <a href="../../../package/pip/media-provider/" class="md-nav__link">
1096 mediaProvider
1097 </a>
1098 </li>
1099
1100
1101
1102
1103
1104
1105
1106 <li class="md-nav__item">
1107 <a href="../../../package/pip/menu/" class="md-nav__link">
1108 menu
1109 </a>
1110 </li>
1111
1112
1113
1114
1115
1116
1117
1118 <li class="md-nav__item">
1119 <a href="../../../package/pip/menu-item/" class="md-nav__link">
1120 menuItem
1121 </a>
1122 </li>
1123
1124
1125
1126
1127
1128
1129
1130 <li class="md-nav__item">
1131 <a href="../../../package/pip/object-type/" class="md-nav__link">
1132 objectType
1133 </a>
1134 </li>
1135
1136
1137
1138
1139
1140
1141
1142 <li class="md-nav__item">
1143 <a href="../../../package/pip/object-type-definition/" class="md-nav__link">
1144 objectTypeDefinition
1145 </a>
1146 </li>
1147
1148
1149
1150
1151
1152
1153
1154 <li class="md-nav__item">
1155 <a href="../../../package/pip/option/" class="md-nav__link">
1156 option
1157 </a>
1158 </li>
1159
1160
1161
1162
1163
1164
1165
1166 <li class="md-nav__item">
1167 <a href="../../../package/pip/page/" class="md-nav__link">
1168 page
1169 </a>
1170 </li>
1171
1172
1173
1174
1175
1176
1177
1178 <li class="md-nav__item">
1179 <a href="../../../package/pip/pip/" class="md-nav__link">
1180 pip
1181 </a>
1182 </li>
1183
1184
1185
1186
1187
1188
1189
1190 <li class="md-nav__item">
1191 <a href="../../../package/pip/script/" class="md-nav__link">
1192 script
1193 </a>
1194 </li>
1195
1196
1197
1198
1199
1200
1201
1202 <li class="md-nav__item">
1203 <a href="../../../package/pip/smiley/" class="md-nav__link">
1204 smiley
1205 </a>
1206 </li>
1207
1208
1209
1210
1211
1212
1213
1214 <li class="md-nav__item">
1215 <a href="../../../package/pip/sql/" class="md-nav__link">
1216 sql
1217 </a>
1218 </li>
1219
1220
1221
1222
1223
1224
1225
1226 <li class="md-nav__item">
1227 <a href="../../../package/pip/style/" class="md-nav__link">
1228 style
1229 </a>
1230 </li>
1231
1232
1233
1234
1235
1236
1237
1238 <li class="md-nav__item">
1239 <a href="../../../package/pip/template/" class="md-nav__link">
1240 template
1241 </a>
1242 </li>
1243
1244
1245
1246
1247
1248
1249
1250 <li class="md-nav__item">
1251 <a href="../../../package/pip/template-listener/" class="md-nav__link">
1252 templateListener
1253 </a>
1254 </li>
1255
1256
1257
1258
1259
1260
1261
1262 <li class="md-nav__item">
1263 <a href="../../../package/pip/user-group-option/" class="md-nav__link">
1264 userGroupOption
1265 </a>
1266 </li>
1267
1268
1269
1270
1271
1272
1273
1274 <li class="md-nav__item">
1275 <a href="../../../package/pip/user-menu/" class="md-nav__link">
1276 userMenu
1277 </a>
1278 </li>
1279
1280
1281
1282
1283
1284
1285
1286 <li class="md-nav__item">
1287 <a href="../../../package/pip/user-notification-event/" class="md-nav__link">
1288 userNotificationEvent
1289 </a>
1290 </li>
1291
1292
1293
1294
1295
1296
1297
1298 <li class="md-nav__item">
1299 <a href="../../../package/pip/user-option/" class="md-nav__link">
1300 userOption
1301 </a>
1302 </li>
1303
1304
1305
1306
1307
1308
1309
1310 <li class="md-nav__item">
1311 <a href="../../../package/pip/user-profile-menu/" class="md-nav__link">
1312 userProfileMenu
1313 </a>
1314 </li>
1315
1316
1317
1318 </ul>
1319 </nav>
1320 </li>
1321
1322
1323
1324
1325
1326
1327
1328 <li class="md-nav__item">
1329 <a href="../../../package/database-php-api/" class="md-nav__link">
1330 Database PHP API
1331 </a>
1332 </li>
1333
1334
1335
1336 </ul>
1337 </nav>
1338 </li>
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350 <li class="md-nav__item md-nav__item--nested">
1351
1352
1353 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_6" type="checkbox" id="__nav_6" >
1354
1355 <label class="md-nav__link" for="__nav_6">
1356 Migration
1357 <span class="md-nav__icon md-icon"></span>
1358 </label>
1359 <nav class="md-nav" aria-label="Migration" data-md-level="1">
1360 <label class="md-nav__title" for="__nav_6">
1361 <span class="md-nav__icon md-icon"></span>
1362 Migration
1363 </label>
1364 <ul class="md-nav__list" data-md-scrollfix>
1365
1366
1367
1368
1369
1370
1371 <li class="md-nav__item md-nav__item--nested">
1372
1373
1374 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_6_1" type="checkbox" id="__nav_6_1" >
1375
1376 <label class="md-nav__link" for="__nav_6_1">
1377 Migrating from WSC 5.3
1378 <span class="md-nav__icon md-icon"></span>
1379 </label>
1380 <nav class="md-nav" aria-label="Migrating from WSC 5.3" data-md-level="2">
1381 <label class="md-nav__title" for="__nav_6_1">
1382 <span class="md-nav__icon md-icon"></span>
1383 Migrating from WSC 5.3
1384 </label>
1385 <ul class="md-nav__list" data-md-scrollfix>
1386
1387
1388
1389
1390
1391 <li class="md-nav__item">
1392 <a href="../../../migration/wsc53/php/" class="md-nav__link">
1393 PHP API
1394 </a>
1395 </li>
1396
1397
1398
1399
1400
1401
1402
1403 <li class="md-nav__item">
1404 <a href="../../../migration/wsc53/session/" class="md-nav__link">
1405 Session Handling and Authentication
1406 </a>
1407 </li>
1408
1409
1410
1411
1412
1413
1414
1415 <li class="md-nav__item">
1416 <a href="../../../migration/wsc53/javascript/" class="md-nav__link">
1417 JavaScript
1418 </a>
1419 </li>
1420
1421
1422
1423
1424
1425
1426
1427 <li class="md-nav__item">
1428 <a href="../../../migration/wsc53/templates/" class="md-nav__link">
1429 Templates
1430 </a>
1431 </li>
1432
1433
1434
1435
1436
1437
1438
1439 <li class="md-nav__item">
1440 <a href="../../../migration/wsc53/libraries/" class="md-nav__link">
1441 Third Party Libraries
1442 </a>
1443 </li>
1444
1445
1446
1447 </ul>
1448 </nav>
1449 </li>
1450
1451
1452
1453
1454
1455
1456
1457
1458 <li class="md-nav__item md-nav__item--nested">
1459
1460
1461 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_6_2" type="checkbox" id="__nav_6_2" >
1462
1463 <label class="md-nav__link" for="__nav_6_2">
1464 Migrating from WSC 5.2
1465 <span class="md-nav__icon md-icon"></span>
1466 </label>
1467 <nav class="md-nav" aria-label="Migrating from WSC 5.2" data-md-level="2">
1468 <label class="md-nav__title" for="__nav_6_2">
1469 <span class="md-nav__icon md-icon"></span>
1470 Migrating from WSC 5.2
1471 </label>
1472 <ul class="md-nav__list" data-md-scrollfix>
1473
1474
1475
1476
1477
1478 <li class="md-nav__item">
1479 <a href="../../../migration/wsc52/php/" class="md-nav__link">
1480 PHP API
1481 </a>
1482 </li>
1483
1484
1485
1486
1487
1488
1489
1490 <li class="md-nav__item">
1491 <a href="../../../migration/wsc52/templates/" class="md-nav__link">
1492 Templates and Languages
1493 </a>
1494 </li>
1495
1496
1497
1498
1499
1500
1501
1502 <li class="md-nav__item">
1503 <a href="../../../migration/wsc52/libraries/" class="md-nav__link">
1504 Third Party Libraries
1505 </a>
1506 </li>
1507
1508
1509
1510 </ul>
1511 </nav>
1512 </li>
1513
1514
1515
1516
1517
1518
1519
1520
1521 <li class="md-nav__item md-nav__item--nested">
1522
1523
1524 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_6_3" type="checkbox" id="__nav_6_3" >
1525
1526 <label class="md-nav__link" for="__nav_6_3">
1527 Migrating from WSC 3.1
1528 <span class="md-nav__icon md-icon"></span>
1529 </label>
1530 <nav class="md-nav" aria-label="Migrating from WSC 3.1" data-md-level="2">
1531 <label class="md-nav__title" for="__nav_6_3">
1532 <span class="md-nav__icon md-icon"></span>
1533 Migrating from WSC 3.1
1534 </label>
1535 <ul class="md-nav__list" data-md-scrollfix>
1536
1537
1538
1539
1540
1541 <li class="md-nav__item">
1542 <a href="../../../migration/wsc31/php/" class="md-nav__link">
1543 PHP API
1544 </a>
1545 </li>
1546
1547
1548
1549 </ul>
1550 </nav>
1551 </li>
1552
1553
1554
1555
1556
1557
1558
1559
1560 <li class="md-nav__item md-nav__item--nested">
1561
1562
1563 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_6_4" type="checkbox" id="__nav_6_4" >
1564
1565 <label class="md-nav__link" for="__nav_6_4">
1566 Migrating from WSC 3.0
1567 <span class="md-nav__icon md-icon"></span>
1568 </label>
1569 <nav class="md-nav" aria-label="Migrating from WSC 3.0" data-md-level="2">
1570 <label class="md-nav__title" for="__nav_6_4">
1571 <span class="md-nav__icon md-icon"></span>
1572 Migrating from WSC 3.0
1573 </label>
1574 <ul class="md-nav__list" data-md-scrollfix>
1575
1576
1577
1578
1579
1580 <li class="md-nav__item">
1581 <a href="../../../migration/wsc30/php/" class="md-nav__link">
1582 PHP API
1583 </a>
1584 </li>
1585
1586
1587
1588
1589
1590
1591
1592 <li class="md-nav__item">
1593 <a href="../../../migration/wsc30/javascript/" class="md-nav__link">
1594 JavaScript API
1595 </a>
1596 </li>
1597
1598
1599
1600
1601
1602
1603
1604 <li class="md-nav__item">
1605 <a href="../../../migration/wsc30/templates/" class="md-nav__link">
1606 Templates
1607 </a>
1608 </li>
1609
1610
1611
1612
1613
1614
1615
1616 <li class="md-nav__item">
1617 <a href="../../../migration/wsc30/css/" class="md-nav__link">
1618 CSS
1619 </a>
1620 </li>
1621
1622
1623
1624
1625
1626
1627
1628 <li class="md-nav__item">
1629 <a href="../../../migration/wsc30/package/" class="md-nav__link">
1630 Package Components
1631 </a>
1632 </li>
1633
1634
1635
1636 </ul>
1637 </nav>
1638 </li>
1639
1640
1641
1642
1643
1644
1645
1646
1647 <li class="md-nav__item md-nav__item--nested">
1648
1649
1650 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_6_5" type="checkbox" id="__nav_6_5" >
1651
1652 <label class="md-nav__link" for="__nav_6_5">
1653 Migrating from WCF 2.1
1654 <span class="md-nav__icon md-icon"></span>
1655 </label>
1656 <nav class="md-nav" aria-label="Migrating from WCF 2.1" data-md-level="2">
1657 <label class="md-nav__title" for="__nav_6_5">
1658 <span class="md-nav__icon md-icon"></span>
1659 Migrating from WCF 2.1
1660 </label>
1661 <ul class="md-nav__list" data-md-scrollfix>
1662
1663
1664
1665
1666
1667 <li class="md-nav__item">
1668 <a href="../../../migration/wcf21/php/" class="md-nav__link">
1669 PHP API
1670 </a>
1671 </li>
1672
1673
1674
1675
1676
1677
1678
1679 <li class="md-nav__item">
1680 <a href="../../../migration/wcf21/templates/" class="md-nav__link">
1681 Templates
1682 </a>
1683 </li>
1684
1685
1686
1687
1688
1689
1690
1691 <li class="md-nav__item">
1692 <a href="../../../migration/wcf21/css/" class="md-nav__link">
1693 CSS
1694 </a>
1695 </li>
1696
1697
1698
1699
1700
1701
1702
1703 <li class="md-nav__item">
1704 <a href="../../../migration/wcf21/package/" class="md-nav__link">
1705 Package Components
1706 </a>
1707 </li>
1708
1709
1710
1711 </ul>
1712 </nav>
1713 </li>
1714
1715
1716
1717 </ul>
1718 </nav>
1719 </li>
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731 <li class="md-nav__item md-nav__item--nested">
1732
1733
1734 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_7" type="checkbox" id="__nav_7" >
1735
1736 <label class="md-nav__link" for="__nav_7">
1737 Tutorials
1738 <span class="md-nav__icon md-icon"></span>
1739 </label>
1740 <nav class="md-nav" aria-label="Tutorials" data-md-level="1">
1741 <label class="md-nav__title" for="__nav_7">
1742 <span class="md-nav__icon md-icon"></span>
1743 Tutorials
1744 </label>
1745 <ul class="md-nav__list" data-md-scrollfix>
1746
1747
1748
1749
1750
1751
1752 <li class="md-nav__item md-nav__item--nested">
1753
1754
1755 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_7_1" type="checkbox" id="__nav_7_1" >
1756
1757 <label class="md-nav__link" for="__nav_7_1">
1758 Tutorial Series
1759 <span class="md-nav__icon md-icon"></span>
1760 </label>
1761 <nav class="md-nav" aria-label="Tutorial Series" data-md-level="2">
1762 <label class="md-nav__title" for="__nav_7_1">
1763 <span class="md-nav__icon md-icon"></span>
1764 Tutorial Series
1765 </label>
1766 <ul class="md-nav__list" data-md-scrollfix>
1767
1768
1769
1770
1771
1772 <li class="md-nav__item">
1773 <a href="../../../tutorial/series/overview/" class="md-nav__link">
1774 Overview
1775 </a>
1776 </li>
1777
1778
1779
1780
1781
1782
1783
1784 <li class="md-nav__item">
1785 <a href="../../../tutorial/series/part_1/" class="md-nav__link">
1786 Part 1
1787 </a>
1788 </li>
1789
1790
1791
1792
1793
1794
1795
1796 <li class="md-nav__item">
1797 <a href="../../../tutorial/series/part_2/" class="md-nav__link">
1798 Part 2
1799 </a>
1800 </li>
1801
1802
1803
1804
1805
1806
1807
1808 <li class="md-nav__item">
1809 <a href="../../../tutorial/series/part_3/" class="md-nav__link">
1810 Part 3
1811 </a>
1812 </li>
1813
1814
1815
1816 </ul>
1817 </nav>
1818 </li>
1819
1820
1821
1822 </ul>
1823 </nav>
1824 </li>
1825
1826
1827
1828 </ul>
1829</nav>
1830 </div>
1831 </div>
1832 </div>
1833
1834
1835
1836 <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
1837 <div class="md-sidebar__scrollwrap">
1838 <div class="md-sidebar__inner">
1839
1840<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
1841
1842
1843
1844
1845
1846 <label class="md-nav__title" for="__toc">
1847 <span class="md-nav__icon md-icon"></span>
1848 Table of contents
1849 </label>
1850 <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
1851
1852 <li class="md-nav__item">
1853 <a href="#understanding-caching" class="md-nav__link">
1854 Understanding Caching
1855 </a>
1856
1857 <nav class="md-nav" aria-label="Understanding Caching">
1858 <ul class="md-nav__list">
1859
1860 <li class="md-nav__item">
1861 <a href="#when-to-use-a-cache" class="md-nav__link">
1862 When to Use a Cache
1863 </a>
1864
1865</li>
1866
1867 <li class="md-nav__item">
1868 <a href="#when-not-to-use-a-cache" class="md-nav__link">
1869 When not to Use a Cache
1870 </a>
1871
1872</li>
1873
1874 </ul>
1875 </nav>
1876
1877</li>
1878
1879 </ul>
1880
1881</nav>
1882 </div>
1883 </div>
1884 </div>
1885
1886
1887 <div class="md-content" data-md-component="content">
1888 <article class="md-content__inner md-typeset">
1889
1890
9b8bddda 1891 <a href="https://github.com/WoltLab/docs.woltlab.com/edit/5.4/docs/php/api/caches.md" title="Edit this page" class="md-content__button md-icon">
7124f4cb
WG
1892 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20.71 7.04c.39-.39.39-1.04 0-1.41l-2.34-2.34c-.37-.39-1.02-.39-1.41 0l-1.84 1.83 3.75 3.75M3 17.25V21h3.75L17.81 9.93l-3.75-3.75L3 17.25z"/></svg>
1893 </a>
1894
45ca63d0
TD
1895
1896 <h1 id="caches">Caches<a class="headerlink" href="#caches" title="Permanent link">#</a></h1>
1897<p>WoltLab Suite offers two distinct types of caches:</p>
1898<ol>
1899<li><a href="../caches_persistent-caches/">Persistent caches</a> created by cache builders whose data can be stored using different cache sources.</li>
1900<li><a href="../caches_runtime-caches/">Runtime caches</a> store objects for the duration of a single request.</li>
1901</ol>
1902<h2 id="understanding-caching">Understanding Caching<a class="headerlink" href="#understanding-caching" title="Permanent link">#</a></h2>
1903<p>Every so often, plugins make use of cache builders or runtime caches to store
1904their data, even if there is absolutely no need for them to do so. Usually, this
1905involves a strong opinion about the total number of SQL queries on a page,
1906including but not limited to some magic treshold numbers, which should not be
1907exceeded for "performance reasons".</p>
1908<p>This misconception can easily lead into thinking that SQL queries should be
1909avoided or at least written to a cache, so that it doesn't need to be executed
1910so often. Unfortunately, this completely ignores the fact that both a single
1911query can take down your app (e. g. full table scan on millions of rows), but
191210 queries using a primary key on a table with a few hundred rows will not slow
1913down your page.</p>
1914<p>There are some queries that should go into caches by design, but most of the
1915cache builders weren't initially there, but instead have been added because
1916they were required to reduce the load <em>significantly</em>. You need to understand
1917that caches always come at a cost, even a runtime cache does! In particular,
1918they will always consume memory that is not released over the duration of the
1919request lifecycle and potentially even leak memory by holding references to
1920objects and data structures that are no longer required.</p>
1921<p>Caching should always be a solution for a problem.</p>
1922<h3 id="when-to-use-a-cache">When to Use a Cache<a class="headerlink" href="#when-to-use-a-cache" title="Permanent link">#</a></h3>
1923<p>It's difficult to provide a definite answer or checklist when to use a cache
1924and why it is required at this point, because the answer is: It depends. The
1925permission cache for user groups is a good example for a valid cache, where
1926we can achieve significant performance improvement compared to processing this
1927data on every request.</p>
1928<p>Its caches are build for each permutation of user group memberships that are
1929encountered for a page request. Building this data is an expensive process that
1930involves both inheritance and specific rules in regards to when a value for a
1931permission overrules another value. The added benefit of this cache is that one
1932cache usually serves a large number of users with the same group memberships and
1933by computing these permissions once, we can serve many different requests. Also,
1934the permissions are rather static values that change very rarely and thus we can
1935expect a very high cache lifetime before it gets rebuild.</p>
1936<h3 id="when-not-to-use-a-cache">When not to Use a Cache<a class="headerlink" href="#when-not-to-use-a-cache" title="Permanent link">#</a></h3>
1937<p>I remember, a few years ago, there was a plugin that displayed a user's character
1938from an online video game. The character sheet not only included a list of basic
1939statistics, but also displayed the items that this character was wearing and or
1940holding at the time.</p>
1941<p>The data for these items were downloaded in bulk from the game's vendor servers
1942and stored in a persistent cache file that periodically gets renewed. There is
1943nothing wrong with the idea of caching the data on your own server rather than
1944requesting them everytime from the vendor's servers - not only because they
1945imposed a limit on the number of requests per hour.</p>
1946<p>Unfortunately, the character sheet had a sub-par performance and the users were
1947upset by the significant loading times compared to literally every other page
1948on the same server. The author of the plugin was working hard to resolve this
1949issue and was evaluating all kind of methods to improve the page performance,
1950including deep-diving into the realm of micro-optimizations to squeeze out every
1951last bit of performance that is possible.</p>
1952<p>The real problem was the cache file itself, it turns out that it was holding the
1953data for several thousand items with a total file size of about 13 megabytes.
1954It doesn't look that much at first glance, after all this isn't the '90s anymore,
1955but unserializing a 13 megabyte array is really slow and looking up items in such
1956a large array isn't exactly fast either.</p>
1957<p>The solution was rather simple, the data that was fetched from the vendor's API
1958was instead written into a separate database table. Next, the persistent cache
1959was removed and the character sheet would now request the item data for that
1960specific character straight from the database. Previously, the character sheet
1961took several seconds to load and after the change it was done in a fraction of
1962a second. Although quite extreme, this illustrates a situation where the cache
1963file was introduced in the design process, without evaluating if the cache -
1964at least how it was implemented - was really necessary.</p>
1965<p>Caching should always be a solution for a problem. Not the other way around.</p>
1966
4a5c32e1
WG
1967
1968
1969
1970<hr>
1971<div class="md-source-date">
1972 <small>
1973
1974 Last update: 2021-01-08
1975
1976 </small>
1977</div>
1978
1979
45ca63d0
TD
1980
1981
1982
1983
1984
1985
1986 </article>
1987 </div>
1988 </div>
fb962f09 1989
45ca63d0
TD
1990 </main>
1991
1992
1993<footer class="md-footer">
1994
1995 <nav class="md-footer__inner md-grid" aria-label="Footer">
1996
1997 <a href="../../exceptions/" class="md-footer__link md-footer__link--prev" rel="prev">
1998 <div class="md-footer__button md-icon">
1999 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12z"/></svg>
2000 </div>
2001 <div class="md-footer__title">
2002 <div class="md-ellipsis">
2003 <span class="md-footer__direction">
2004 Previous
2005 </span>
2006 Exceptions
2007 </div>
2008 </div>
2009 </a>
2010
2011
2012 <a href="../comments/" class="md-footer__link md-footer__link--next" rel="next">
2013 <div class="md-footer__title">
2014 <div class="md-ellipsis">
2015 <span class="md-footer__direction">
2016 Next
2017 </span>
2018 Comments
2019 </div>
2020 </div>
2021 <div class="md-footer__button md-icon">
2022 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11H4z"/></svg>
2023 </div>
2024 </a>
2025
2026 </nav>
2027
2028 <div class="md-footer-meta md-typeset">
2029 <div class="md-footer-meta__inner md-grid">
2030 <div class="md-footer-copyright">
2031
2032 <div class="md-footer-copyright__highlight">
2033 Copyright © 2020 WoltLab GmbH
2034 </div>
2035
2036 Made with
2037 <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
2038 Material for MkDocs
2039 </a>
fb88dc6e 2040
45ca63d0
TD
2041 </div>
2042 <div class="md-footer-copyright">
2043 <a href="https://www.woltlab.com/legal-notice/">Legal Notice</a>
2044 <a href="https://www.woltlab.com/privacy-policy/">Privacy Policy</a>
2045</div>
2046 </div>
2047 </div>
2048</footer>
2049
2050 </div>
2051 <div class="md-dialog" data-md-component="dialog">
2052 <div class="md-dialog__inner md-typeset"></div>
2053 </div>
fb962f09 2054 <script id="__config" type="application/json">{"base": "../../..", "features": [], "translations": {"clipboard.copy": "Copy to clipboard", "clipboard.copied": "Copied to clipboard", "search.config.lang": "en", "search.config.pipeline": "trimmer, stopWordFilter", "search.config.separator": "[\\s\\-]+", "search.placeholder": "Search", "search.result.placeholder": "Type to start searching", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.term.missing": "Missing"}, "search": "../../../assets/javascripts/workers/search.fe42c31b.min.js", "version": {"provider": "mike"}}</script>
45ca63d0
TD
2055
2056
fb962f09 2057 <script src="../../../assets/javascripts/bundle.d892486b.min.js"></script>
45ca63d0
TD
2058
2059
2060 </body>
2061</html>