1
0
mirror of https://github.com/pierre42100/comunic synced 2025-07-15 22:38:13 +00:00

First commit

This commit is contained in:
Pierre Hubert
2016-11-19 12:08:12 +01:00
commit 990540b2b9
4706 changed files with 931207 additions and 0 deletions
.gitignore.htaccess
3rdparty
RestServer
analysing_page
crypt
fancyapps
gestionnaire_upload
luminous
.htaccess.travis.ymlCHANGES.markdownDoxyfileLICENSEREADME.markdownapi-docs.html
client
composer.json
docs
html
annotated.htmlbc_s.pngbdwn.pngclassLuminousEmbeddedWebScript-members.htmlclassLuminousEmbeddedWebScript.htmlclassLuminousEmbeddedWebScript__coll__graph.dotclassLuminousEmbeddedWebScript__coll__graph.md5classLuminousEmbeddedWebScript__inherit__graph.dotclassLuminousEmbeddedWebScript__inherit__graph.md5classLuminousFilters-members.htmlclassLuminousFilters.htmlclassLuminousOptions-members.htmlclassLuminousOptions.htmlclassLuminousScanner-members.htmlclassLuminousScanner.htmlclassLuminousScanner__coll__graph.dotclassLuminousScanner__coll__graph.md5classLuminousScanner__inherit__graph.dotclassLuminousScanner__inherit__graph.md5classLuminousSimpleScanner-members.htmlclassLuminousSimpleScanner.htmlclassLuminousSimpleScanner__coll__graph.dotclassLuminousSimpleScanner__coll__graph.md5classLuminousSimpleScanner__inherit__graph.dotclassLuminousSimpleScanner__inherit__graph.md5classLuminousStatefulScanner-members.htmlclassLuminousStatefulScanner.htmlclassLuminousStatefulScanner__coll__graph.dotclassLuminousStatefulScanner__coll__graph.md5classLuminousStatefulScanner__inherit__graph.dotclassLuminousStatefulScanner__inherit__graph.md5classLuminousStringSearch-members.htmlclassLuminousStringSearch.htmlclassLuminousTokenPresets-members.htmlclassLuminousTokenPresets.htmlclassLuminousUtils-members.htmlclassLuminousUtils.htmlclassScanner-members.htmlclassScanner.htmlclassScanner__inherit__graph.dotclassScanner__inherit__graph.md5classes.htmlclassluminous-members.htmlclassluminous.htmlclosed.pngdir_313caf1132e152dd9b58bea13a4052ca.htmldir_313caf1132e152dd9b58bea13a4052ca_dep.dotdir_313caf1132e152dd9b58bea13a4052ca_dep.md5dir_68267d1309a1af8e8297ef4c3efbcdba.htmldir_68267d1309a1af8e8297ef4c3efbcdba_dep.dotdir_68267d1309a1af8e8297ef4c3efbcdba_dep.md5dir_6dd2d287d08a289e9849dd6e2f6b9333.htmldir_6dd2d287d08a289e9849dd6e2f6b9333_dep.dotdir_6dd2d287d08a289e9849dd6e2f6b9333_dep.md5dir_aebb8dcc11953d78e620bbef0b9e2183.htmldir_aebb8dcc11953d78e620bbef0b9e2183_dep.dotdir_aebb8dcc11953d78e620bbef0b9e2183_dep.md5dir_c5f232a4203c130ceb9aba0edfa2d75b.htmldir_c5f232a4203c130ceb9aba0edfa2d75b_dep.dotdir_c5f232a4203c130ceb9aba0edfa2d75b_dep.md5doxygen.cssdoxygen.pngdynsections.jsfiles.htmlftv2blank.pngftv2cl.pngftv2doc.pngftv2folderclosed.pngftv2folderopen.pngftv2lastnode.pngftv2link.pngftv2mlastnode.pngftv2mnode.pngftv2mo.pngftv2node.pngftv2ns.pngftv2plastnode.pngftv2pnode.pngftv2splitbar.pngftv2vertline.pngfunctions.htmlfunctions_func.htmlfunctions_vars.htmlgraph_legend.dotgraph_legend.htmlgraph_legend.md5hierarchy.htmlindex.htmlinherit_graph_0.dotinherit_graph_0.md5inherit_graph_1.dotinherit_graph_1.md5inherit_graph_2.dotinherit_graph_2.md5inherit_graph_3.dotinherit_graph_3.md5inherit_graph_4.dotinherit_graph_4.md5inherit_graph_5.dotinherit_graph_5.md5inherit_graph_6.dotinherit_graph_6.md5inherits.htmljquery.jsnav_f.pngnav_g.pngnav_h.pngopen.pngscanner_8class_8php.html
search
sync_off.pngsync_on.pngtab_a.pngtab_b.pngtab_h.pngtab_s.pngtabs.css
site
examples
index.html
languages
luminous.php
src
style
supported.phpversioncheck.php
pdf.js
.gitattributes.gitignore.gitmodules.jshintignore.jshintrc.travis.ymlAUTHORSCONTRIBUTING.mdLICENSEREADME.md
docs
examples
extensions
external
.gitignore
bcmaps
.gitattributes78-EUC-H.bcmap78-EUC-V.bcmap78-H.bcmap78-RKSJ-H.bcmap78-RKSJ-V.bcmap78-V.bcmap78ms-RKSJ-H.bcmap78ms-RKSJ-V.bcmap83pv-RKSJ-H.bcmap90ms-RKSJ-H.bcmap90ms-RKSJ-V.bcmap90msp-RKSJ-H.bcmap90msp-RKSJ-V.bcmap90pv-RKSJ-H.bcmap90pv-RKSJ-V.bcmapAdd-H.bcmapAdd-RKSJ-H.bcmapAdd-RKSJ-V.bcmapAdd-V.bcmapAdobe-CNS1-0.bcmapAdobe-CNS1-1.bcmapAdobe-CNS1-2.bcmapAdobe-CNS1-3.bcmapAdobe-CNS1-4.bcmapAdobe-CNS1-5.bcmapAdobe-CNS1-6.bcmapAdobe-CNS1-UCS2.bcmapAdobe-GB1-0.bcmapAdobe-GB1-1.bcmapAdobe-GB1-2.bcmapAdobe-GB1-3.bcmapAdobe-GB1-4.bcmapAdobe-GB1-5.bcmapAdobe-GB1-UCS2.bcmapAdobe-Japan1-0.bcmapAdobe-Japan1-1.bcmapAdobe-Japan1-2.bcmapAdobe-Japan1-3.bcmapAdobe-Japan1-4.bcmapAdobe-Japan1-5.bcmapAdobe-Japan1-6.bcmapAdobe-Japan1-UCS2.bcmapAdobe-Korea1-0.bcmapAdobe-Korea1-1.bcmapAdobe-Korea1-2.bcmapAdobe-Korea1-UCS2.bcmapB5-H.bcmapB5-V.bcmapB5pc-H.bcmapB5pc-V.bcmapCNS-EUC-H.bcmapCNS-EUC-V.bcmapCNS1-H.bcmapCNS1-V.bcmapCNS2-H.bcmapCNS2-V.bcmapETHK-B5-H.bcmapETHK-B5-V.bcmapETen-B5-H.bcmapETen-B5-V.bcmapETenms-B5-H.bcmapETenms-B5-V.bcmapEUC-H.bcmapEUC-V.bcmapExt-H.bcmapExt-RKSJ-H.bcmapExt-RKSJ-V.bcmapExt-V.bcmapGB-EUC-H.bcmapGB-EUC-V.bcmapGB-H.bcmapGB-V.bcmapGBK-EUC-H.bcmapGBK-EUC-V.bcmapGBK2K-H.bcmapGBK2K-V.bcmapGBKp-EUC-H.bcmapGBKp-EUC-V.bcmapGBT-EUC-H.bcmapGBT-EUC-V.bcmapGBT-H.bcmapGBT-V.bcmapGBTpc-EUC-H.bcmapGBTpc-EUC-V.bcmapGBpc-EUC-H.bcmapGBpc-EUC-V.bcmapH.bcmapHKdla-B5-H.bcmapHKdla-B5-V.bcmapHKdlb-B5-H.bcmapHKdlb-B5-V.bcmapHKgccs-B5-H.bcmapHKgccs-B5-V.bcmapHKm314-B5-H.bcmapHKm314-B5-V.bcmapHKm471-B5-H.bcmapHKm471-B5-V.bcmapHKscs-B5-H.bcmapHKscs-B5-V.bcmapHankaku.bcmapHiragana.bcmapKSC-EUC-H.bcmapKSC-EUC-V.bcmapKSC-H.bcmapKSC-Johab-H.bcmapKSC-Johab-V.bcmapKSC-V.bcmapKSCms-UHC-H.bcmapKSCms-UHC-HW-H.bcmapKSCms-UHC-HW-V.bcmapKSCms-UHC-V.bcmapKSCpc-EUC-H.bcmapKSCpc-EUC-V.bcmapKatakana.bcmapLICENSENWP-H.bcmapNWP-V.bcmapRKSJ-H.bcmapRKSJ-V.bcmapRoman.bcmapUniCNS-UCS2-H.bcmapUniCNS-UCS2-V.bcmapUniCNS-UTF16-H.bcmapUniCNS-UTF16-V.bcmapUniCNS-UTF32-H.bcmapUniCNS-UTF32-V.bcmapUniCNS-UTF8-H.bcmapUniCNS-UTF8-V.bcmapUniGB-UCS2-H.bcmapUniGB-UCS2-V.bcmapUniGB-UTF16-H.bcmapUniGB-UTF16-V.bcmapUniGB-UTF32-H.bcmapUniGB-UTF32-V.bcmapUniGB-UTF8-H.bcmapUniGB-UTF8-V.bcmapUniJIS-UCS2-H.bcmapUniJIS-UCS2-HW-H.bcmapUniJIS-UCS2-HW-V.bcmapUniJIS-UCS2-V.bcmapUniJIS-UTF16-H.bcmapUniJIS-UTF16-V.bcmapUniJIS-UTF32-H.bcmapUniJIS-UTF32-V.bcmapUniJIS-UTF8-H.bcmapUniJIS-UTF8-V.bcmapUniJIS2004-UTF16-H.bcmapUniJIS2004-UTF16-V.bcmapUniJIS2004-UTF32-H.bcmapUniJIS2004-UTF32-V.bcmapUniJIS2004-UTF8-H.bcmapUniJIS2004-UTF8-V.bcmapUniJISPro-UCS2-HW-V.bcmapUniJISPro-UCS2-V.bcmapUniJISPro-UTF8-V.bcmapUniJISX0213-UTF32-H.bcmapUniJISX0213-UTF32-V.bcmapUniJISX02132004-UTF32-H.bcmapUniJISX02132004-UTF32-V.bcmapUniKS-UCS2-H.bcmapUniKS-UCS2-V.bcmapUniKS-UTF16-H.bcmapUniKS-UTF16-V.bcmapUniKS-UTF32-H.bcmapUniKS-UTF32-V.bcmapUniKS-UTF8-H.bcmapUniKS-UTF8-V.bcmapV.bcmapWP-Symbol.bcmap
builder
cmapscompress
crlfchecker
dist
importL10n
jasmine
webL10n
l10n
README.md
ach
af
ak
an
ar
as
ast
az
be
bg
bn-BD
bn-IN
br
bs
ca
cs
csb
cy
da
de
el
en-GB
en-US
en-ZA
eo
es-AR
es-CL
es-ES
es-MX
et
eu
fa
ff
fi
fr
fy-NL
ga-IE
gd
gl
gu-IN
he
hi-IN
hr
hu
hy-AM
id
is
it
ja
ka
kk
km
kn
ko
ku
lg
lij
lt
lv
mai
mk
ml
mn
mr
ms
my
nb-NO
nl
nn-NO
nso
oc
or
pa-IN
pl
pt-BR
pt-PT
rm
ro
ru
rw
sah
si
sk
sl
son
sq
sr
sv-SE
sw
ta-LK
ta
te
th
tl
tn
tr
uk
ur
vi
wo
xh
zh-CN
zh-TW
zu
make.jspackage.jsonpdfjs.config
src
test
.gitignoredownloadutils.jsdriver.js
features
font
mozcentral
pdfs
.gitattributes.gitignore20130226130259.pdf.linkArabicCIDTrueType.pdfDiwanProfile.pdf.linkJST2007-5.pdf.linkP020121130574743273239.pdf.linkS2.pdfSFAA_Japanese.pdf.linkTAMReview.pdfTaroUTR50SortedList112.pdf.linkThuluthFeatures.pdfZapfDingbats.pdfaboutstacks.pdf.linkalphatrans.pdfannotation-as.pdf.linkarial_unicode_ab_cidfont.pdfarial_unicode_en_cidfont.pdfartofwar.pdf.linkasciihexdecode.pdfbasicapi.pdfbpl13210.pdf.linkbug1011159.pdfbug1027533.pdfbug1028735.pdfbug1046314.pdfbug1050040.pdfbug1064894.pdf.linkbug1065245.pdfbug1072164.pdf.linkbug1077808.pdf.linkbug1108301.pdfbug1108753.pdf.linkbug1140761.pdf.linkbug1142033.pdf.linkbug1157493.pdfbug766138.pdf.linkbug808084.pdf.linkbug847420.pdfbug850854.pdfbug859204.pdfbug860632.pdfbug864847.pdfbug865858.pdf.linkbug866395.pdfbug867484.pdf.linkbug868745.pdfbug878026.pdfbug878194.pdf.linkbug887152.pdf.linkbug888437.pdf.linkbug889327.pdf.linkbug893730.pdfbug894572.pdfbug900822.pdfbug903856.pdfbug911034.pdfbug921760.pdf.linkbug946506.pdfcable.pdf.linkcanvas.pdfclose-path-bug.pdfcmykjpeg.pdfcomplex_ttf_font.pdfdevicen.pdfecma262.pdf.linkendchar.pdfextgstate.pdff1040.pdf.linkfilled-background.pdffips197.pdf.linkfit11-talk.pdf.linkfranz.pdffreeculture.pdfgeothermal.pdf.linkgerman-umlaut.pdf.linkgesamt.pdf.linkglyph_accent.pdfgradientfill.pdfhelloworld-bad.pdfhmm.pdf.linkhtml5checker.pdf.linkhudsonsurvey.pdf.linki9.pdf.linkibwa-bad.pdf.linkichiji.pdf.linkintelisa.pdf.linkissue1002.pdfissue1010.pdf.linkissue1015.pdf.linkissue1049.pdf.linkissue1055.pdf.linkissue1096.pdf.linkissue1127.pdf.linkissue1133.pdf.linkissue1155.pdf.linkissue1169.pdf.linkissue1171.pdfissue1233.pdf.linkissue1243.pdf.linkissue1249.pdfissue1257.pdf.linkissue1293.pdf.linkissue1309.pdf.linkissue1317.pdf.linkissue1350.pdfissue1419.pdf.linkissue1466.pdf.linkissue1512.pdf.linkissue1597.pdf.linkissue1629.pdf.linkissue1655.pdf.linkissue1658.pdf.linkissue1685.pdf.linkissue1687.pdf.linkissue1709.pdf.linkissue1721.pdf.linkissue1729.pdf.linkissue1796.pdf.linkissue1810.pdf.linkissue1878.pdf.linkissue1905.pdfissue1912.pdf.linkissue1936.pdf.linkissue1998.pdf.linkissue2006.pdf.linkissue2074.pdfissue2099-1.pdfissue2128.pdf.linkissue2129.pdf.linkissue2139.pdf.linkissue2386.pdf.linkissue2391-1.pdfissue2391-2.pdfissue2442.pdf.linkissue2531.pdf.linkissue2537.pdf.linkissue2537r.pdfissue2627.pdf.linkissue2642.pdf.linkissue2770.pdf.linkissue2799.pdf.linkissue2829.pdf.linkissue2833.pdfissue2840.pdfissue2853.pdf.linkissue2881.pdf.linkissue2931.pdfissue2956.pdfissue2984.pdf.linkissue3025.pdfissue3062.pdf.linkissue3064.pdf.linkissue3115.pdf.linkissue3205.pdf.linkissue3207.pdf.linkissue3263.pdf.linkissue3323.pdfissue3371.pdfissue3384.pdf.linkissue3405.pdf.linkissue3427.pdf.linkissue3438.pdfissue3591.pdf.linkissue3666.pdf.linkissue3848.pdf.linkissue3879.pdf.linkissue3885.pdfissue3903.pdf.linkissue3925.pdf.linkissue3999.pdf.linkissue4061.pdfissue4246.pdfissue4304.pdfissue4379.pdfissue4436.pdf.linkissue4461.pdfissue4550.pdfissue4573.pdfissue4630.pdfissue4650.pdfissue4668.pdfissue4722.pdfissue4800.pdfissue4801.pdfissue4875.pdfissue4881.pdfissue4883.pdf.linkissue4926.pdf.linkissue4934.pdfissue5010.pdfissue5039.pdfissue5070.pdfissue5202.pdfissue5238.pdfissue5244.pdfissue5280.pdfissue5291.pdfissue5334.pdfissue5421.pdfissue5470.pdfissue5475.pdfissue5481.pdfissue5501.pdfissue5509.pdf.linkissue5549.pdfissue5567.pdfissue5592.pdf.linkissue5599.pdfissue5644.pdf.linkissue5701.pdfissue5704.pdfissue5726.pdf.linkissue5734.pdfissue5747.pdfissue5751.pdfissue5801.pdfissue5874.pdfissue5896.pdfissue5909.pdfissue5939.pdf.linkissue5954.pdfissue5972.pdfissue5994.pdfissue6010_1.pdfissue6010_2.pdfissue6068.pdfissue6081.pdfissue6099.pdfissue6117.pdf.linkissue818.pdf.linkissue840.pdfissue845.pdf.linkissue918.pdfissue919.pdf.linkissue925.pdfjai.pdf.linkjavauninstall-7.pdf.linkkdchart.pdf.linklink-annotation-border.pdf.linkliveprogramming.pdf.linkmao.pdf.linkmixedfonts.pdfmmtype1.pdfnoembed-eucjp.pdfnoembed-identity-2.pdfnoembed-identity.pdfnoembed-jis7.pdfnoembed-sjis.pdfocs.pdf.linkohkubo-SS04.pdf.linkpal-o47.pdf.linkpdf.pdf.linkpdfjsbad1586.pdfpdfkit_compressed.pdfpdkids.pdf.linkpersonwithdog.pdfpiperine.pdf.linkpreistabelle.pdf.linkprotectip.pdf.linkrotated.pdfrotation.pdfscan-bad.pdfshading_extend.pdfshavian.pdf.linksimpletype3font.pdfsizes.pdfsmaskdim.pdftcpdf_033.pdf.linktracemonkey.pdftutorial.pdf.linktxt2pdf.pdf.linktype4psfunc.pdfunix01.pdf.linkusmanm-bad.pdf.linkvertical.pdfvesta.pdf.linkwdsg_fitc.pdf.linkwnv_chinese.pdf.linkyo01.pdf.linkzerowidthline.pdf
resources
stats
test.jstest_manifest.jsontest_slave.htmltestutils.js
ttx
unit
webbrowser.jswebserver.js
viewer.php
web
.gitignoreannotations_layer_builder.jschromecom.jscompatibility.jscompressed.tracemonkey-pldi-09.pdfdebugger.jsdefault_preferences.jsdownload_manager.jsfirefoxcom.jsgrab_to_pan.jshand_tool.js
images
annotation-check.svgannotation-comment.svgannotation-help.svgannotation-insert.svgannotation-key.svgannotation-newparagraph.svgannotation-noicon.svgannotation-note.svgannotation-paragraph.svgfindbarButton-next-rtl.pngfindbarButton-next-rtl@2x.pngfindbarButton-next.pngfindbarButton-next@2x.pngfindbarButton-previous-rtl.pngfindbarButton-previous-rtl@2x.pngfindbarButton-previous.pngfindbarButton-previous@2x.pnggrab.curgrabbing.curloading-icon.gifloading-small.pngloading-small@2x.pngsecondaryToolbarButton-documentProperties.pngsecondaryToolbarButton-documentProperties@2x.pngsecondaryToolbarButton-firstPage.pngsecondaryToolbarButton-firstPage@2x.pngsecondaryToolbarButton-handTool.pngsecondaryToolbarButton-handTool@2x.pngsecondaryToolbarButton-lastPage.pngsecondaryToolbarButton-lastPage@2x.pngsecondaryToolbarButton-rotateCcw.pngsecondaryToolbarButton-rotateCcw@2x.pngsecondaryToolbarButton-rotateCw.pngsecondaryToolbarButton-rotateCw@2x.pngshadow.pngtexture.pngtoolbarButton-bookmark.pngtoolbarButton-bookmark@2x.pngtoolbarButton-download.pngtoolbarButton-download@2x.pngtoolbarButton-menuArrows.pngtoolbarButton-menuArrows@2x.pngtoolbarButton-openFile.pngtoolbarButton-openFile@2x.pngtoolbarButton-pageDown-rtl.pngtoolbarButton-pageDown-rtl@2x.pngtoolbarButton-pageDown.pngtoolbarButton-pageDown@2x.pngtoolbarButton-pageUp-rtl.pngtoolbarButton-pageUp-rtl@2x.pngtoolbarButton-pageUp.pngtoolbarButton-pageUp@2x.pngtoolbarButton-presentationMode.pngtoolbarButton-presentationMode@2x.pngtoolbarButton-print.pngtoolbarButton-print@2x.pngtoolbarButton-search.pngtoolbarButton-search@2x.pngtoolbarButton-secondaryToolbarToggle-rtl.pngtoolbarButton-secondaryToolbarToggle-rtl@2x.pngtoolbarButton-secondaryToolbarToggle.pngtoolbarButton-secondaryToolbarToggle@2x.pngtoolbarButton-sidebarToggle-rtl.pngtoolbarButton-sidebarToggle-rtl@2x.pngtoolbarButton-sidebarToggle.pngtoolbarButton-sidebarToggle@2x.pngtoolbarButton-viewAttachments.pngtoolbarButton-viewAttachments@2x.pngtoolbarButton-viewOutline-rtl.pngtoolbarButton-viewOutline-rtl@2x.pngtoolbarButton-viewOutline.pngtoolbarButton-viewOutline@2x.pngtoolbarButton-viewThumbnail.pngtoolbarButton-viewThumbnail@2x.pngtoolbarButton-zoomIn.pngtoolbarButton-zoomIn@2x.pngtoolbarButton-zoomOut.pngtoolbarButton-zoomOut@2x.png
interfaces.jsmozPrintCallback_polyfill.jsoverlay_manager.jspassword_prompt.jspdf_attachment_view.jspdf_document_properties.jspdf_find_bar.jspdf_find_controller.jspdf_history.jspdf_link_service.jspdf_outline_view.jspdf_page_view.jspdf_presentation_mode.jspdf_rendering_queue.jspdf_thumbnail_view.jspdf_thumbnail_viewer.jspdf_viewer.component.jspdf_viewer.csspdf_viewer.jspreferences.jssecondary_toolbar.jstext_layer_builder.csstext_layer_builder.jsui_utils.jsview_history.jsviewer-snippet-chrome-extension.htmlviewer-snippet-firefox-extension.htmlviewer-snippet-minified.htmlviewer-snippet-mozPrintCallback-polyfill.htmlviewer-snippet.htmlviewer.cssviewer.htmlviewer.js
phpmailer
.gitignore.scrutinizer.yml.travis.ymlLICENSEPHPMailerAutoload.phpREADME.mdchangelog.mdclass.phpmailer.phpclass.pop3.phpclass.smtp.phpcomposer.json
docs
examples
extras
language
test
travis.phpunit.xml.dist
tcpdf
CHANGELOG.TXTLICENSE.TXTREADME.TXTcomposer.json
config
examples
barcodes
config
data
example_001.phpexample_002.phpexample_003.phpexample_004.phpexample_005.phpexample_006.phpexample_007.phpexample_008.phpexample_009.phpexample_010.phpexample_011.phpexample_012.pdfexample_012.phpexample_013.phpexample_014.phpexample_015.phpexample_016.phpexample_017.phpexample_018.phpexample_019.phpexample_020.phpexample_021.phpexample_022.phpexample_023.phpexample_024.phpexample_025.phpexample_026.phpexample_027.phpexample_028.phpexample_029.phpexample_030.phpexample_031.phpexample_032.phpexample_033.phpexample_034.phpexample_035.phpexample_036.phpexample_037.phpexample_038.phpexample_039.phpexample_040.phpexample_041.phpexample_042.phpexample_043.phpexample_044.phpexample_045.phpexample_046.phpexample_047.phpexample_048.phpexample_049.phpexample_050.phpexample_051.phpexample_052.phpexample_053.phpexample_054.phpexample_055.phpexample_056.phpexample_057.phpexample_058.phpexample_059.phpexample_060.phpexample_061.phpexample_062.phpexample_063.phpexample_064.phpexample_065.php
images
index.php
lang
tcpdf_include.php
fonts
ae_fonts_2.0
aealarabiya.ctg.zaealarabiya.phpaealarabiya.zaefurat.ctg.zaefurat.phpaefurat.zcid0cs.phpcid0ct.phpcid0jp.phpcid0kr.phpcourier.phpcourierb.phpcourierbi.phpcourieri.php
dejavu-fonts-ttf-2.33
dejavusans.ctg.zdejavusans.phpdejavusans.zdejavusansb.ctg.zdejavusansb.phpdejavusansb.zdejavusansbi.ctg.zdejavusansbi.phpdejavusansbi.zdejavusanscondensed.ctg.zdejavusanscondensed.phpdejavusanscondensed.zdejavusanscondensedb.ctg.zdejavusanscondensedb.phpdejavusanscondensedb.zdejavusanscondensedbi.ctg.zdejavusanscondensedbi.phpdejavusanscondensedbi.zdejavusanscondensedi.ctg.zdejavusanscondensedi.phpdejavusanscondensedi.zdejavusansextralight.ctg.zdejavusansextralight.phpdejavusansextralight.zdejavusansi.ctg.zdejavusansi.phpdejavusansi.zdejavusansmono.ctg.zdejavusansmono.phpdejavusansmono.zdejavusansmonob.ctg.zdejavusansmonob.phpdejavusansmonob.zdejavusansmonobi.ctg.zdejavusansmonobi.phpdejavusansmonobi.zdejavusansmonoi.ctg.zdejavusansmonoi.phpdejavusansmonoi.zdejavuserif.ctg.zdejavuserif.phpdejavuserif.zdejavuserifb.ctg.zdejavuserifb.phpdejavuserifb.zdejavuserifbi.ctg.zdejavuserifbi.phpdejavuserifbi.zdejavuserifcondensed.ctg.zdejavuserifcondensed.phpdejavuserifcondensed.zdejavuserifcondensedb.ctg.zdejavuserifcondensedb.phpdejavuserifcondensedb.zdejavuserifcondensedbi.ctg.zdejavuserifcondensedbi.phpdejavuserifcondensedbi.zdejavuserifcondensedi.ctg.zdejavuserifcondensedi.phpdejavuserifcondensedi.zdejavuserifi.ctg.zdejavuserifi.phpdejavuserifi.z
freefont-20120503
freemono.ctg.zfreemono.phpfreemono.zfreemonob.ctg.zfreemonob.phpfreemonob.zfreemonobi.ctg.zfreemonobi.phpfreemonobi.zfreemonoi.ctg.zfreemonoi.phpfreemonoi.zfreesans.ctg.zfreesans.phpfreesans.zfreesansb.ctg.zfreesansb.phpfreesansb.zfreesansbi.ctg.zfreesansbi.phpfreesansbi.zfreesansi.ctg.zfreesansi.phpfreesansi.zfreeserif.ctg.zfreeserif.phpfreeserif.zfreeserifb.ctg.zfreeserifb.phpfreeserifb.zfreeserifbi.ctg.zfreeserifbi.phpfreeserifbi.zfreeserifi.ctg.zfreeserifi.phpfreeserifi.zhelvetica.phphelveticab.phphelveticabi.phphelveticai.phphysmyeongjostdmedium.phpkozgopromedium.phpkozminproregular.phpmsungstdlight.phppdfacourier.phppdfacourier.zpdfacourierb.phppdfacourierb.zpdfacourierbi.phppdfacourierbi.zpdfacourieri.phppdfacourieri.zpdfahelvetica.phppdfahelvetica.zpdfahelveticab.phppdfahelveticab.zpdfahelveticabi.phppdfahelveticabi.zpdfahelveticai.phppdfahelveticai.zpdfasymbol.phppdfasymbol.zpdfatimes.phppdfatimes.zpdfatimesb.phppdfatimesb.zpdfatimesbi.phppdfatimesbi.zpdfatimesi.phppdfatimesi.zpdfazapfdingbats.phppdfazapfdingbats.zstsongstdlight.phpsymbol.phptimes.phptimesb.phptimesbi.phptimesi.phpuni2cid_ac15.phpuni2cid_ag15.phpuni2cid_aj16.phpuni2cid_ak12.phpzapfdingbats.php
include
tcpdf.phptcpdf_autoconfig.phptcpdf_barcodes_1d.phptcpdf_barcodes_2d.phptcpdf_import.phptcpdf_parser.php
tools
video_js
README.mdacceuil-aide-en.htmlacceuil-aide-fr.htmlaction.phpaide.phpamis.phpapi.phparchive_private_chat.php
assets
audio
css
SpryMenuBar
SpryTabbedPanels.cssSpryTooltip.cssSpryValidationTextField.csschat.cssglobal.cssglobal.phpglobal_notifications.cssgrand_dialogue_smiley.cssheader_global.cssiconFont_2.cssie.css
imgareaselect
index.phpjquery.mobile-1.3.0.min.css
less
metro-bootstrap-responsive_2.cssmetro-bootstrap_2.cssmetro-icons_3.cssmetro_3.cssminifyURL.cssmobile-metro.cssmobile.cssprivate_chat_contener.cssprivatechat.css
themes
base
images
index.phpjquery-ui.cssjquery.ui.accordion.cssjquery.ui.all.cssjquery.ui.autocomplete.cssjquery.ui.base.cssjquery.ui.button.cssjquery.ui.core.cssjquery.ui.datepicker.cssjquery.ui.dialog.cssjquery.ui.menu.cssjquery.ui.progressbar.cssjquery.ui.resizable.cssjquery.ui.selectable.cssjquery.ui.slider.cssjquery.ui.spinner.cssjquery.ui.tabs.cssjquery.ui.theme.cssjquery.ui.tooltip.css
minified
index.php
warning_update.css
fonts
html
img
accepte_webcam.jpgaccepte_webcam_vide.jpg
acceuil
activer_webcam.pngadd_text.gifaime.pngaime_vide.pngaimeplus.pngbannercucc.gifbullet_arrow_right.pngbyethost.pngcapatcha.pngchargement.gifclose.gifcomments.pngcomunic_share_small_button_fr.jpgdelete.pngdelete_user.pngdiscover_comunic_modifie.pngdiscover_comunic_vierge.pngdiscover_private_chat.pngdisponible.pngecranvide.pngecranvide_old.pngedit.pngemail.png
ensembles
erreur.pngexclamation.png
fancybox
favicon.icofavicon_64.icofile_extension_pdf.pngformulaire_recherche.pngfrance.pnghelp.pnghelp_big.pnghome_login_background.pngimage_delete.pngimage_edit.png
img_actualite
index.phpindisponible.pnginterrogation.pnglock.pnglogo-facebook.pnglogo-youtube.pnglogo_comunic.pnglogo_comunic_services.pnglogoacceuil.jpglogomoderne.jpgmail_green.pngmini_logo_comunic.pngnew.pngnotification_old.pngnouveaute_user.pngpage_add.pngprendre_photo.pngpresentationrapide.pngpresentationrapide_old.pngprive.png
ps
raspberry-pi-logo.pngrefresh.pngsafe.pngsearch_accounts.pngset_password.pngshare.pngsharecomunic.png
small
smiley
anchor.pngandroid.pngapple.pngattach.pngaward_star_gold_green.pngbad.gifbeer.pngbell.pngbomb.pngbook.pngbook_open.pngbug.pngbus.pngcake.pngcamera_black.pngcd.pngcomputer.pngdevil_smile.gifemail.pngemotion_bigsmile.pngemotion_party.png
flag
flag_afghanistan.pngflag_albania.pngflag_algeria.pngflag_american_samoa.pngflag_andorra.pngflag_angola.pngflag_anguilla.pngflag_antigua_and_barbuda.pngflag_argentina.pngflag_armenia.pngflag_aruba.pngflag_australia.pngflag_austria.pngflag_azerbaijan.pngflag_bahamas.pngflag_bahrain.pngflag_bangladesh.pngflag_barbados.pngflag_belarus.pngflag_belgium.pngflag_belize.pngflag_benin.pngflag_bermuda.pngflag_bhutan.pngflag_bolivia.pngflag_bosnia.pngflag_botswana.pngflag_boy_scout.pngflag_brazil.pngflag_british_indian_ocean.pngflag_british_virgin_islands.pngflag_brunei.pngflag_bulgaria.pngflag_burkina_faso.pngflag_burma.pngflag_burundi.pngflag_cambodia.pngflag_cameroon.pngflag_canada.pngflag_cape_verde.pngflag_cayman_islands.pngflag_central_african_republic.pngflag_chad.pngflag_chile.pngflag_china.pngflag_colombia.pngflag_comoros.pngflag_congo_democratic_republic.pngflag_congo_republic.pngflag_cook_islands.pngflag_costa_rica.pngflag_cote_divoire.pngflag_croatia.pngflag_cuba.pngflag_cyprus.pngflag_czech_republic.pngflag_denmark.pngflag_djibouti.pngflag_dominica.pngflag_dominican_republic.pngflag_east_timor.pngflag_egypt.pngflag_el_salvador.pngflag_england.pngflag_equador.pngflag_equatorial_guinea.pngflag_eritrea.pngflag_estonia.pngflag_ethiopia.pngflag_european_union.pngflag_falkland_islands.pngflag_faroe_islands.pngflag_fiji.pngflag_finish.pngflag_finland.pngflag_france.pngflag_french_polynesia.pngflag_gabon.pngflag_gambia.pngflag_georgia.pngflag_germany.pngflag_ghana.pngflag_gibraltar.pngflag_great_britain.pngflag_greece.pngflag_greenland.pngflag_grenada.pngflag_guam.pngflag_guatemala.pngflag_guernsey.pngflag_guinea.pngflag_guinea_bissau.pngflag_guyana.pngflag_haiti.pngflag_honduras.pngflag_hong_kong.pngflag_hot.pngflag_hungary.pngflag_iceland.pngflag_india.pngflag_indonesia.pngflag_iran.pngflag_iraq.pngflag_ireland.pngflag_isle_of_man.pngflag_israel.pngflag_italy.pngflag_jamaica.pngflag_japan.pngflag_jersey.pngflag_jordan.pngflag_kazakhstan.pngflag_kenya.pngflag_kiribati.pngflag_kuwait.pngflag_kyrgyzstan.pngflag_laos.pngflag_latvia.pngflag_lebanon.pngflag_lesotho.pngflag_liberia.pngflag_libya.pngflag_liechtenstein.pngflag_lithuania.pngflag_luxembourg.pngflag_macau.pngflag_macedonia.pngflag_madagascar.pngflag_malawi.pngflag_malaysia.pngflag_maledives.pngflag_mali.pngflag_malta.pngflag_marshall_islands.pngflag_martinique.pngflag_mauretania.pngflag_mauritius.pngflag_mexico.pngflag_micronesia.pngflag_moldova.pngflag_monaco.pngflag_mongolia.pngflag_montserrat.pngflag_morocco.pngflag_mozambique.pngflag_namibia.pngflag_nato.pngflag_nauru.pngflag_nepal.pngflag_netherlands.pngflag_netherlands_antilles.pngflag_new.pngflag_new_zealand.pngflag_nicaragua.pngflag_niger.pngflag_nigeria.pngflag_niue.pngflag_norfolk_islands.pngflag_north_korea.pngflag_northern_mariana_islands.pngflag_norway.pngflag_olympic.pngflag_oman.pngflag_pakistan.pngflag_palau.pngflag_panama.pngflag_papua_new_guinea.pngflag_paraquay.pngflag_peru.pngflag_philippines.pngflag_pitcairn_islands.pngflag_poland.pngflag_portugal.pngflag_puerto_rico.pngflag_qatar.pngflag_red_cross.pngflag_red_dull.pngflag_romania.pngflag_russia.pngflag_rwanda.pngflag_saint_helena.pngflag_saint_kitts_and_nevis.pngflag_saint_lucia.pngflag_saint_pierre_and_miquelon.pngflag_saint_vincent_and_grenadines.pngflag_samoa.pngflag_san_marino.pngflag_sao_tome_and_principe.pngflag_saudi_arabia.pngflag_scotland.pngflag_senegal.pngflag_serbia_montenegro.pngflag_seychelles.pngflag_sierra_leone.pngflag_singapore.pngflag_slovakia.pngflag_slovenia.pngflag_solomon_islands.pngflag_somalia.pngflag_south_africa.pngflag_south_georgia.pngflag_south_korea.pngflag_spain.pngflag_sri_lanka.pngflag_sudan.pngflag_suriname.pngflag_swaziland.pngflag_sweden.pngflag_switzerland.pngflag_syria.pngflag_taiwan.pngflag_tajikistan.pngflag_tanzania.pngflag_thailand.pngflag_tibet.pngflag_togo.pngflag_tonga.pngflag_trinidad_and_tobago.pngflag_tunisia.pngflag_turkey.pngflag_turkmenistan.pngflag_turks_and_caicos_islands.pngflag_tuvalu.pngflag_uganda.pngflag_ukraine.pngflag_unesco.pngflag_united_arab_emirates.pngflag_united_nations.pngflag_uruquay.pngflag_usa.pngflag_uzbekistan.pngflag_vanuatu.pngflag_vatican_city.pngflag_venezuela.pngflag_vietnam.pngflag_virgin_islands.pngflag_wales.pngflag_wallis_and_futuna.pngflag_wto.pngflag_wwf.pngflag_yemen.pngflag_zambia.pngflag_zimbabwe.png
flower.pnggood.gifheart.pngheart_break.pngindex.phplaptop.pnglogo_comunic.pnglogo_smiley.pngmap.pngmicrophone.pngmoney_dollar.pngmovies.pngmusic.pngphone.pngpizza.pngrain.pngsmile.gifsmile_gris.gifsmiley-cool.gifsmiley-cry.gifsmiley-laughing.gifsmiley-sealed.gifsmiley-surprised.gifsmiley-tongue-out.gifsmiley-yell.gifstar.pngsun.pngtea_cup.pngteddy_bear.pngtick.pngtime.pngtree.pngubuntu.pnguser.pnguser_king.pngvlc.pngwhat.png
succes.pngsupp.pngtext_list_numbers.pngthumb_up.pngtick.png
tuile
usa.pnguser.pnguser_add.pngusers_3.pngusers_5.pngvoir.pngwait.gifwarning_update.pngwebcam.pngworld.png
js
SpryTabbedPanels.jsSpryTooltip.jsSpryValidationTextField.jsaide_smiley.jsajoutevolue.jsajoutsimple.jsamisajax.jsavertissement_console.jschat.jscommentairesmobile.jsconfirmdeleteaccount.jscountdown.jscountdown_countdown.js.jsglobal.jsglobal.phpglobal_ie.jsgrand_dialogue_smiley.jsgroupes.jsheader_global.js
holder
imgareaselect
index.phpinitialise_fancybox.js
ipwEditor
jquery-1.8.3.jsjquery-1.8.3.min.jsjquery-1.9.1.jsjquery-ui-1.9.2.custom.jsjquery.ui.autocomplete.jsjquery.ui.core.jsjquery.ui.dialog.jsjquery.ui.draggable.jsjquery.ui.menu.jsjquery.ui.mouse.jsjquery.ui.position.jsjquery.ui.tabs.jsjquery.ui.widget.js
jquery
liste_smile.jsload-metro_2.js
metro
metro_2.min.jsmetro_3.jspanneau_private_chat.jspostcommentaire.js
prettify
private_chat.js
tiny_mce
langs
license.txt
plugins
advhr
advimage
advlink
advlist
autolink
autoresize
autosave
bbcode
contextmenu
directionality
emotions
example
example_dependency
fullpage
fullscreen
iespell
inlinepopups
insertdatetime
layer
legacyoutput
lists
media
nonbreaking
noneditable
pagebreak
paste
preview
print
save
searchreplace
spellchecker
style
tabfocus
table
template
visualblocks
visualchars
wordcount
xhtmlxtras
themes
tiny_mce.jstiny_mce_popup.jstiny_mce_src.js
utils
webrtc_main.js
legal
browserconfig.xmlchat.phpcommentaire.phpconnecter.phpconnexiondb.phpcreercompte.phpdeconnexion.php
developer
.htaccessCHANGELOG.mdCONTRIBUTING.mdLICENSE.txtREADME.md
assets
backup
bin
composer.jsoncomposer.lock
images
index.php
logs
robots.txt
system
assets
blueprints
config
defines.php
images
languages
pages
src
Grav
Common
Assets.php
Backup
Browser.phpCache.phpComposer.php
Config
Data
Debugger.php
Errors
File
Filesystem
GPM
Getters.phpGrav.phpGravTrait.php
Helpers
Inflector.phpIterator.php
Language
Markdown
Page
Plugin.phpPlugins.php
Processors
Service
Session.phpTaxonomy.phpTheme.phpThemes.php
Twig
Uri.php
User
Utils.php
Console
tmp
user
accounts
config
data
pages
01.home
02.tools
03.getComunic
04.default
plugins
themes
.gitkeep
antimatter
CHANGELOG.mdLICENSEREADME.mdantimatter.phpantimatter.yaml
assets
blueprints.yaml
blueprints
css-compiled
css
fonts
googleFonts
images
js
languages.yamlscreenshot.jpgscss.sh
scss
configuration
nucleus.scss
nucleus
particles.scsstemplate.scss
template
vendor
bourbon
color-schemer
templates
thumbnail.jpg
vendor
antoligy
autoload.php
composer
doctrine
donatj
erusev
filp
gregwar
league
matthiasmullie
maximebf
monolog
monolog
.php_csCHANGELOG.mdownLICENSEREADME.mdown
src
Monolog
ErrorHandler.php
Formatter
Handler
Logger.php
Processor
Registry.php
pimple
psr
rockettheme
seld
symfony
console
event-dispatcher
polyfill-iconv
polyfill-mbstring
var-dumper
yaml
twig
twig
CHANGELOGLICENSEREADME.rst
lib
Twig
Autoloader.phpBaseNodeVisitor.php
Cache
CacheInterface.phpCompiler.phpCompilerInterface.phpEnvironment.phpError.php
Error
ExistsLoaderInterface.phpExpressionParser.phpExtension.php
Extension
ExtensionInterface.phpFileExtensionEscapingStrategy.phpFilter.php
Filter
FilterCallableInterface.phpFilterInterface.phpFunction.php
Function
FunctionCallableInterface.phpFunctionInterface.phpLexer.phpLexerInterface.php
Loader
LoaderInterface.phpMarkup.phpNode.php
Node
NodeInterface.phpNodeOutputInterface.phpNodeTraverser.php
NodeVisitor
NodeVisitorInterface.phpParser.phpParserInterface.php
Profiler
Sandbox
SimpleFilter.phpSimpleFunction.phpSimpleTest.phpTemplate.phpTemplateInterface.phpTest.php
Test
TestCallableInterface.phpTestInterface.phpToken.phpTokenParser.php
TokenParser
TokenParserBroker.phpTokenParserBrokerInterface.phpTokenParserInterface.phpTokenStream.php
Util
webserver-configs
doc
exportdonnees.phpgalerie_videos.phpgalerieimages.phpimgcommentaire.php
inc
.htaccess404.htmlaccount_created.phpadd_comunic_as_search_engine.phpajax_search_users.php
api
change_avatar_webcam.phpchange_hauteur_chat.phpchange_niveau_visibilite_post.phpcode_session_private_chat.php
config
conversations_private_chat.php
core
delete_avatar_img_background.phpdelete_old_notifications.phpdelete_request_become_friend.phpedit_commentaire.htmledit_niveau_visibilite.htmledit_nom_video.htmleffectuer_maintenance_account.phpenvoi_mail.php
functions
generate_pdf.phpgere_abonnement_ami.phpgestion_piwik.phpheader_page.php
helpers
index.phpinitPage.php
lang
like_comment.phplike_external_page.phplike_texte_page.phpliste_descriptions.phpliste_smile.phpload.htmlloading.htmllogout_with_roundcube.htmlmanage_flux.htmlmenu_contextuel.phpmessage_fil_vu.phpmessage_update.htmlnettoyage_automatique_notifications.phpouvre_ferme_session_chat.php
pages
private_chat.phpshow_hide_private_chat_contener.phpsmile_javascript.phpsupp_commentaire_id.htmlsupp_commentaire_id.phpupload_video.phpupload_video_suite.phpvideo_type_allowed_list.phpvote_sondage.php
index.phplisteamis.phpmessagerie.php
minifyurl
notification.phpnotification_old.phpparametres.phpprivatechat.phpr.phprobots.txtrss.phpsecurite.phpsitemap.xmlsolvepassword.phpsuppcompte.php
tools
3rdparty
assets
index.phpmenu.php
nobin
speaker
svgedit
browser-not-supported.htmlbrowser.js
canvg
config-sample.jscontextmenu.js
contextmenu
coords.jsdraw.jsembedapi-dom.jsembedapi.htmlembedapi.js
extensions
history.js
images
index.php
jgraduate
jquery-svg.js
jquery-ui
jquery.js
jquerybbq
js-hotkeys
jspdf
locale
math.jspath.jspathseg.jsrecalculate.jssanitize.jsselect.js
spinbtn
svg-editor.csssvg-editor.htmlsvg-editor.jssvg-editor.manifestsvgcanvas.jssvgedit.js
svgicons
svgtransformlist.jssvgutils.jstouch.jsunits.js

