{"id":1573,"date":"2019-09-17T21:43:16","date_gmt":"2019-09-17T19:43:16","guid":{"rendered":"https:\/\/vielhuber.de\/?p=1573"},"modified":"2019-09-19T01:39:01","modified_gmt":"2019-09-18T23:39:01","slug":"opcache-php-bootup-optimierung","status":"publish","type":"post","link":"https:\/\/vielhuber.de\/blog\/opcache-php-bootup-optimierung\/","title":{"rendered":"OPcache PHP Bootup Optimierung"},"content":{"rendered":"<p>Bei Webseiten, die beispielsweise auf <a href=\"https:\/\/wordpress.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">WordPress<\/a>, <a href=\"https:\/\/www.joomla.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">Joomla<\/a> oder <a href=\"https:\/\/laravel.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Laravel<\/a> basieren und keinen userspezifischen Content haben, empfiehlt es sich, alle Seiten in einem statischen HTML-Cache vorzuhalten und den Cache nur bei \u00c4nderung im Backend manuell (oder automatisch) neu zu generieren. Beinhaltet die Seite\u00a0jedoch dynamische Inhalte, die abh\u00e4ngig von Sessions und Cookies oder auch Sprache und Ort abh\u00e4ngen, eignet sich der Einsatz von <a href=\"http:\/\/php.net\/manual\/de\/book.opcache.php\" target=\"_blank\" rel=\"noopener noreferrer\">OPcache<\/a>.<\/p>\n<p><!--more--><\/p>\n<p>Dabei liegt die sog. Boot Time bei allen drei genannten Systemen bei einem frisch aufgesetzten CentOS7-Server (mit SSD und PHP 7.1) bei \u00fcber 100 ms. Jedes Mal, wenn ein PHP-Script ausgef\u00fchrt wird, muss dieses zur Laufzeit in Bytecode kompiliert werden. OPcache realisiert nun einen Cache f\u00fcr diesen Bytecode \u2013 wird nun beim n\u00e4chsten Request dasselbe PHP-Script ausgef\u00fchrt, muss es nicht rekompiliert werden. Nach dem Aktivieren von OPcache setzen wir folgende Einstellungen:<\/p>\n<p class=\"githubgist\" data-gist-file=\"php.ini\">9006cec6c5d3d2498ee26c5bfd91590a<\/p>\n<p>Die Ausf\u00fchrungszeit\u00a0(gemittelt bei 10 Ausf\u00fchrungen) hat sich nun deutlich reduziert:<\/p>\n<table>\n<tbody>\n<tr>\n<td><\/td>\n<td>WordPress 4.7.4<\/td>\n<td>Joomla 3.7<\/td>\n<td>Laravel 5.4<\/td>\n<\/tr>\n<tr>\n<td>ohne OPcache<\/td>\n<td>295 ms<\/td>\n<td>201 ms<\/td>\n<td>110 ms<\/td>\n<\/tr>\n<tr>\n<td>mit OPcache<\/td>\n<td>54 ms<\/td>\n<td>59 ms<\/td>\n<td>13 ms<\/td>\n<\/tr>\n<tr>\n<td>Faktor<\/td>\n<td>5,5<\/td>\n<td>3,5<\/td>\n<td>8,5<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Da wir bei den Einstellung validate_timestamps auf 0 und gleichzeitig revalidate_freq auf die Dauer von einem Tag gesetzt haben, wird der Cache quasi nie automatisch neu aufgebaut (das machen wir bewusst manuell). Mit einem kleinen <a href=\"https:\/\/git-scm.com\/book\/en\/v2\/Customizing-Git-Git-Hooks\" target=\"_blank\" rel=\"noopener noreferrer\">Git-Hook<\/a> wird bei jedem \"pull\" ein PHP-Script ausgef\u00fchrt. So aktiviert man den Hook:<\/p>\n<p class=\"githubgist\" data-gist-file=\"post-merge\">a1678610c8b4c7db5997375944183830<\/p>\n<p class=\"githubgist\" data-gist-file=\"flush.php\">a1678610c8b4c7db5997375944183830<\/p>\n<p>Folgende Helferfunktion ist au\u00dferdem behilflich, um einzelne Code-Teile (oder die gesamte Ausf\u00fchrungszeit) zu messen:<\/p>\n<p class=\"githubgist\" data-gist-file=\"index.php\">085f4291bbcc4e8a64bbea951ff49ab9<\/p>\n<p>Will man hilfreiche Infos wie Status, genutzten Memory oder gecachte Filezahl erhalten, nutzt man diese PHP-Funktion:<\/p>\n<p class=\"githubgist\" data-gist-file=\"index.php\">3f6309d04bc7e48dd909859321b96209<\/p>\n<p>Um in den Genuss von OPcache auch in einer lokalen Entwicklungsumgebung zu kommen (was generell nicht empfehlenswert ist), bedienen wir uns eines Tricks.<\/p>\n<p>OPcache ist auf allen Servern, die das OPcache-Modul installiert haben und bei denen die Einstellung opcache.enable nicht explizit gesetzt ist, aktiv. Das lassen wir auch so. Wir setzen lediglich in der php.ini opcache.validate_timestamps = 1. Damit greift opcache.revalidate_freq = 2. Damit erreichen wir, dass bei jedem Projekt OPcache quasi st\u00e4ndig revalidiert. Bei denjenigen Projekten, bei denen wir OPcache dauerhaft aktivieren wollen, setzen wir projektbezogen <span style=\"font-size: inherit;\">in der .htaccess folgende Einstellung:<\/span><\/p>\n<p class=\"githubgist\" data-gist-file=\".htaccess\">1dd64a3f2fe4425b29b1409410fe3fc0<\/p>\n<p>Danach starten wir den Webserver neu und legen folgendes Script an:<\/p>\n<p class=\"githubgist\" data-gist-file=\"flush.php\">91fb5289160e410607c9ea89112a575b<\/p>\n<p>Dieses Script l\u00f6scht den Cache und baut ihn gleichzeitig neu auf. Nun setzen wir im Lieblingseditor <a href=\"https:\/\/code.visualstudio.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">VSCode<\/a> ein workspace-bezogenes <a href=\"https:\/\/marketplace.visualstudio.com\/items?itemName=emeraldwalk.RunOnSave\" target=\"_blank\" rel=\"noopener noreferrer\">RunOnSave<\/a>-Kommando fest:<\/p>\n<p class=\"githubgist\" data-gist-file=\"settings.json\">91fb5289160e410607c9ea89112a575b<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Bei Webseiten, die beispielsweise auf WordPress, Joomla oder Laravel basieren und keinen userspezifischen Content haben, empfiehlt es sich, alle Seiten in einem statischen HTML-Cache vorzuhalten und den Cache nur bei \u00c4nderung im Backend manuell (oder automatisch) neu zu generieren. Beinhaltet die Seite\u00a0jedoch dynamische Inhalte, die abh\u00e4ngig von Sessions und Cookies oder auch Sprache und Ort [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"gtbabel_prevent_lngs":"","gtbabel_alt_lng":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-1573","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-blog"},"acf":[],"yoast_head":"<title>OPcache PHP Bootup Optimierung &#060; Vielhuber David<\/title>\n<meta name=\"description\" content=\"Bei Webseiten, die beispielsweise auf WordPress, Joomla oder Laravel basieren und keinen userspezifischen Content haben, empfiehlt es sich, alle Seite...\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/vielhuber.de\/blog\/opcache-php-bootup-optimierung\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"OPcache PHP Bootup Optimierung &#060; Vielhuber David\" \/>\n<meta property=\"og:description\" content=\"Bei Webseiten, die beispielsweise auf WordPress, Joomla oder Laravel basieren und keinen userspezifischen Content haben, empfiehlt es sich, alle Seiten in\" \/>\n<meta property=\"og:url\" content=\"https:\/\/vielhuber.de\/blog\/opcache-php-bootup-optimierung\/\" \/>\n<meta property=\"og:site_name\" content=\"Vielhuber David\" \/>\n<meta property=\"article:published_time\" content=\"2019-09-17T19:43:16+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2019-09-18T23:39:01+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/vielhuber.de\/wp-content\/uploads\/about.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"700\" \/>\n\t<meta property=\"og:image:height\" content=\"552\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"David\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@vielhuber\" \/>\n<meta name=\"twitter:site\" content=\"@vielhuber\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"David\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"2\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/vielhuber.de\\\/blog\\\/opcache-php-bootup-optimierung\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/vielhuber.de\\\/blog\\\/opcache-php-bootup-optimierung\\\/\"},\"author\":{\"name\":\"David\",\"@id\":\"https:\\\/\\\/vielhuber.de\\\/#\\\/schema\\\/person\\\/64d4ff14713d413ea4d9b210d0c2c6ef\"},\"headline\":\"OPcache PHP Bootup Optimierung\",\"datePublished\":\"2019-09-17T19:43:16+00:00\",\"dateModified\":\"2019-09-18T23:39:01+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/vielhuber.de\\\/blog\\\/opcache-php-bootup-optimierung\\\/\"},\"wordCount\":429,\"publisher\":{\"@id\":\"https:\\\/\\\/vielhuber.de\\\/#\\\/schema\\\/person\\\/64d4ff14713d413ea4d9b210d0c2c6ef\"},\"articleSection\":[\"Blog\"],\"inLanguage\":\"de\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/vielhuber.de\\\/blog\\\/opcache-php-bootup-optimierung\\\/\",\"url\":\"https:\\\/\\\/vielhuber.de\\\/blog\\\/opcache-php-bootup-optimierung\\\/\",\"name\":\"OPcache PHP Bootup Optimierung &#060; Vielhuber David\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/vielhuber.de\\\/#website\"},\"datePublished\":\"2019-09-17T19:43:16+00:00\",\"dateModified\":\"2019-09-18T23:39:01+00:00\",\"description\":\"Bei Webseiten, die beispielsweise auf WordPress, Joomla oder Laravel basieren und keinen userspezifischen Content haben, empfiehlt es sich, alle Seiten in\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/vielhuber.de\\\/blog\\\/opcache-php-bootup-optimierung\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/vielhuber.de\\\/blog\\\/opcache-php-bootup-optimierung\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/vielhuber.de\\\/blog\\\/opcache-php-bootup-optimierung\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/vielhuber.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"OPcache PHP Bootup Optimierung\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/vielhuber.de\\\/#website\",\"url\":\"https:\\\/\\\/vielhuber.de\\\/\",\"name\":\"Vielhuber David\",\"description\":\"Full-Stack Developer\",\"publisher\":{\"@id\":\"https:\\\/\\\/vielhuber.de\\\/#\\\/schema\\\/person\\\/64d4ff14713d413ea4d9b210d0c2c6ef\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/vielhuber.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/vielhuber.de\\\/#\\\/schema\\\/person\\\/64d4ff14713d413ea4d9b210d0c2c6ef\",\"name\":\"David\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/vielhuber.de\\\/wp-content\\\/uploads\\\/about.jpg\",\"url\":\"https:\\\/\\\/vielhuber.de\\\/wp-content\\\/uploads\\\/about.jpg\",\"contentUrl\":\"https:\\\/\\\/vielhuber.de\\\/wp-content\\\/uploads\\\/about.jpg\",\"width\":700,\"height\":552,\"caption\":\"David\"},\"logo\":{\"@id\":\"https:\\\/\\\/vielhuber.de\\\/wp-content\\\/uploads\\\/about.jpg\"},\"sameAs\":[\"https:\\\/\\\/x.com\\\/vielhuber\"]}]}<\/script>","yoast_head_json":{"title":"OPcache PHP Bootup Optimierung &#060; Vielhuber David","description":"Bei Webseiten, die beispielsweise auf WordPress, Joomla oder Laravel basieren und keinen userspezifischen Content haben, empfiehlt es sich, alle Seite...","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/vielhuber.de\/blog\/opcache-php-bootup-optimierung\/","og_locale":"de_DE","og_type":"article","og_title":"OPcache PHP Bootup Optimierung &#060; Vielhuber David","og_description":"Bei Webseiten, die beispielsweise auf WordPress, Joomla oder Laravel basieren und keinen userspezifischen Content haben, empfiehlt es sich, alle Seiten in","og_url":"https:\/\/vielhuber.de\/blog\/opcache-php-bootup-optimierung\/","og_site_name":"Vielhuber David","article_published_time":"2019-09-17T19:43:16+00:00","article_modified_time":"2019-09-18T23:39:01+00:00","og_image":[{"width":700,"height":552,"url":"https:\/\/vielhuber.de\/wp-content\/uploads\/about.jpg","type":"image\/jpeg"}],"author":"David","twitter_card":"summary_large_image","twitter_creator":"@vielhuber","twitter_site":"@vielhuber","twitter_misc":{"Verfasst von":"David","Gesch\u00e4tzte Lesezeit":"2\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/vielhuber.de\/blog\/opcache-php-bootup-optimierung\/#article","isPartOf":{"@id":"https:\/\/vielhuber.de\/blog\/opcache-php-bootup-optimierung\/"},"author":{"name":"David","@id":"https:\/\/vielhuber.de\/#\/schema\/person\/64d4ff14713d413ea4d9b210d0c2c6ef"},"headline":"OPcache PHP Bootup Optimierung","datePublished":"2019-09-17T19:43:16+00:00","dateModified":"2019-09-18T23:39:01+00:00","mainEntityOfPage":{"@id":"https:\/\/vielhuber.de\/blog\/opcache-php-bootup-optimierung\/"},"wordCount":429,"publisher":{"@id":"https:\/\/vielhuber.de\/#\/schema\/person\/64d4ff14713d413ea4d9b210d0c2c6ef"},"articleSection":["Blog"],"inLanguage":"de"},{"@type":"WebPage","@id":"https:\/\/vielhuber.de\/blog\/opcache-php-bootup-optimierung\/","url":"https:\/\/vielhuber.de\/blog\/opcache-php-bootup-optimierung\/","name":"OPcache PHP Bootup Optimierung &#060; Vielhuber David","isPartOf":{"@id":"https:\/\/vielhuber.de\/#website"},"datePublished":"2019-09-17T19:43:16+00:00","dateModified":"2019-09-18T23:39:01+00:00","description":"Bei Webseiten, die beispielsweise auf WordPress, Joomla oder Laravel basieren und keinen userspezifischen Content haben, empfiehlt es sich, alle Seiten in","breadcrumb":{"@id":"https:\/\/vielhuber.de\/blog\/opcache-php-bootup-optimierung\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/vielhuber.de\/blog\/opcache-php-bootup-optimierung\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/vielhuber.de\/blog\/opcache-php-bootup-optimierung\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/vielhuber.de\/"},{"@type":"ListItem","position":2,"name":"OPcache PHP Bootup Optimierung"}]},{"@type":"WebSite","@id":"https:\/\/vielhuber.de\/#website","url":"https:\/\/vielhuber.de\/","name":"Vielhuber David","description":"Full-Stack Developer","publisher":{"@id":"https:\/\/vielhuber.de\/#\/schema\/person\/64d4ff14713d413ea4d9b210d0c2c6ef"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/vielhuber.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":["Person","Organization"],"@id":"https:\/\/vielhuber.de\/#\/schema\/person\/64d4ff14713d413ea4d9b210d0c2c6ef","name":"David","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/vielhuber.de\/wp-content\/uploads\/about.jpg","url":"https:\/\/vielhuber.de\/wp-content\/uploads\/about.jpg","contentUrl":"https:\/\/vielhuber.de\/wp-content\/uploads\/about.jpg","width":700,"height":552,"caption":"David"},"logo":{"@id":"https:\/\/vielhuber.de\/wp-content\/uploads\/about.jpg"},"sameAs":["https:\/\/x.com\/vielhuber"]}]}},"_links":{"self":[{"href":"https:\/\/vielhuber.de\/pl\/wp-json\/wp\/v2\/posts\/1573","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vielhuber.de\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vielhuber.de\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vielhuber.de\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vielhuber.de\/pl\/wp-json\/wp\/v2\/comments?post=1573"}],"version-history":[{"count":24,"href":"https:\/\/vielhuber.de\/pl\/wp-json\/wp\/v2\/posts\/1573\/revisions"}],"predecessor-version":[{"id":2509,"href":"https:\/\/vielhuber.de\/pl\/wp-json\/wp\/v2\/posts\/1573\/revisions\/2509"}],"wp:attachment":[{"href":"https:\/\/vielhuber.de\/pl\/wp-json\/wp\/v2\/media?parent=1573"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vielhuber.de\/pl\/wp-json\/wp\/v2\/categories?post=1573"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vielhuber.de\/pl\/wp-json\/wp\/v2\/tags?post=1573"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}