@ -0,0 +1,118 @@
<?php
/*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the MIT license. For more information, see
* <http://www.doctrine-project.org>.
*/
namespace Doctrine\Common\Cache;
/**
* APC cache provider.
*
* @link www.doctrine-project.org
* @deprecated since version 1.6, use ApcuCache instead
* @since 2.0
* @author Benjamin Eberlei <kontakt@beberlei.de>
* @author Guilherme Blanco <guilhermeblanco@hotmail.com>
* @author Jonathan Wage <jonwage@gmail.com>
* @author Roman Borschel <roman@code-factory.org>
* @author David Abdemoulaie <dave@hobodave.com>
*/
class ApcCache extends CacheProvider
{
/**
* {@inheritdoc}
*/
protected function doFetch($id)
{
return apc_fetch($id);
}
/**
* {@inheritdoc}
*/
protected function doContains($id)
{
return apc_exists($id);
}
/**
* {@inheritdoc}
*/
protected function doSave($id, $data, $lifeTime = 0)
{
return apc_store($id, $data, $lifeTime);
}
/**
* {@inheritdoc}
*/
protected function doDelete($id)
{
// apc_delete returns false if the id does not exist
return apc_delete($id) || ! apc_exists($id);
}
/**
* {@inheritdoc}
*/
protected function doFlush()
{
return apc_clear_cache() && apc_clear_cache('user');
}
/**
* {@inheritdoc}
*/
protected function doFetchMultiple(array $keys)
{
return apc_fetch($keys);
}
/**
* {@inheritdoc}
*/
protected function doSaveMultiple(array $keysAndValues, $lifetime = 0)
{
$result = apc_store($keysAndValues, null, $lifetime);
return empty($result);
}
/**
* {@inheritdoc}
*/
protected function doGetStats()
{
$info = apc_cache_info('', true);
$sma = apc_sma_info();
// @TODO - Temporary fix @see https://github.com/krakjoe/apcu/pull/42
if (PHP_VERSION_ID >= 50500) {
$info['num_hits'] = isset($info['num_hits']) ? $info['num_hits'] : $info['nhits'];
$info['num_misses'] = isset($info['num_misses']) ? $info['num_misses'] : $info['nmisses'];
$info['start_time'] = isset($info['start_time']) ? $info['start_time'] : $info['stime'];
}
return array(
Cache::STATS_HITS => $info['num_hits'],
Cache::STATS_MISSES => $info['num_misses'],
Cache::STATS_UPTIME => $info['start_time'],
Cache::STATS_MEMORY_USAGE => $info['mem_size'],
Cache::STATS_MEMORY_AVAILABLE => $sma['avail_mem'],
);
}
}

@ -0,0 +1,106 @@
<?php
/*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the MIT license. For more information, see
* <http://www.doctrine-project.org>.
*/
namespace Doctrine\Common\Cache;
/**
* APCu cache provider.
*
* @link www.doctrine-project.org
* @since 1.6
* @author Kévin Dunglas <dunglas@gmail.com>
*/
class ApcuCache extends CacheProvider
{
/**
* {@inheritdoc}
*/
protected function doFetch($id)
{
return apcu_fetch($id);
}
/**
* {@inheritdoc}
*/
protected function doContains($id)
{
return apcu_exists($id);
}
/**
* {@inheritdoc}
*/
protected function doSave($id, $data, $lifeTime = 0)
{
return apcu_store($id, $data, $lifeTime);
}
/**
* {@inheritdoc}
*/
protected function doDelete($id)
{
// apcu_delete returns false if the id does not exist
return apcu_delete($id) || ! apcu_exists($id);
}
/**
* {@inheritdoc}
*/
protected function doFlush()
{
return apcu_clear_cache();
}
/**
* {@inheritdoc}
*/
protected function doFetchMultiple(array $keys)
{
return apcu_fetch($keys);
}
/**
* {@inheritdoc}
*/
protected function doSaveMultiple(array $keysAndValues, $lifetime = 0)
{
$result = apcu_store($keysAndValues, null, $lifetime);
return empty($result);
}
/**
* {@inheritdoc}
*/
protected function doGetStats()
{
$info = apcu_cache_info(true);
$sma = apcu_sma_info();
return array(
Cache::STATS_HITS => $info['num_hits'],
Cache::STATS_MISSES => $info['num_misses'],
Cache::STATS_UPTIME => $info['start_time'],
Cache::STATS_MEMORY_USAGE => $info['mem_size'],
Cache::STATS_MEMORY_AVAILABLE => $sma['avail_mem'],
);
}
}

@ -0,0 +1,142 @@
<?php
/*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the MIT license. For more information, see
* <http://www.doctrine-project.org>.
*/
namespace Doctrine\Common\Cache;
/**
* Array cache driver.
*
* @link www.doctrine-project.org
* @since 2.0
* @author Benjamin Eberlei <kontakt@beberlei.de>
* @author Guilherme Blanco <guilhermeblanco@hotmail.com>
* @author Jonathan Wage <jonwage@gmail.com>
* @author Roman Borschel <roman@code-factory.org>
* @author David Abdemoulaie <dave@hobodave.com>
*/
class ArrayCache extends CacheProvider
{
/**
* @var array[] $data each element being a tuple of [$data, $expiration], where the expiration is int|bool
*/
private $data = [];
/**
* @var int
*/
private $hitsCount = 0;
/**
* @var int
*/
private $missesCount = 0;
/**
* @var int
*/
private $upTime;
/**
* {@inheritdoc}
*/
public function __construct()
{
$this->upTime = time();
}
/**
* {@inheritdoc}
*/
protected function doFetch($id)
{
if (! $this->doContains($id)) {
$this->missesCount += 1;
return false;
}
$this->hitsCount += 1;
return $this->data[$id][0];
}
/**
* {@inheritdoc}
*/
protected function doContains($id)
{
if (! isset($this->data[$id])) {
return false;
}
$expiration = $this->data[$id][1];
if ($expiration && $expiration < time()) {
$this->doDelete($id);
return false;
}
return true;
}
/**
* {@inheritdoc}
*/
protected function doSave($id, $data, $lifeTime = 0)
{
$this->data[$id] = [$data, $lifeTime ? time() + $lifeTime : false];
return true;
}
/**
* {@inheritdoc}
*/
protected function doDelete($id)
{
unset($this->data[$id]);
return true;
}
/**
* {@inheritdoc}
*/
protected function doFlush()
{
$this->data = [];
return true;
}
/**
* {@inheritdoc}
*/
protected function doGetStats()
{
return [
Cache::STATS_HITS => $this->hitsCount,
Cache::STATS_MISSES => $this->missesCount,
Cache::STATS_UPTIME => $this->upTime,
Cache::STATS_MEMORY_USAGE => null,
Cache::STATS_MEMORY_AVAILABLE => null,
];
}
}

@ -0,0 +1,116 @@
<?php
/*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the MIT license. For more information, see
* <http://www.doctrine-project.org>.
*/
namespace Doctrine\Common\Cache;
/**
* Interface for cache drivers.
*
* @link www.doctrine-project.org
* @since 2.0
* @author Benjamin Eberlei <kontakt@beberlei.de>
* @author Guilherme Blanco <guilhermeblanco@hotmail.com>
* @author Jonathan Wage <jonwage@gmail.com>
* @author Roman Borschel <roman@code-factory.org>
* @author Fabio B. Silva <fabio.bat.silva@gmail.com>
* @author Kévin Dunglas <dunglas@gmail.com>
*/
interface Cache
{
const STATS_HITS = 'hits';
const STATS_MISSES = 'misses';
const STATS_UPTIME = 'uptime';
const STATS_MEMORY_USAGE = 'memory_usage';
const STATS_MEMORY_AVAILABLE = 'memory_available';
/**
* Only for backward compatibility (may be removed in next major release)
*
* @deprecated
*/
const STATS_MEMORY_AVAILIABLE = 'memory_available';
/**
* Fetches an entry from the cache.
*
* @param string $id The id of the cache entry to fetch.
*
* @return mixed The cached data or FALSE, if no cache entry exists for the given id.
*/
public function fetch($id);
/**
* Tests if an entry exists in the cache.
*
* @param string $id The cache id of the entry to check for.
*
* @return bool TRUE if a cache entry exists for the given cache id, FALSE otherwise.
*/
public function contains($id);
/**
* Puts data into the cache.
*
* If a cache entry with the given id already exists, its data will be replaced.
*
* @param string $id The cache id.
* @param mixed $data The cache entry/data.
* @param int $lifeTime The lifetime in number of seconds for this cache entry.
* If zero (the default), the entry never expires (although it may be deleted from the cache
* to make place for other entries).
*
* @return bool TRUE if the entry was successfully stored in the cache, FALSE otherwise.
*/
public function save($id, $data, $lifeTime = 0);
/**
* Deletes a cache entry.
*
* @param string $id The cache id.
*
* @return bool TRUE if the cache entry was successfully deleted, FALSE otherwise.
* Deleting a non-existing entry is considered successful.
*/
public function delete($id);
/**
* Retrieves cached information from the data store.
*
* The server's statistics array has the following values:
*
* - <b>hits</b>
* Number of keys that have been requested and found present.
*
* - <b>misses</b>
* Number of items that have been requested and not found.
*
* - <b>uptime</b>
* Time that the server is running.
*
* - <b>memory_usage</b>
* Memory used by this server to store items.
*
* - <b>memory_available</b>
* Memory allowed to use for storage.
*
* @since 2.2
*
* @return array|null An associative array with server's statistics if available, NULL otherwise.
*/
public function getStats();
}

@ -0,0 +1,312 @@
<?php
/*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the MIT license. For more information, see
* <http://www.doctrine-project.org>.
*/
namespace Doctrine\Common\Cache;
/**
* Base class for cache provider implementations.
*
* @since 2.2
* @author Benjamin Eberlei <kontakt@beberlei.de>
* @author Guilherme Blanco <guilhermeblanco@hotmail.com>
* @author Jonathan Wage <jonwage@gmail.com>
* @author Roman Borschel <roman@code-factory.org>
* @author Fabio B. Silva <fabio.bat.silva@gmail.com>
*/
abstract class CacheProvider implements Cache, FlushableCache, ClearableCache, MultiGetCache, MultiPutCache
{
const DOCTRINE_NAMESPACE_CACHEKEY = 'DoctrineNamespaceCacheKey[%s]';
/**
* The namespace to prefix all cache ids with.
*
* @var string
*/
private $namespace = '';
/**
* The namespace version.
*
* @var integer|null
*/
private $namespaceVersion;
/**
* Sets the namespace to prefix all cache ids with.
*
* @param string $namespace
*
* @return void
*/
public function setNamespace($namespace)
{
$this->namespace = (string) $namespace;
$this->namespaceVersion = null;
}
/**
* Retrieves the namespace that prefixes all cache ids.
*
* @return string
*/
public function getNamespace()
{
return $this->namespace;
}
/**
* {@inheritdoc}
*/
public function fetch($id)
{
return $this->doFetch($this->getNamespacedId($id));
}
/**
* {@inheritdoc}
*/
public function fetchMultiple(array $keys)
{
if (empty($keys)) {
return array();
}
// note: the array_combine() is in place to keep an association between our $keys and the $namespacedKeys
$namespacedKeys = array_combine($keys, array_map(array($this, 'getNamespacedId'), $keys));
$items = $this->doFetchMultiple($namespacedKeys);
$foundItems = array();
// no internal array function supports this sort of mapping: needs to be iterative
// this filters and combines keys in one pass
foreach ($namespacedKeys as $requestedKey => $namespacedKey) {
if (isset($items[$namespacedKey]) || array_key_exists($namespacedKey, $items)) {
$foundItems[$requestedKey] = $items[$namespacedKey];
}
}
return $foundItems;
}
/**
* {@inheritdoc}
*/
public function saveMultiple(array $keysAndValues, $lifetime = 0)
{
$namespacedKeysAndValues = array();
foreach ($keysAndValues as $key => $value) {
$namespacedKeysAndValues[$this->getNamespacedId($key)] = $value;
}
return $this->doSaveMultiple($namespacedKeysAndValues, $lifetime);
}
/**
* {@inheritdoc}
*/
public function contains($id)
{
return $this->doContains($this->getNamespacedId($id));
}
/**
* {@inheritdoc}
*/
public function save($id, $data, $lifeTime = 0)
{
return $this->doSave($this->getNamespacedId($id), $data, $lifeTime);
}
/**
* {@inheritdoc}
*/
public function delete($id)
{
return $this->doDelete($this->getNamespacedId($id));
}
/**
* {@inheritdoc}
*/
public function getStats()
{
return $this->doGetStats();
}
/**
* {@inheritDoc}
*/
public function flushAll()
{
return $this->doFlush();
}
/**
* {@inheritDoc}
*/
public function deleteAll()
{
$namespaceCacheKey = $this->getNamespaceCacheKey();
$namespaceVersion = $this->getNamespaceVersion() + 1;
if ($this->doSave($namespaceCacheKey, $namespaceVersion)) {
$this->namespaceVersion = $namespaceVersion;
return true;
}
return false;
}
/**
* Prefixes the passed id with the configured namespace value.
*
* @param string $id The id to namespace.
*
* @return string The namespaced id.
*/
private function getNamespacedId($id)
{
$namespaceVersion = $this->getNamespaceVersion();
return sprintf('%s[%s][%s]', $this->namespace, $id, $namespaceVersion);
}
/**
* Returns the namespace cache key.
*
* @return string
*/
private function getNamespaceCacheKey()
{
return sprintf(self::DOCTRINE_NAMESPACE_CACHEKEY, $this->namespace);
}
/**
* Returns the namespace version.
*
* @return integer
*/
private function getNamespaceVersion()
{
if (null !== $this->namespaceVersion) {
return $this->namespaceVersion;
}
$namespaceCacheKey = $this->getNamespaceCacheKey();
$this->namespaceVersion = $this->doFetch($namespaceCacheKey) ?: 1;
return $this->namespaceVersion;
}
/**
* Default implementation of doFetchMultiple. Each driver that supports multi-get should owerwrite it.
*
* @param array $keys Array of keys to retrieve from cache
* @return array Array of values retrieved for the given keys.
*/
protected function doFetchMultiple(array $keys)
{
$returnValues = array();
foreach ($keys as $key) {
if (false !== ($item = $this->doFetch($key)) || $this->doContains($key)) {
$returnValues[$key] = $item;
}
}
return $returnValues;
}
/**
* Fetches an entry from the cache.
*
* @param string $id The id of the cache entry to fetch.
*
* @return mixed|false The cached data or FALSE, if no cache entry exists for the given id.
*/
abstract protected function doFetch($id);
/**
* Tests if an entry exists in the cache.
*
* @param string $id The cache id of the entry to check for.
*
* @return bool TRUE if a cache entry exists for the given cache id, FALSE otherwise.
*/
abstract protected function doContains($id);
/**
* Default implementation of doSaveMultiple. Each driver that supports multi-put should override it.
*
* @param array $keysAndValues Array of keys and values to save in cache
* @param int $lifetime The lifetime. If != 0, sets a specific lifetime for these
* cache entries (0 => infinite lifeTime).
*
* @return bool TRUE if the operation was successful, FALSE if it wasn't.
*/
protected function doSaveMultiple(array $keysAndValues, $lifetime = 0)
{
$success = true;
foreach ($keysAndValues as $key => $value) {
if (!$this->doSave($key, $value, $lifetime)) {
$success = false;
}
}
return $success;
}
/**
* Puts data into the cache.
*
* @param string $id The cache id.
* @param string $data The cache entry/data.
* @param int $lifeTime The lifetime. If != 0, sets a specific lifetime for this
* cache entry (0 => infinite lifeTime).
*
* @return bool TRUE if the entry was successfully stored in the cache, FALSE otherwise.
*/
abstract protected function doSave($id, $data, $lifeTime = 0);
/**
* Deletes a cache entry.
*
* @param string $id The cache id.
*
* @return bool TRUE if the cache entry was successfully deleted, FALSE otherwise.
*/
abstract protected function doDelete($id);
/**
* Flushes all cache entries.
*
* @return bool TRUE if the cache entries were successfully flushed, FALSE otherwise.
*/
abstract protected function doFlush();
/**
* Retrieves cached information from the data store.
*
* @since 2.2
*
* @return array|null An associative array with server's statistics if available, NULL otherwise.
*/
abstract protected function doGetStats();
}

@ -0,0 +1,147 @@
<?php
/*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the MIT license. For more information, see
* <http://www.doctrine-project.org>.
*/
namespace Doctrine\Common\Cache;
/**
* Cache provider that allows to easily chain multiple cache providers
*
* @author Michaël Gallego <mic.gallego@gmail.com>
*/
class ChainCache extends CacheProvider
{
/**
* @var CacheProvider[]
*/
private $cacheProviders = array();
/**
* Constructor
*
* @param CacheProvider[] $cacheProviders
*/
public function __construct($cacheProviders = array())
{
$this->cacheProviders = $cacheProviders;
}
/**
* {@inheritDoc}
*/
public function setNamespace($namespace)
{
parent::setNamespace($namespace);
foreach ($this->cacheProviders as $cacheProvider) {
$cacheProvider->setNamespace($namespace);
}
}
/**
* {@inheritDoc}
*/
protected function doFetch($id)
{
foreach ($this->cacheProviders as $key => $cacheProvider) {
if ($cacheProvider->doContains($id)) {
$value = $cacheProvider->doFetch($id);
// We populate all the previous cache layers (that are assumed to be faster)
for ($subKey = $key - 1 ; $subKey >= 0 ; $subKey--) {
$this->cacheProviders[$subKey]->doSave($id, $value);
}
return $value;
}
}
return false;
}
/**
* {@inheritDoc}
*/
protected function doContains($id)
{
foreach ($this->cacheProviders as $cacheProvider) {
if ($cacheProvider->doContains($id)) {
return true;
}
}
return false;
}
/**
* {@inheritDoc}
*/
protected function doSave($id, $data, $lifeTime = 0)
{
$stored = true;
foreach ($this->cacheProviders as $cacheProvider) {
$stored = $cacheProvider->doSave($id, $data, $lifeTime) && $stored;
}
return $stored;
}
/**
* {@inheritDoc}
*/
protected function doDelete($id)
{
$deleted = true;
foreach ($this->cacheProviders as $cacheProvider) {
$deleted = $cacheProvider->doDelete($id) && $deleted;
}
return $deleted;
}
/**
* {@inheritDoc}
*/
protected function doFlush()
{
$flushed = true;
foreach ($this->cacheProviders as $cacheProvider) {
$flushed = $cacheProvider->doFlush() && $flushed;
}
return $flushed;
}
/**
* {@inheritDoc}
*/
protected function doGetStats()
{
// We return all the stats from all adapters
$stats = array();
foreach ($this->cacheProviders as $cacheProvider) {
$stats[] = $cacheProvider->doGetStats();
}
return $stats;
}
}

@ -0,0 +1,40 @@
<?php
/*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the MIT license. For more information, see
* <http://www.doctrine-project.org>.
*/
namespace Doctrine\Common\Cache;
/**
* Interface for cache that can be flushed.
*
* Intended to be used for partial clearing of a cache namespace. For a more
* global "flushing", see {@see FlushableCache}.
*
* @link www.doctrine-project.org
* @since 1.4
* @author Adirelle <adirelle@gmail.com>
*/
interface ClearableCache
{
/**
* Deletes all cache entries in the current cache namespace.
*
* @return bool TRUE if the cache entries were successfully deleted, FALSE otherwise.
*/
public function deleteAll();
}

@ -0,0 +1,121 @@
<?php
/*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the MIT license. For more information, see
* <http://www.doctrine-project.org>.
*/
namespace Doctrine\Common\Cache;
use \Couchbase;
/**
* Couchbase cache provider.
*
* @link www.doctrine-project.org
* @since 2.4
* @author Michael Nitschinger <michael@nitschinger.at>
*/
class CouchbaseCache extends CacheProvider
{
/**
* @var Couchbase|null
*/
private $couchbase;
/**
* Sets the Couchbase instance to use.
*
* @param Couchbase $couchbase
*
* @return void
*/
public function setCouchbase(Couchbase $couchbase)
{
$this->couchbase = $couchbase;
}
/**
* Gets the Couchbase instance used by the cache.
*
* @return Couchbase|null
*/
public function getCouchbase()
{
return $this->couchbase;
}
/**
* {@inheritdoc}
*/
protected function doFetch($id)
{
return $this->couchbase->get($id) ?: false;
}
/**
* {@inheritdoc}
*/
protected function doContains($id)
{
return (null !== $this->couchbase->get($id));
}
/**
* {@inheritdoc}
*/
protected function doSave($id, $data, $lifeTime = 0)
{
if ($lifeTime > 30 * 24 * 3600) {
$lifeTime = time() + $lifeTime;
}
return $this->couchbase->set($id, $data, (int) $lifeTime);
}
/**
* {@inheritdoc}
*/
protected function doDelete($id)
{
return $this->couchbase->delete($id);
}
/**
* {@inheritdoc}
*/
protected function doFlush()
{
return $this->couchbase->flush();
}
/**
* {@inheritdoc}
*/
protected function doGetStats()
{
$stats = $this->couchbase->getStats();
$servers = $this->couchbase->getServers();
$server = explode(":", $servers[0]);
$key = $server[0] . ":" . "11210";
$stats = $stats[$key];
return array(
Cache::STATS_HITS => $stats['get_hits'],
Cache::STATS_MISSES => $stats['get_misses'],
Cache::STATS_UPTIME => $stats['uptime'],
Cache::STATS_MEMORY_USAGE => $stats['bytes'],
Cache::STATS_MEMORY_AVAILABLE => $stats['limit_maxbytes'],
);
}
}

@ -0,0 +1,286 @@
<?php
/*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the MIT license. For more information, see
* <http://www.doctrine-project.org>.
*/
namespace Doctrine\Common\Cache;
/**
* Base file cache driver.
*
* @since 2.3
* @author Fabio B. Silva <fabio.bat.silva@gmail.com>
* @author Tobias Schultze <http://tobion.de>
*/
abstract class FileCache extends CacheProvider
{
/**
* The cache directory.
*
* @var string
*/
protected $directory;
/**
* The cache file extension.
*
* @var string
*/
private $extension;
/**
* @var int
*/
private $umask;
/**
* @var int
*/
private $directoryStringLength;
/**
* @var int
*/
private $extensionStringLength;
/**
* @var bool
*/
private $isRunningOnWindows;
/**
* Constructor.
*
* @param string $directory The cache directory.
* @param string $extension The cache file extension.
*
* @throws \InvalidArgumentException
*/
public function __construct($directory, $extension = '', $umask = 0002)
{
// YES, this needs to be *before* createPathIfNeeded()
if ( ! is_int($umask)) {
throw new \InvalidArgumentException(sprintf(
'The umask parameter is required to be integer, was: %s',
gettype($umask)
));
}
$this->umask = $umask;
if ( ! $this->createPathIfNeeded($directory)) {
throw new \InvalidArgumentException(sprintf(
'The directory "%s" does not exist and could not be created.',
$directory
));
}
if ( ! is_writable($directory)) {
throw new \InvalidArgumentException(sprintf(
'The directory "%s" is not writable.',
$directory
));
}
// YES, this needs to be *after* createPathIfNeeded()
$this->directory = realpath($directory);
$this->extension = (string) $extension;
$this->directoryStringLength = strlen($this->directory);
$this->extensionStringLength = strlen($this->extension);
$this->isRunningOnWindows = defined('PHP_WINDOWS_VERSION_BUILD');
}
/**
* Gets the cache directory.
*
* @return string
*/
public function getDirectory()
{
return $this->directory;
}
/**
* Gets the cache file extension.
*
* @return string
*/
public function getExtension()
{
return $this->extension;
}
/**
* @param string $id
*
* @return string
*/
protected function getFilename($id)
{
$hash = hash('sha256', $id);
// This ensures that the filename is unique and that there are no invalid chars in it.
if (
'' === $id
|| ((strlen($id) * 2 + $this->extensionStringLength) > 255)
|| ($this->isRunningOnWindows && ($this->directoryStringLength + 4 + strlen($id) * 2 + $this->extensionStringLength) > 258)
) {
// Most filesystems have a limit of 255 chars for each path component. On Windows the the whole path is limited
// to 260 chars (including terminating null char). Using long UNC ("\\?\" prefix) does not work with the PHP API.
// And there is a bug in PHP (https://bugs.php.net/bug.php?id=70943) with path lengths of 259.
// So if the id in hex representation would surpass the limit, we use the hash instead. The prefix prevents
// collisions between the hash and bin2hex.
$filename = '_' . $hash;
} else {
$filename = bin2hex($id);
}
return $this->directory
. DIRECTORY_SEPARATOR
. substr($hash, 0, 2)
. DIRECTORY_SEPARATOR
. $filename
. $this->extension;
}
/**
* {@inheritdoc}
*/
protected function doDelete($id)
{
$filename = $this->getFilename($id);
return @unlink($filename) || ! file_exists($filename);
}
/**
* {@inheritdoc}
*/
protected function doFlush()
{
foreach ($this->getIterator() as $name => $file) {
if ($file->isDir()) {
// Remove the intermediate directories which have been created to balance the tree. It only takes effect
// if the directory is empty. If several caches share the same directory but with different file extensions,
// the other ones are not removed.
@rmdir($name);
} elseif ($this->isFilenameEndingWithExtension($name)) {
// If an extension is set, only remove files which end with the given extension.
// If no extension is set, we have no other choice than removing everything.
@unlink($name);
}
}
return true;
}
/**
* {@inheritdoc}
*/
protected function doGetStats()
{
$usage = 0;
foreach ($this->getIterator() as $name => $file) {
if (! $file->isDir() && $this->isFilenameEndingWithExtension($name)) {
$usage += $file->getSize();
}
}
$free = disk_free_space($this->directory);
return array(
Cache::STATS_HITS => null,
Cache::STATS_MISSES => null,
Cache::STATS_UPTIME => null,
Cache::STATS_MEMORY_USAGE => $usage,
Cache::STATS_MEMORY_AVAILABLE => $free,
);
}
/**
* Create path if needed.
*
* @param string $path
* @return bool TRUE on success or if path already exists, FALSE if path cannot be created.
*/
private function createPathIfNeeded($path)
{
if ( ! is_dir($path)) {
if (false === @mkdir($path, 0777 & (~$this->umask), true) && !is_dir($path)) {
return false;
}
}
return true;
}
/**
* Writes a string content to file in an atomic way.
*
* @param string $filename Path to the file where to write the data.
* @param string $content The content to write
*
* @return bool TRUE on success, FALSE if path cannot be created, if path is not writable or an any other error.
*/
protected function writeFile($filename, $content)
{
$filepath = pathinfo($filename, PATHINFO_DIRNAME);
if ( ! $this->createPathIfNeeded($filepath)) {
return false;
}
if ( ! is_writable($filepath)) {
return false;
}
$tmpFile = tempnam($filepath, 'swap');
@chmod($tmpFile, 0666 & (~$this->umask));
if (file_put_contents($tmpFile, $content) !== false) {
if (@rename($tmpFile, $filename)) {
return true;
}
@unlink($tmpFile);
}
return false;
}
/**
* @return \Iterator
*/
private function getIterator()
{
return new \RecursiveIteratorIterator(
new \RecursiveDirectoryIterator($this->directory, \FilesystemIterator::SKIP_DOTS),
\RecursiveIteratorIterator::CHILD_FIRST
);
}
/**
* @param string $name The filename
*
* @return bool
*/
private function isFilenameEndingWithExtension($name)
{
return '' === $this->extension
|| strrpos($name, $this->extension) === (strlen($name) - $this->extensionStringLength);
}
}

@ -0,0 +1,111 @@
<?php
/*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the MIT license. For more information, see
* <http://www.doctrine-project.org>.
*/
namespace Doctrine\Common\Cache;
/**
* Filesystem cache driver.
*
* @since 2.3
* @author Fabio B. Silva <fabio.bat.silva@gmail.com>
*/
class FilesystemCache extends FileCache
{
const EXTENSION = '.doctrinecache.data';
/**
* {@inheritdoc}
*/
public function __construct($directory, $extension = self::EXTENSION, $umask = 0002)
{
parent::__construct($directory, $extension, $umask);
}
/**
* {@inheritdoc}
*/
protected function doFetch($id)
{
$data = '';
$lifetime = -1;
$filename = $this->getFilename($id);
if ( ! is_file($filename)) {
return false;
}
$resource = fopen($filename, "r");
if (false !== ($line = fgets($resource))) {
$lifetime = (int) $line;
}
if ($lifetime !== 0 && $lifetime < time()) {
fclose($resource);
return false;
}
while (false !== ($line = fgets($resource))) {
$data .= $line;
}
fclose($resource);
return unserialize($data);
}
/**
* {@inheritdoc}
*/
protected function doContains($id)
{
$lifetime = -1;
$filename = $this->getFilename($id);
if ( ! is_file($filename)) {
return false;
}
$resource = fopen($filename, "r");
if (false !== ($line = fgets($resource))) {
$lifetime = (int) $line;
}
fclose($resource);
return $lifetime === 0 || $lifetime > time();
}
/**
* {@inheritdoc}
*/
protected function doSave($id, $data, $lifeTime = 0)
{
if ($lifeTime > 0) {
$lifeTime = time() + $lifeTime;
}
$data = serialize($data);
$filename = $this->getFilename($id);
return $this->writeFile($filename, $lifeTime . PHP_EOL . $data);
}
}

@ -0,0 +1,37 @@
<?php
/*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the MIT license. For more information, see
* <http://www.doctrine-project.org>.
*/
namespace Doctrine\Common\Cache;
/**
* Interface for cache that can be flushed.
*
* @link www.doctrine-project.org
* @since 1.4
* @author Adirelle <adirelle@gmail.com>
*/
interface FlushableCache
{
/**
* Flushes all cache entries, globally.
*
* @return bool TRUE if the cache entries were successfully flushed, FALSE otherwise.
*/
public function flushAll();
}

@ -0,0 +1,126 @@
<?php
/*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the MIT license. For more information, see
* <http://www.doctrine-project.org>.
*/
namespace Doctrine\Common\Cache;
use \Memcache;
/**
* Memcache cache provider.
*
* @link www.doctrine-project.org
* @since 2.0
* @author Benjamin Eberlei <kontakt@beberlei.de>
* @author Guilherme Blanco <guilhermeblanco@hotmail.com>
* @author Jonathan Wage <jonwage@gmail.com>
* @author Roman Borschel <roman@code-factory.org>
* @author David Abdemoulaie <dave@hobodave.com>
*/
class MemcacheCache extends CacheProvider
{
/**
* @var Memcache|null
*/
private $memcache;
/**
* Sets the memcache instance to use.
*
* @param Memcache $memcache
*
* @return void
*/
public function setMemcache(Memcache $memcache)
{
$this->memcache = $memcache;
}
/**
* Gets the memcache instance used by the cache.
*
* @return Memcache|null
*/
public function getMemcache()
{
return $this->memcache;
}
/**
* {@inheritdoc}
*/
protected function doFetch($id)
{
return $this->memcache->get($id);
}
/**
* {@inheritdoc}
*/
protected function doContains($id)
{
$flags = null;
$this->memcache->get($id, $flags);
//if memcache has changed the value of "flags", it means the value exists
return ($flags !== null);
}
/**
* {@inheritdoc}
*/
protected function doSave($id, $data, $lifeTime = 0)
{
if ($lifeTime > 30 * 24 * 3600) {
$lifeTime = time() + $lifeTime;
}
return $this->memcache->set($id, $data, 0, (int) $lifeTime);
}
/**
* {@inheritdoc}
*/
protected function doDelete($id)
{
// Memcache::delete() returns false if entry does not exist
return $this->memcache->delete($id) || ! $this->doContains($id);
}
/**
* {@inheritdoc}
*/
protected function doFlush()
{
return $this->memcache->flush();
}
/**
* {@inheritdoc}
*/
protected function doGetStats()
{
$stats = $this->memcache->getStats();
return array(
Cache::STATS_HITS => $stats['get_hits'],
Cache::STATS_MISSES => $stats['get_misses'],
Cache::STATS_UPTIME => $stats['uptime'],
Cache::STATS_MEMORY_USAGE => $stats['bytes'],
Cache::STATS_MEMORY_AVAILABLE => $stats['limit_maxbytes'],
);
}
}

@ -0,0 +1,146 @@
<?php
/*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the MIT license. For more information, see
* <http://www.doctrine-project.org>.
*/
namespace Doctrine\Common\Cache;
use \Memcached;
/**
* Memcached cache provider.
*
* @link www.doctrine-project.org
* @since 2.2
* @author Benjamin Eberlei <kontakt@beberlei.de>
* @author Guilherme Blanco <guilhermeblanco@hotmail.com>
* @author Jonathan Wage <jonwage@gmail.com>
* @author Roman Borschel <roman@code-factory.org>
* @author David Abdemoulaie <dave@hobodave.com>
*/
class MemcachedCache extends CacheProvider
{
/**
* @var Memcached|null
*/
private $memcached;
/**
* Sets the memcache instance to use.
*
* @param Memcached $memcached
*
* @return void
*/
public function setMemcached(Memcached $memcached)
{
$this->memcached = $memcached;
}
/**
* Gets the memcached instance used by the cache.
*
* @return Memcached|null
*/
public function getMemcached()
{
return $this->memcached;
}
/**
* {@inheritdoc}
*/
protected function doFetch($id)
{
return $this->memcached->get($id);
}
/**
* {@inheritdoc}
*/
protected function doFetchMultiple(array $keys)
{
return $this->memcached->getMulti($keys);
}
/**
* {@inheritdoc}
*/
protected function doSaveMultiple(array $keysAndValues, $lifetime = 0)
{
if ($lifetime > 30 * 24 * 3600) {
$lifetime = time() + $lifetime;
}
return $this->memcached->setMulti($keysAndValues, null, $lifetime);
}
/**
* {@inheritdoc}
*/
protected function doContains($id)
{
return false !== $this->memcached->get($id)
|| $this->memcached->getResultCode() !== Memcached::RES_NOTFOUND;
}
/**
* {@inheritdoc}
*/
protected function doSave($id, $data, $lifeTime = 0)
{
if ($lifeTime > 30 * 24 * 3600) {
$lifeTime = time() + $lifeTime;
}
return $this->memcached->set($id, $data, (int) $lifeTime);
}
/**
* {@inheritdoc}
*/
protected function doDelete($id)
{
return $this->memcached->delete($id)
|| $this->memcached->getResultCode() === Memcached::RES_NOTFOUND;
}
/**
* {@inheritdoc}
*/
protected function doFlush()
{
return $this->memcached->flush();
}
/**
* {@inheritdoc}
*/
protected function doGetStats()
{
$stats = $this->memcached->getStats();
$servers = $this->memcached->getServerList();
$key = $servers[0]['host'] . ':' . $servers[0]['port'];
$stats = $stats[$key];
return array(
Cache::STATS_HITS => $stats['get_hits'],
Cache::STATS_MISSES => $stats['get_misses'],
Cache::STATS_UPTIME => $stats['uptime'],
Cache::STATS_MEMORY_USAGE => $stats['bytes'],
Cache::STATS_MEMORY_AVAILABLE => $stats['limit_maxbytes'],
);
}
}

@ -0,0 +1,197 @@
<?php
/*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the MIT license. For more information, see
* <http://www.doctrine-project.org>.
*/
namespace Doctrine\Common\Cache;
use MongoBinData;
use MongoCollection;
use MongoCursorException;
use MongoDate;
/**
* MongoDB cache provider.
*
* @since 1.1
* @author Jeremy Mikola <jmikola@gmail.com>
*/
class MongoDBCache extends CacheProvider
{
/**
* The data field will store the serialized PHP value.
*/
const DATA_FIELD = 'd';
/**
* The expiration field will store a MongoDate value indicating when the
* cache entry should expire.
*
* With MongoDB 2.2+, entries can be automatically deleted by MongoDB by
* indexing this field with the "expireAfterSeconds" option equal to zero.
* This will direct MongoDB to regularly query for and delete any entries
* whose date is older than the current time. Entries without a date value
* in this field will be ignored.
*
* The cache provider will also check dates on its own, in case expired
* entries are fetched before MongoDB's TTLMonitor pass can expire them.
*
* @see http://docs.mongodb.org/manual/tutorial/expire-data/
*/
const EXPIRATION_FIELD = 'e';
/**
* @var MongoCollection
*/
private $collection;
/**
* Constructor.
*
* This provider will default to the write concern and read preference
* options set on the MongoCollection instance (or inherited from MongoDB or
* MongoClient). Using an unacknowledged write concern (< 1) may make the
* return values of delete() and save() unreliable. Reading from secondaries
* may make contain() and fetch() unreliable.
*
* @see http://www.php.net/manual/en/mongo.readpreferences.php
* @see http://www.php.net/manual/en/mongo.writeconcerns.php
* @param MongoCollection $collection
*/
public function __construct(MongoCollection $collection)
{
$this->collection = $collection;
}
/**
* {@inheritdoc}
*/
protected function doFetch($id)
{
$document = $this->collection->findOne(array('_id' => $id), array(self::DATA_FIELD, self::EXPIRATION_FIELD));
if ($document === null) {
return false;
}
if ($this->isExpired($document)) {
$this->doDelete($id);
return false;
}
return unserialize($document[self::DATA_FIELD]->bin);
}
/**
* {@inheritdoc}
*/
protected function doContains($id)
{
$document = $this->collection->findOne(array('_id' => $id), array(self::EXPIRATION_FIELD));
if ($document === null) {
return false;
}
if ($this->isExpired($document)) {
$this->doDelete($id);
return false;
}
return true;
}
/**
* {@inheritdoc}
*/
protected function doSave($id, $data, $lifeTime = 0)
{
try {
$result = $this->collection->update(
array('_id' => $id),
array('$set' => array(
self::EXPIRATION_FIELD => ($lifeTime > 0 ? new MongoDate(time() + $lifeTime) : null),
self::DATA_FIELD => new MongoBinData(serialize($data), MongoBinData::BYTE_ARRAY),
)),
array('upsert' => true, 'multiple' => false)
);
} catch (MongoCursorException $e) {
return false;
}
return isset($result['ok']) ? $result['ok'] == 1 : true;
}
/**
* {@inheritdoc}
*/
protected function doDelete($id)
{
$result = $this->collection->remove(array('_id' => $id));
return isset($result['ok']) ? $result['ok'] == 1 : true;
}
/**
* {@inheritdoc}
*/
protected function doFlush()
{
// Use remove() in lieu of drop() to maintain any collection indexes
$result = $this->collection->remove();
return isset($result['ok']) ? $result['ok'] == 1 : true;
}
/**
* {@inheritdoc}
*/
protected function doGetStats()
{
$serverStatus = $this->collection->db->command(array(
'serverStatus' => 1,
'locks' => 0,
'metrics' => 0,
'recordStats' => 0,
'repl' => 0,
));
$collStats = $this->collection->db->command(array('collStats' => 1));
return array(
Cache::STATS_HITS => null,
Cache::STATS_MISSES => null,
Cache::STATS_UPTIME => (isset($serverStatus['uptime']) ? (int) $serverStatus['uptime'] : null),
Cache::STATS_MEMORY_USAGE => (isset($collStats['size']) ? (int) $collStats['size'] : null),
Cache::STATS_MEMORY_AVAILABLE => null,
);
}
/**
* Check if the document is expired.
*
* @param array $document
*
* @return bool
*/
private function isExpired(array $document)
{
return isset($document[self::EXPIRATION_FIELD]) &&
$document[self::EXPIRATION_FIELD] instanceof MongoDate &&
$document[self::EXPIRATION_FIELD]->sec < time();
}
}

@ -0,0 +1,39 @@
<?php
/*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the MIT license. For more information, see
* <http://www.doctrine-project.org>.
*/
namespace Doctrine\Common\Cache;
/**
* Interface for cache drivers that allows to get many items at once.
*
* @link www.doctrine-project.org
* @since 1.4
* @author Asmir Mustafic <goetas@gmail.com>
*/
interface MultiGetCache
{
/**
* Returns an associative array of values for keys is found in cache.
*
* @param string[] $keys Array of keys to retrieve from cache
* @return mixed[] Array of retrieved values, indexed by the specified keys.
* Values that couldn't be retrieved are not contained in this array.
*/
function fetchMultiple(array $keys);
}

@ -0,0 +1,41 @@
<?php
/*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the MIT license. For more information, see
* <http://www.doctrine-project.org>.
*/
namespace Doctrine\Common\Cache;
/**
* Interface for cache drivers that allows to put many items at once.
*
* @link www.doctrine-project.org
* @since 1.6
* @author Daniel Gorgan <danut007ro@gmail.com>
*/
interface MultiPutCache
{
/**
* Returns a boolean value indicating if the operation succeeded.
*
* @param array $keysAndValues Array of keys and values to save in cache
* @param int $lifetime The lifetime. If != 0, sets a specific lifetime for these
* cache entries (0 => infinite lifeTime).
*
* @return bool TRUE if the operation was successful, FALSE if it wasn't.
*/
function saveMultiple(array $keysAndValues, $lifetime = 0);
}

@ -0,0 +1,120 @@
<?php
/*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the MIT license. For more information, see
* <http://www.doctrine-project.org>.
*/
namespace Doctrine\Common\Cache;
/**
* Php file cache driver.
*
* @since 2.3
* @author Fabio B. Silva <fabio.bat.silva@gmail.com>
*/
class PhpFileCache extends FileCache
{
const EXTENSION = '.doctrinecache.php';
/**
* {@inheritdoc}
*/
public function __construct($directory, $extension = self::EXTENSION, $umask = 0002)
{
parent::__construct($directory, $extension, $umask);
}
/**
* {@inheritdoc}
*/
protected function doFetch($id)
{
$value = $this->includeFileForId($id);
if (! $value) {
return false;
}
if ($value['lifetime'] !== 0 && $value['lifetime'] < time()) {
return false;
}
return $value['data'];
}
/**
* {@inheritdoc}
*/
protected function doContains($id)
{
$value = $this->includeFileForId($id);
if (! $value) {
return false;
}
return $value['lifetime'] === 0 || $value['lifetime'] > time();
}
/**
* {@inheritdoc}
*/
protected function doSave($id, $data, $lifeTime = 0)
{
if ($lifeTime > 0) {
$lifeTime = time() + $lifeTime;
}
if (is_object($data) && ! method_exists($data, '__set_state')) {
throw new \InvalidArgumentException(
"Invalid argument given, PhpFileCache only allows objects that implement __set_state() " .
"and fully support var_export(). You can use the FilesystemCache to save arbitrary object " .
"graphs using serialize()/deserialize()."
);
}
$filename = $this->getFilename($id);
$value = array(
'lifetime' => $lifeTime,
'data' => $data
);
$value = var_export($value, true);
$code = sprintf('<?php return %s;', $value);
return $this->writeFile($filename, $code);
}
/**
* @param string $id
*
* @return array|false
*/
private function includeFileForId($id)
{
$fileName = $this->getFilename($id);
// note: error suppression is still faster than `file_exists`, `is_file` and `is_readable`
$value = @include $fileName;
if (! isset($value['lifetime'])) {
return false;
}
return $value;
}
}

@ -0,0 +1,136 @@
<?php
namespace Doctrine\Common\Cache;
use Predis\ClientInterface;
/**
* Predis cache provider.
*
* @author othillo <othillo@othillo.nl>
*/
class PredisCache extends CacheProvider
{
/**
* @var ClientInterface
*/
private $client;
/**
* @param ClientInterface $client
*
* @return void
*/
public function __construct(ClientInterface $client)
{
$this->client = $client;
}
/**
* {@inheritdoc}
*/
protected function doFetch($id)
{
$result = $this->client->get($id);
if (null === $result) {
return false;
}
return unserialize($result);
}
/**
* {@inheritdoc}
*/
protected function doFetchMultiple(array $keys)
{
$fetchedItems = call_user_func_array(array($this->client, 'mget'), $keys);
return array_map('unserialize', array_filter(array_combine($keys, $fetchedItems)));
}
/**
* {@inheritdoc}
*/
protected function doSaveMultiple(array $keysAndValues, $lifetime = 0)
{
if ($lifetime) {
$success = true;
// Keys have lifetime, use SETEX for each of them
foreach ($keysAndValues as $key => $value) {
$response = $this->client->setex($key, $lifetime, serialize($value));
if ((string) $response != 'OK') {
$success = false;
}
}
return $success;
}
// No lifetime, use MSET
$response = $this->client->mset(array_map(function ($value) {
return serialize($value);
}, $keysAndValues));
return (string) $response == 'OK';
}
/**
* {@inheritdoc}
*/
protected function doContains($id)
{
return $this->client->exists($id);
}
/**
* {@inheritdoc}
*/
protected function doSave($id, $data, $lifeTime = 0)
{
$data = serialize($data);
if ($lifeTime > 0) {
$response = $this->client->setex($id, $lifeTime, $data);
} else {
$response = $this->client->set($id, $data);
}
return $response === true || $response == 'OK';
}
/**
* {@inheritdoc}
*/
protected function doDelete($id)
{
return $this->client->del($id) >= 0;
}
/**
* {@inheritdoc}
*/
protected function doFlush()
{
$response = $this->client->flushdb();
return $response === true || $response == 'OK';
}
/**
* {@inheritdoc}
*/
protected function doGetStats()
{
$info = $this->client->info();
return array(
Cache::STATS_HITS => $info['Stats']['keyspace_hits'],
Cache::STATS_MISSES => $info['Stats']['keyspace_misses'],
Cache::STATS_UPTIME => $info['Server']['uptime_in_seconds'],
Cache::STATS_MEMORY_USAGE => $info['Memory']['used_memory'],
Cache::STATS_MEMORY_AVAILABLE => false
);
}
}

@ -0,0 +1,175 @@
<?php
/*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the MIT license. For more information, see
* <http://www.doctrine-project.org>.
*/
namespace Doctrine\Common\Cache;
use Redis;
/**
* Redis cache provider.
*
* @link www.doctrine-project.org
* @since 2.2
* @author Osman Ungur <osmanungur@gmail.com>
*/
class RedisCache extends CacheProvider
{
/**
* @var Redis|null
*/
private $redis;
/**
* Sets the redis instance to use.
*
* @param Redis $redis
*
* @return void
*/
public function setRedis(Redis $redis)
{
$redis->setOption(Redis::OPT_SERIALIZER, $this->getSerializerValue());
$this->redis = $redis;
}
/**
* Gets the redis instance used by the cache.
*
* @return Redis|null
*/
public function getRedis()
{
return $this->redis;
}
/**
* {@inheritdoc}
*/
protected function doFetch($id)
{
return $this->redis->get($id);
}
/**
* {@inheritdoc}
*/
protected function doFetchMultiple(array $keys)
{
$fetchedItems = array_combine($keys, $this->redis->mget($keys));
// Redis mget returns false for keys that do not exist. So we need to filter those out unless it's the real data.
$foundItems = array();
foreach ($fetchedItems as $key => $value) {
if (false !== $value || $this->redis->exists($key)) {
$foundItems[$key] = $value;
}
}
return $foundItems;
}
/**
* {@inheritdoc}
*/
protected function doSaveMultiple(array $keysAndValues, $lifetime = 0)
{
if ($lifetime) {
$success = true;
// Keys have lifetime, use SETEX for each of them
foreach ($keysAndValues as $key => $value) {
if (!$this->redis->setex($key, $lifetime, $value)) {
$success = false;
}
}
return $success;
}
// No lifetime, use MSET
return (bool) $this->redis->mset($keysAndValues);
}
/**
* {@inheritdoc}
*/
protected function doContains($id)
{
return $this->redis->exists($id);
}
/**
* {@inheritdoc}
*/
protected function doSave($id, $data, $lifeTime = 0)
{
if ($lifeTime > 0) {
return $this->redis->setex($id, $lifeTime, $data);
}
return $this->redis->set($id, $data);
}
/**
* {@inheritdoc}
*/
protected function doDelete($id)
{
return $this->redis->delete($id) >= 0;
}
/**
* {@inheritdoc}
*/
protected function doFlush()
{
return $this->redis->flushDB();
}
/**
* {@inheritdoc}
*/
protected function doGetStats()
{
$info = $this->redis->info();
return array(
Cache::STATS_HITS => $info['keyspace_hits'],
Cache::STATS_MISSES => $info['keyspace_misses'],
Cache::STATS_UPTIME => $info['uptime_in_seconds'],
Cache::STATS_MEMORY_USAGE => $info['used_memory'],
Cache::STATS_MEMORY_AVAILABLE => false
);
}
/**
* Returns the serializer constant to use. If Redis is compiled with
* igbinary support, that is used. Otherwise the default PHP serializer is
* used.
*
* @return integer One of the Redis::SERIALIZER_* constants
*/
protected function getSerializerValue()
{
if (defined('HHVM_VERSION')) {
return Redis::SERIALIZER_PHP;
}
return defined('Redis::SERIALIZER_IGBINARY') ? Redis::SERIALIZER_IGBINARY : Redis::SERIALIZER_PHP;
}
}

@ -0,0 +1,250 @@
<?php
/*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the MIT license. For more information, see
* <http://www.doctrine-project.org>.
*/
namespace Doctrine\Common\Cache;
use Riak\Bucket;
use Riak\Connection;
use Riak\Input;
use Riak\Exception;
use Riak\Object;
/**
* Riak cache provider.
*
* @link www.doctrine-project.org
* @since 1.1
* @author Guilherme Blanco <guilhermeblanco@hotmail.com>
*/
class RiakCache extends CacheProvider
{
const EXPIRES_HEADER = 'X-Riak-Meta-Expires';
/**
* @var \Riak\Bucket
*/
private $bucket;
/**
* Sets the riak bucket instance to use.
*
* @param \Riak\Bucket $bucket
*/
public function __construct(Bucket $bucket)
{
$this->bucket = $bucket;
}
/**
* {@inheritdoc}
*/
protected function doFetch($id)
{
try {
$response = $this->bucket->get($id);
// No objects found
if ( ! $response->hasObject()) {
return false;
}
// Check for attempted siblings
$object = ($response->hasSiblings())
? $this->resolveConflict($id, $response->getVClock(), $response->getObjectList())
: $response->getFirstObject();
// Check for expired object
if ($this->isExpired($object)) {
$this->bucket->delete($object);
return false;
}
return unserialize($object->getContent());
} catch (Exception\RiakException $e) {
// Covers:
// - Riak\ConnectionException
// - Riak\CommunicationException
// - Riak\UnexpectedResponseException
// - Riak\NotFoundException
}
return false;
}
/**
* {@inheritdoc}
*/
protected function doContains($id)
{
try {
// We only need the HEAD, not the entire object
$input = new Input\GetInput();
$input->setReturnHead(true);
$response = $this->bucket->get($id, $input);
// No objects found
if ( ! $response->hasObject()) {
return false;
}
$object = $response->getFirstObject();
// Check for expired object
if ($this->isExpired($object)) {
$this->bucket->delete($object);
return false;
}
return true;
} catch (Exception\RiakException $e) {
// Do nothing
}
return false;
}
/**
* {@inheritdoc}
*/
protected function doSave($id, $data, $lifeTime = 0)
{
try {
$object = new Object($id);
$object->setContent(serialize($data));
if ($lifeTime > 0) {
$object->addMetadata(self::EXPIRES_HEADER, (string) (time() + $lifeTime));
}
$this->bucket->put($object);
return true;
} catch (Exception\RiakException $e) {
// Do nothing
}
return false;
}
/**
* {@inheritdoc}
*/
protected function doDelete($id)
{
try {
$this->bucket->delete($id);
return true;
} catch (Exception\BadArgumentsException $e) {
// Key did not exist on cluster already
} catch (Exception\RiakException $e) {
// Covers:
// - Riak\Exception\ConnectionException
// - Riak\Exception\CommunicationException
// - Riak\Exception\UnexpectedResponseException
}
return false;
}
/**
* {@inheritdoc}
*/
protected function doFlush()
{
try {
$keyList = $this->bucket->getKeyList();
foreach ($keyList as $key) {
$this->bucket->delete($key);
}
return true;
} catch (Exception\RiakException $e) {
// Do nothing
}
return false;
}
/**
* {@inheritdoc}
*/
protected function doGetStats()
{
// Only exposed through HTTP stats API, not Protocol Buffers API
return null;
}
/**
* Check if a given Riak Object have expired.
*
* @param \Riak\Object $object
*
* @return bool
*/
private function isExpired(Object $object)
{
$metadataMap = $object->getMetadataMap();
return isset($metadataMap[self::EXPIRES_HEADER])
&& $metadataMap[self::EXPIRES_HEADER] < time();
}
/**
* On-read conflict resolution. Applied approach here is last write wins.
* Specific needs may override this method to apply alternate conflict resolutions.
*
* {@internal Riak does not attempt to resolve a write conflict, and store
* it as sibling of conflicted one. By following this approach, it is up to
* the next read to resolve the conflict. When this happens, your fetched
* object will have a list of siblings (read as a list of objects).
* In our specific case, we do not care about the intermediate ones since
* they are all the same read from storage, and we do apply a last sibling
* (last write) wins logic.
* If by any means our resolution generates another conflict, it'll up to
* next read to properly solve it.}
*
* @param string $id
* @param string $vClock
* @param array $objectList
*
* @return \Riak\Object
*/
protected function resolveConflict($id, $vClock, array $objectList)
{
// Our approach here is last-write wins
$winner = $objectList[count($objectList)];
$putInput = new Input\PutInput();
$putInput->setVClock($vClock);
$mergedObject = new Object($id);
$mergedObject->setContent($winner->getContent());
$this->bucket->put($mergedObject, $putInput);
return $mergedObject;
}
}

@ -0,0 +1,220 @@
<?php
/*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the MIT license. For more information, see
* <http://www.doctrine-project.org>.
*/
namespace Doctrine\Common\Cache;
use SQLite3;
use SQLite3Result;
/**
* SQLite3 cache provider.
*
* @since 1.4
* @author Jake Bell <jake@theunraveler.com>
*/
class SQLite3Cache extends CacheProvider
{
/**
* The ID field will store the cache key.
*/
const ID_FIELD = 'k';
/**
* The data field will store the serialized PHP value.
*/
const DATA_FIELD = 'd';
/**
* The expiration field will store a date value indicating when the
* cache entry should expire.
*/
const EXPIRATION_FIELD = 'e';
/**
* @var SQLite3
*/
private $sqlite;
/**
* @var string
*/
private $table;
/**
* Constructor.
*
* Calling the constructor will ensure that the database file and table
* exist and will create both if they don't.
*
* @param SQLite3 $sqlite
* @param string $table
*/
public function __construct(SQLite3 $sqlite, $table)
{
$this->sqlite = $sqlite;
$this->table = (string) $table;
list($id, $data, $exp) = $this->getFields();
return $this->sqlite->exec(sprintf(
'CREATE TABLE IF NOT EXISTS %s(%s TEXT PRIMARY KEY NOT NULL, %s BLOB, %s INTEGER)',
$table,
$id,
$data,
$exp
));
}
/**
* {@inheritdoc}
*/
protected function doFetch($id)
{
if ($item = $this->findById($id)) {
return unserialize($item[self::DATA_FIELD]);
}
return false;
}
/**
* {@inheritdoc}
*/
protected function doContains($id)
{
return null !== $this->findById($id, false);
}
/**
* {@inheritdoc}
*/
protected function doSave($id, $data, $lifeTime = 0)
{
$statement = $this->sqlite->prepare(sprintf(
'INSERT OR REPLACE INTO %s (%s) VALUES (:id, :data, :expire)',
$this->table,
implode(',', $this->getFields())
));
$statement->bindValue(':id', $id);
$statement->bindValue(':data', serialize($data), SQLITE3_BLOB);
$statement->bindValue(':expire', $lifeTime > 0 ? time() + $lifeTime : null);
return $statement->execute() instanceof SQLite3Result;
}
/**
* {@inheritdoc}
*/
protected function doDelete($id)
{
list($idField) = $this->getFields();
$statement = $this->sqlite->prepare(sprintf(
'DELETE FROM %s WHERE %s = :id',
$this->table,
$idField
));
$statement->bindValue(':id', $id);
return $statement->execute() instanceof SQLite3Result;
}
/**
* {@inheritdoc}
*/
protected function doFlush()
{
return $this->sqlite->exec(sprintf('DELETE FROM %s', $this->table));
}
/**
* {@inheritdoc}
*/
protected function doGetStats()
{
// no-op.
}
/**
* Find a single row by ID.
*
* @param mixed $id
* @param bool $includeData
*
* @return array|null
*/
private function findById($id, $includeData = true)
{
list($idField) = $fields = $this->getFields();
if (!$includeData) {
$key = array_search(static::DATA_FIELD, $fields);
unset($fields[$key]);
}
$statement = $this->sqlite->prepare(sprintf(
'SELECT %s FROM %s WHERE %s = :id LIMIT 1',
implode(',', $fields),
$this->table,
$idField
));
$statement->bindValue(':id', $id, SQLITE3_TEXT);
$item = $statement->execute()->fetchArray(SQLITE3_ASSOC);
if ($item === false) {
return null;
}
if ($this->isExpired($item)) {
$this->doDelete($id);
return null;
}
return $item;
}
/**
* Gets an array of the fields in our table.
*
* @return array
*/
private function getFields()
{
return array(static::ID_FIELD, static::DATA_FIELD, static::EXPIRATION_FIELD);
}
/**
* Check if the item is expired.
*
* @param array $item
*
* @return bool
*/
private function isExpired(array $item)
{
return isset($item[static::EXPIRATION_FIELD]) &&
$item[self::EXPIRATION_FIELD] !== null &&
$item[self::EXPIRATION_FIELD] < time();
}
}

@ -0,0 +1,25 @@
<?php
/*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the MIT license. For more information, see
* <http://www.doctrine-project.org>.
*/
namespace Doctrine\Common\Cache;
class Version
{
const VERSION = '1.6.0';
}

@ -0,0 +1,78 @@
<?php
/*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the MIT license. For more information, see
* <http://www.doctrine-project.org>.
*/
namespace Doctrine\Common\Cache;
/**
* Void cache driver. The cache could be of use in tests where you don`t need to cache anything.
*
* @link www.doctrine-project.org
* @since 1.5
* @author Kotlyar Maksim <kotlyar.maksim@gmail.com>
*/
class VoidCache extends CacheProvider
{
/**
* {@inheritDoc}
*/
protected function doFetch($id)
{
return false;
}
/**
* {@inheritDoc}
*/
protected function doContains($id)
{
return false;
}
/**
* {@inheritDoc}
*/
protected function doSave($id, $data, $lifeTime = 0)
{
return true;
}
/**
* {@inheritDoc}
*/
protected function doDelete($id)
{
return true;
}
/**
* {@inheritDoc}
*/
protected function doFlush()
{
return true;
}
/**
* {@inheritDoc}
*/
protected function doGetStats()
{
return;
}
}

@ -0,0 +1,109 @@
<?php
/*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the MIT license. For more information, see
* <http://www.doctrine-project.org>.
*/
namespace Doctrine\Common\Cache;
/**
* WinCache cache provider.
*
* @link www.doctrine-project.org
* @since 2.2
* @author Benjamin Eberlei <kontakt@beberlei.de>
* @author Guilherme Blanco <guilhermeblanco@hotmail.com>
* @author Jonathan Wage <jonwage@gmail.com>
* @author Roman Borschel <roman@code-factory.org>
* @author David Abdemoulaie <dave@hobodave.com>
*/
class WinCacheCache extends CacheProvider
{
/**
* {@inheritdoc}
*/
protected function doFetch($id)
{
return wincache_ucache_get($id);
}
/**
* {@inheritdoc}
*/
protected function doContains($id)
{
return wincache_ucache_exists($id);
}
/**
* {@inheritdoc}
*/
protected function doSave($id, $data, $lifeTime = 0)
{
return wincache_ucache_set($id, $data, $lifeTime);
}
/**
* {@inheritdoc}
*/
protected function doDelete($id)
{
return wincache_ucache_delete($id);
}
/**
* {@inheritdoc}
*/
protected function doFlush()
{
return wincache_ucache_clear();
}
/**
* {@inheritdoc}
*/
protected function doFetchMultiple(array $keys)
{
return wincache_ucache_get($keys);
}
/**
* {@inheritdoc}
*/
protected function doSaveMultiple(array $keysAndValues, $lifetime = 0)
{
$result = wincache_ucache_set($keysAndValues, null, $lifetime);
return empty($result);
}
/**
* {@inheritdoc}
*/
protected function doGetStats()
{
$info = wincache_ucache_info();
$meminfo = wincache_ucache_meminfo();
return array(
Cache::STATS_HITS => $info['total_hit_count'],
Cache::STATS_MISSES => $info['total_miss_count'],
Cache::STATS_UPTIME => $info['total_cache_uptime'],
Cache::STATS_MEMORY_USAGE => $meminfo['memory_total'],
Cache::STATS_MEMORY_AVAILABLE => $meminfo['memory_free'],
);
}
}

@ -0,0 +1,112 @@
<?php
/*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the MIT license. For more information, see
* <http://www.doctrine-project.org>.
*/
namespace Doctrine\Common\Cache;
/**
* Xcache cache driver.
*
* @link www.doctrine-project.org
* @since 2.0
* @author Benjamin Eberlei <kontakt@beberlei.de>
* @author Guilherme Blanco <guilhermeblanco@hotmail.com>
* @author Jonathan Wage <jonwage@gmail.com>
* @author Roman Borschel <roman@code-factory.org>
* @author David Abdemoulaie <dave@hobodave.com>
*/
class XcacheCache extends CacheProvider
{
/**
* {@inheritdoc}
*/
protected function doFetch($id)
{
return $this->doContains($id) ? unserialize(xcache_get($id)) : false;
}
/**
* {@inheritdoc}
*/
protected function doContains($id)
{
return xcache_isset($id);
}
/**
* {@inheritdoc}
*/
protected function doSave($id, $data, $lifeTime = 0)
{
return xcache_set($id, serialize($data), (int) $lifeTime);
}
/**
* {@inheritdoc}
*/
protected function doDelete($id)
{
return xcache_unset($id);
}
/**
* {@inheritdoc}
*/
protected function doFlush()
{
$this->checkAuthorization();
xcache_clear_cache(XC_TYPE_VAR);
return true;
}
/**
* Checks that xcache.admin.enable_auth is Off.
*
* @return void
*
* @throws \BadMethodCallException When xcache.admin.enable_auth is On.
*/
protected function checkAuthorization()
{
if (ini_get('xcache.admin.enable_auth')) {
throw new \BadMethodCallException(
'To use all features of \Doctrine\Common\Cache\XcacheCache, '
. 'you must set "xcache.admin.enable_auth" to "Off" in your php.ini.'
);
}
}
/**
* {@inheritdoc}
*/
protected function doGetStats()
{
$this->checkAuthorization();
$info = xcache_info(XC_TYPE_VAR, 0);
return array(
Cache::STATS_HITS => $info['hits'],
Cache::STATS_MISSES => $info['misses'],
Cache::STATS_UPTIME => null,
Cache::STATS_MEMORY_USAGE => $info['size'],
Cache::STATS_MEMORY_AVAILABLE => $info['avail'],
);
}
}

@ -0,0 +1,83 @@
<?php
/*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the MIT license. For more information, see
* <http://www.doctrine-project.org>.
*/
namespace Doctrine\Common\Cache;
/**
* Zend Data Cache cache driver.
*
* @link www.doctrine-project.org
* @since 2.0
* @author Ralph Schindler <ralph.schindler@zend.com>
* @author Guilherme Blanco <guilhermeblanco@hotmail.com>
*/
class ZendDataCache extends CacheProvider
{
/**
* {@inheritdoc}
*/
protected function doFetch($id)
{
return zend_shm_cache_fetch($id);
}
/**
* {@inheritdoc}
*/
protected function doContains($id)
{
return (false !== zend_shm_cache_fetch($id));
}
/**
* {@inheritdoc}
*/
protected function doSave($id, $data, $lifeTime = 0)
{
return zend_shm_cache_store($id, $data, $lifeTime);
}
/**
* {@inheritdoc}
*/
protected function doDelete($id)
{
return zend_shm_cache_delete($id);
}
/**
* {@inheritdoc}
*/
protected function doFlush()
{
$namespace = $this->getNamespace();
if (empty($namespace)) {
return zend_shm_cache_clear();
}
return zend_shm_cache_clear($namespace);
}
/**
* {@inheritdoc}
*/
protected function doGetStats()
{
return null;
}
}