{"id":20986,"date":"2026-08-25T11:50:02","date_gmt":"2026-08-25T09:50:02","guid":{"rendered":"https:\/\/webhosting.de\/php-fpm-slowlog-richtig-auswerten-performance-optimierung-debugging-analyse\/"},"modified":"2026-08-25T11:50:02","modified_gmt":"2026-08-25T09:50:02","slug":"korrekt-analyse-af-php-fpm-slowlog-ydeevneoptimering-fejlfinding-analyse","status":"publish","type":"post","link":"https:\/\/webhosting.de\/da\/php-fpm-slowlog-richtig-auswerten-performance-optimierung-debugging-analyse\/","title":{"rendered":"S\u00e5dan analyseres PHP-FPM-slowloggen korrekt: S\u00e5dan finder du sikkert flaskehalse i ydeevnen"},"content":{"rendered":"<p>Jeg viser dig, hvordan du <strong>PHP-FPM-slowlog<\/strong> udl\u00e6ser m\u00e5lrettet, fortolker backtraces korrekt og udleder deraf klare trin til at reducere latenstiden. P\u00e5 den m\u00e5de finder du p\u00e5lideligt flaskehalse i ydeevnen, prioriterer tiltag og g\u00f8r indl\u00e6sningstiderne m\u00e6rkbart hurtigere for brugerne.<\/p>\n\n<h2>Centrale punkter<\/h2>\n\n<ul>\n  <li><strong>Backtrace<\/strong> L\u00e6s: Frame #0 viser den aktuelle bremseklods.<\/li>\n  <li><strong>Timeout<\/strong> V\u00e6lg: Start f\u00f8rst h\u00f8jt og s\u00e6nk derefter gradvist.<\/li>\n  <li><strong>Sammenh\u00e6ng<\/strong> Med adgangslog: Sikker identifikation af langsomme URL'er.<\/li>\n  <li><strong>Pr\u00f8ve<\/strong> t\u00e6lle: prioritere tilbagevendende funktioner.<\/li>\n  <li><strong>Kode\u00e6ndringer<\/strong> udlede: m\u00e5lrettet h\u00e5ndtering af DB, API'er, sl\u00f8jfer og plugins.<\/li>\n<\/ul>\n\n<h2>Hvad er PHP-FPM-slowloggen?<\/h2>\n\n<p>Slowlog skriver en for lange foresp\u00f8rgsler <strong>Backtrace<\/strong> i en logfil og registrerer dermed det aktuelle udf\u00f8relsespunkt uden at afbryde foresp\u00f8rgslen. Jeg kan straks se, hvilket script, hvilken URL og hvilken funktion der blokerer forl\u00f8bet. Indtastningerne indeholder tidsstempel, pool, scriptfilnavn, anmodnings-URI og k\u00e6den af funktionskald. Dermed adskiller slowloggen sig tydeligt fra klassiske fejllogfiler, da den dokumenterer ydeevne, ikke fejl. For st\u00e6rkt belastede sider som WordPress-backends leverer den hurtigt brugbare oplysninger om ressourcekr\u00e6vende foresp\u00f8rgsler, tidskr\u00e6vende rendering eller blokerende I\/O-operationer. Den, der forst\u00e5r disse \u00f8jebliksbilleder, kan meget hurtigt <strong>Hoved\u00e5rsag<\/strong> afgr\u00e6nse problemet og planl\u00e6gge foranstaltninger.<\/p>\n\n<h2>S\u00e5dan fungerer Slowlog i hverdagen<\/h2>\n\n<p>N\u00e5r funktionen er aktiveret, skriver PHP-FPM en, n\u00e5r en defineret t\u00e6rskel overskrides, en <strong>\u00d8jebliksbillede<\/strong> fra stakken til loggen, mens anmodningen forts\u00e6tter. Hver post starter typisk med \u201e#0\u201c, alts\u00e5 p\u00e5 det sted, hvor der netop g\u00e5r tid tabt. Mellem blokkene ser jeg ofte tomme linjer, hvilket g\u00f8r det nemmere at adskille begivenhederne. Metoden leverer stikpr\u00f8ver i stedet for fuldst\u00e6ndige profiler, men til geng\u00e6ld giver den pr\u00e6cise indikationer p\u00e5 reelle flaskehalse, s\u00e5som omfattende skabelonstier, forladte hooks eller tr\u00e6ge netv\u00e6rksopkald. I perioder med h\u00f8j belastning sammenholder jeg disse indikationer med belastningstoppe og inddeler dermed kodestykkerne overskueligt. S\u00e5 snart jeg ser tilbagevendende m\u00f8nstre, tilpasser jeg for eksempel <strong>pm.max_b\u00f8rn<\/strong> og brug oplysningerne fra <a href=\"https:\/\/webhosting.de\/da\/php-fpm-processtyring-pm-max-born-optimere-kerne\/\">Indstil pm.max_children korrekt<\/a>.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img fetchpriority=\"high\" decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/08\/php-slowlog-analyse-6392.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Aktivering og konfiguration af Slowlog<\/h2>\n\n<p>Jeg aktiverer funktionen i den p\u00e5g\u00e6ldende pool og angiver sti, timeout og sporingsdybde, s\u00e5 <strong>Evaluering<\/strong> forbliver h\u00e5ndterbar. Derefter genstarter jeg PHP-FPM og kontrollerer, om logfilen kan skrives til med pool-brugerens rettigheder. Som udgangspunkt indstiller jeg ofte 5 sekunder for f\u00f8rst at fange grove afvigelser uden at oversv\u00f8mme systemet med logdata. Derefter s\u00e6nker jeg v\u00e6rdien trinvist, s\u00e5 snart de st\u00f8rste problemer er l\u00f8st. For at holde logfilerne overskuelige begr\u00e6nser jeg sporingsdybden til 20 til 30 frames, hvilket i praksis som regel er tilstr\u00e6kkeligt. P\u00e5 den m\u00e5de holder jeg <strong>Filst\u00f8rrelse<\/strong> under kontrol og g\u00e5r ikke glip af relevante detaljer.<\/p>\n\n<table>\n  <thead>\n    <tr>\n      <th>Indstilling<\/th>\n      <th>Form\u00e5l<\/th>\n      <th>Startv\u00e6rdi<\/th>\n      <th>Noter<\/th>\n    <\/tr>\n  <\/thead>\n  <tbody>\n    <tr>\n      <td><code>slowlog<\/code><\/td>\n      <td>Sti til logfilen<\/td>\n      <td>\/var\/log\/php-fpm\/www-slow.log<\/td>\n      <td>Kontroller stierne afh\u00e6ngigt af distributionen; skriverettigheder til <strong>www-data<\/strong> sikre<\/td>\n    <\/tr>\n    <tr>\n      <td><code>request_slowlog_timeout<\/code><\/td>\n      <td>T\u00e6rskel for \u201elangsom\u201c<\/td>\n      <td>5s<\/td>\n      <td>Start h\u00f8jt, senere <strong>s\u00e6nke<\/strong> (f.eks. 2\u20133 sekunder)<\/td>\n    <\/tr>\n    <tr>\n      <td><code>request_slowlog_trace_depth<\/code><\/td>\n      <td>Maks. dybde af backtrace<\/td>\n      <td>20\u201330<\/td>\n      <td>S\u00f8rg for, at sporene forbliver l\u00e6selige, uden <strong>Vigtige oplysninger<\/strong> at miste<\/td>\n    <\/tr>\n  <\/tbody>\n<\/table>\n\n<h2>Find logfilen og gennemse den hurtigt<\/h2>\n\n<p>F\u00f8rst tjekker jeg de konfigurerede stier og \u00e5bner logfilen med <strong>mindre<\/strong> eller tjek de sidste linjer med <code>tail -40<\/code>. P\u00e5 den m\u00e5de kan jeg straks se, om der kommer nye poster, og hvilke skripter der gentagne gange v\u00e6kker opm\u00e6rksomhed. For hurtigt at f\u00e5 overblik kigger jeg p\u00e5 filnavne, de ber\u00f8rte puljer og mist\u00e6nkelige URI\u2019er. Hvis jeg ikke finder nogen poster, aktiverer jeg indstillingerne i puljen, genindl\u00e6ser tjenesten og tjekker ejere samt rettigheder. I administrerede milj\u00f8er tjekker jeg desuden panelet eller startskripterne, s\u00e5 slowloggen virkelig <strong>f\u00f8lger med<\/strong>.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/08\/phpfpm_slowlogs4357.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Genkende blokke og t\u00e6lle m\u00f8nstre<\/h2>\n\n<p>Hver post vises som et afsnit, ofte adskilt af en <strong>Tom linje<\/strong>, hvilket g\u00f8r det lettere at t\u00e6lle. Jeg orienterer mig efter \u201e#0\u201c-linjerne, da de markerer det aktuelle udf\u00f8relsespunkt, hvor tiden g\u00e5r tabt. Ved hj\u00e6lp af enkle shell-pipelines filtrerer jeg de vigtigste funktioner ud og ser, hvilke steder der oftest bremser processen. P\u00e5 den m\u00e5de prioriterer jeg m\u00e5lrettet de funktioner, der samlet set tager mest tid. Derefter tjekker jeg, om disse hotspots kun opst\u00e5r ved belastningsspidser eller skaber problemer hele tiden. Denne inddeling bestemmer <strong>Sekvens<\/strong> mine foranstaltninger.<\/p>\n\n<h2>L\u00e6s indl\u00e6g: fra ramme #0 til starten<\/h2>\n\n<p>N\u00e5r jeg l\u00e6ser indl\u00e6ggene, starter jeg \u00f8verst ved <strong>#0<\/strong> og g\u00e5r trin for trin nedad for at forst\u00e5 vejen fra startpunktet til det aktuelle sted. Lange skabelonk\u00e6der tyder p\u00e5 omfattende rendering, mange hooks p\u00e5 un\u00f8dvendig plugin-byrde og en h\u00f8j andel af SQL-kode p\u00e5 manglende indekser. Jeg markerer linjenumre, funktionsnavne og filstier, s\u00e5 jeg hurtigt kan finde koden. Hvis stakken ligner ventel\u00f8kker eller gentagne operationer, tjekker jeg mellemhukommelsen og caching. P\u00e5 den m\u00e5de spilder jeg ikke tid p\u00e5 at <strong>Lokalisering<\/strong> problemet i koden.<\/p>\n\n<h2>Korrelering af Slowlog med adgangslogfiler<\/h2>\n\n<p>Jeg sammenk\u00e6der Slowlog med webserverlogfilerne, s\u00e5 jeg kan se de langsomme foresp\u00f8rgsler fra en bestemt <strong>URL<\/strong> kan tilordne. Ved hj\u00e6lp af tidsstempler og eventuelt PID\u2019er finder jeg de relevante poster i Nginx- eller Apache-loggen. P\u00e5 den m\u00e5de kan jeg identificere parametre, user-agents og svartider uden for PHP. Hvis der dukker tilbagevendende bes\u00f8gende eller identiske foresp\u00f8rgselsstrenge op, starter jeg en testk\u00f8rsel med netop disse scenarier. P\u00e5 den m\u00e5de finder jeg hurtigt reproducerbare tilf\u00e6lde og holder <strong>Analysetid<\/strong> kort sagt.<\/p>\n\n<h2>S\u00e6nk t\u00e6rskelv\u00e6rdien iterativt<\/h2>\n\n<p>Jeg starter med en gener\u00f8s t\u00e6rskel og l\u00f8ser f\u00f8rst de st\u00f8rste problemer <strong>Afvigere<\/strong> og s\u00e6nker den derefter trinvist. Denne fremgangsm\u00e5de reducerer logfilens st\u00f8rrelse og fokuserer min energi p\u00e5 de mest v\u00e6rdifulde rettelser. Efter hver optimeringsrunde v\u00e6lger jeg en lavere t\u00e6rskel og indsamler igen datas\u00e6t. P\u00e5 den m\u00e5de arbejder jeg mig frem fra den grove udv\u00e6lgelse til finjusteringen, uden at jeg drukner i st\u00f8j. Resultatet er m\u00e5lrettede justeringer og en <strong>klar<\/strong> Oversigt over de resterende flaskehalse.<\/p>\n\n<h2>Fra slowlog til l\u00f8sning: typiske l\u00f8sninger<\/h2>\n\n<p>Hvis top-rammen viser databasefunktioner, tjekker jeg SQL-s\u00e6tningerne med <strong>FORKLAR<\/strong>, opretter manglende indekser og begr\u00e6nser resultats\u00e6t. Ved fjernbetjente tjenester reducerer jeg timeout-tider, behandler svar asynkront eller cacher resultater. Hvis jeg finder ressourcekr\u00e6vende sl\u00f8jfer, forenkler jeg logikken, reducerer antallet af genneml\u00f8b og anvender mere effektive strukturer. I WordPress markerer jeg tilbagevendende hooks, udskifter tunge udvidelser og v\u00e6lger et lettere tema. Hvis antallet af PHP-processer blokerer behandlingen, holder jeg \u00f8je med ventetiderne og l\u00e6ser supplerende til <strong>Backtraces<\/strong> ogs\u00e5 k\u00f8er, f.eks. via <a href=\"https:\/\/webhosting.de\/da\/php-request-queueing-max-children-processing-limits-performance\/\">K\u00f8h\u00e5ndtering af PHP-anmodninger<\/a>.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/08\/PHP-FPM-Slowlog-Analyse-4958.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Kontinuerlig drift: effektiv logh\u00e5ndtering<\/h2>\n\n<p>Jeg skruer ikke logningen helt op hele tiden, s\u00e5 den <strong>I\/O-belastning<\/strong> forbliver h\u00e5ndterbar. I stedet arbejder jeg i faser: aktivt evaluerer og optimerer jeg, hvorefter jeg vender tilbage til et moderat niveau. Med Logrotate holder jeg filerne slanke og arkiverer gamle data i komprimeret form. N\u00e5r en analyse er afsluttet, h\u00e6ver jeg t\u00e6rsklen eller deaktiverer slowlogging midlertidigt. Derudover dokumenterer jeg indsigter og rettelser, s\u00e5 senere revisioner f\u00e5r et klart <strong>spor<\/strong> finde.<\/p>\n\n<h2>Hosting-diagnose: Skelne mellem server og applikation<\/h2>\n\n<p>Mange identiske Slowlog-rammer ved h\u00f8j CPU-belastning tyder p\u00e5 <strong>Anvendelseskode<\/strong>, mens manglende poster p\u00e5 den langsomme side snarere tyder p\u00e5 problemer med I\/O, netv\u00e6rk eller databaseserveren. I s\u00e5danne tilf\u00e6lde sammenligner jeg TTFB, PHP-tider og upstream-latens for at lokalisere flaskehalsen. Hvis jeg ser k\u00f8er og lange ventetider f\u00f8r udf\u00f8relse, tjekker jeg begr\u00e6nsninger og antallet af processer. Derudover supplerer jeg min diagnose med oplysninger om behandlingen af anmodninger og tager h\u00f8jde for eventuelle begr\u00e6nsninger, der bremser behandlingen. For at kunne danne mig et velunderbygget overblik l\u00e6ser jeg ud over logfilerne ogs\u00e5 oplysninger om <a href=\"https:\/\/webhosting.de\/da\/php-fpm-processtyring-pm-max-born-optimere-kerne\/\">Indstil pm.max_children korrekt<\/a> eller artikler om ventetider, s\u00e5 jeg kan <strong>Kapacitet<\/strong> tilpasser det p\u00e5 en fornuftig m\u00e5de.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/08\/phpfpm_slowlog_analysis_4732.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Praktisk eksempel: langsomt WordPress-backend<\/h2>\n\n<p>Jeg s\u00e6tter <strong>request_slowlog_timeout<\/strong> F\u00f8rst indstiller jeg tiden til 5 sekunder, genstarter PHP-FPM og indsamler data i 30 til 60 minutter under reel belastning. Derefter t\u00e6ller jeg de hyppigst forekommende \u201e#0\u201c-funktioner og leder efter tilbagevendende hooks eller ressourcekr\u00e6vende WP_Query-kald. Hvis der er eksterne tjenester involveret, m\u00e5ler jeg svartiderne og cacher resultaterne m\u00e5lrettet. Hvis sidevisninger bremses af sessionstilgange, tjekker jeg l\u00e5seadf\u00e6rden og flytter, hvis det er muligt, sessionsrelateret arbejde v\u00e6k fra den kritiske sti. Is\u00e6r ved logins og administratorhandlinger tester jeg indstillinger og sl\u00e5r advarsler fra <a href=\"https:\/\/webhosting.de\/da\/php-session-lasning-wordpress-login-langsom-optimering-serverfix\/\">L\u00e5sning af PHP-sessioner<\/a> for at, s\u00e5 min <strong>Backend<\/strong> reagerer hurtigere.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/08\/server-analyse-php-4782.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Pool-design og rettigheder: et solidt grundlag for brugbare slowlogs<\/h2>\n<p>Jeg opdeler programmer i separate <strong>Pools<\/strong> med tydelige navne (f.eks. www, admin, api), angiv entydige <code>lytte<\/code>-stik og individuelle <code>slowlog<\/code>-stier. Det g\u00f8r det lettere for mig at sammenholde poster og undg\u00e5 sammenblandinger. Det er vigtigt med ensartede <strong>Rettigheder til filer<\/strong>: Pool-brugeren (ofte www-data) skal have skriverettigheder til logstien og i mappen. I container- eller chroot-ops\u00e6tninger tjekker jeg, om stierne findes i navneomr\u00e5det og er gemt permanent \u2013 ellers forsvinder logfilerne ved genstart.<\/p>\n\n<h2>At l\u00e6se et Slowlog-indl\u00e6g i detaljer og analysere det automatisk<\/h2>\n<p>Indtastningerne starter typisk med et tidsstempel, en pool, et scriptfilnavn og en anmodnings-URI, efterfulgt af rammerne. Jeg t\u00e6ller \u201e#0\u201c-linjer og grupperer dem efter funktionsnavne for at synligg\u00f8re hotspots. Ved hj\u00e6lp af enkle pipes udtr\u00e6kker jeg de flaskehalse:<\/p>\n<pre><code>grep -E \"^#0|request.uri|script_filename\" \/var\/log\/php-fpm\/www-slow.log | sed 's\/  *\/ \/g'\n<\/code><\/pre>\n<p>Eller jeg t\u00e6ller de hyppigst forekommende top-frames:<\/p>\n<pre><code>grep \"^#0\" \/var\/log\/php-fpm\/www-slow.log | awk -F\": \" '{print $2}' | awk '{print $1}' | sort | uniq -c | sort -nr | head\n<\/code><\/pre>\n<p>Hvis jeg vil medtage URL og fil, opretter jeg blokke ved hj\u00e6lp af <code>awk<\/code> G\u00e5 igennem det og skriv de bedste kombinationer af funktion, URI og script ned til mig. P\u00e5 den m\u00e5de prioriterer jeg de rettelser, der giver st\u00f8rst udbytte.<\/p>\n\n<h2>Timeout-oversigt: hvordan Slowlog, PHP og webserveren spiller sammen<\/h2>\n<p>For at stille en pr\u00e6cis diagnose ordinerer jeg <strong>alle<\/strong> Timeouts: <code>request_slowlog_timeout<\/code> udl\u00f8ser snapshotet, <code>max_udf\u00f8relsestid<\/code> begr\u00e6nser PHP-k\u00f8rselstiden i scriptet, <code>request_terminate_timeout<\/code> kan afbryde FPM-workeren brat. P\u00e5 webserverens side griber <em>fastcgi<\/em>\u2013 henholdsvis. <em>proxy<\/em>-Timeouts (f.eks. <code>fastcgi_read_timeout<\/code>) og klient-timeouts. Hvis jeg indstiller slowloggen <em>over<\/em> hvis serveren g\u00e5r i timeout, mister jeg data; hvis den <em>herunder<\/em>, f\u00e5r jeg nyttige \u00f8jebliksbilleder, inden anmodningerne bryder af. Derfor holder jeg bevidst r\u00e6kkef\u00f8lgen: Webserver-timeout &gt; PHP-afbrydelse &gt; Slowlog &gt; m\u00e5llatens.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/08\/php-fpm-slow-logs-analysis-7125.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Inddrag FPM-status, k\u00f8 og processtyring<\/h2>\n<p>Slowlog viser, <em>hvor<\/em> Tid g\u00e5r til spilde \u2013 FPM-status afsl\u00f8rer, <em>hvorfor<\/em> Der er foresp\u00f8rgsler, der venter. Jeg aktiverer status-endepunktet og overv\u00e5ger <strong>i tomgang<\/strong>, <strong>aktiv<\/strong> og <strong>lyttek\u00f8<\/strong> og sammenligner dem med Slowlog-tidsstemplerne. Hvis k\u00f8en vokser, mens mange arbejdsprocesser h\u00e6nger fast i de samme funktioner, er koden flaskehalsen; hvis k\u00f8en vokser uden at Slowlog-v\u00e6rdierne stiger, mangler der kapacitet, eller ogs\u00e5 er der en opstr\u00f8ms faktor, der bremser. Med udgangspunkt i dette justerer jeg <code>pm<\/code>-Indstillinger (dynamisk\/efter behov), <code>pm.max_b\u00f8rn<\/code> og eventuelt. <code>pm.max_anmodninger<\/code>, for at opdage hukommelsesl\u00e6kager eller fragmentering.<\/p>\n\n<h2>S\u00e6rlige forhold i containere og administrerede milj\u00f8er<\/h2>\n<p>I Docker\/Kubernetes logger FPM ofte til <strong>stdout\/stderr<\/strong> eller i stier, der indsamles af log-aggregatorer. Jeg v\u00e6lger bevidst en <em>en<\/em> V\u00e6k, s\u00e5 jeg ikke har dobbelte eller manglende poster. Med <code>error_log = \/proc\/self\/fd\/2<\/code> og en dedikeret <code>slowlog<\/code>-Snapshots forbliver tilg\u00e6ngelige p\u00e5 en sti, der peger p\u00e5 et permanent volumen. I administrerede ops\u00e6tninger tjekker jeg, om udbyderen har aktiveret eller begr\u00e6nset slowlogs \u2013 og tilpasser intervallerne, s\u00e5 jeg ikke kommer i konflikt med rotationerne.<\/p>\n\n<h2>Databeskyttelse og sikkerhed: Logfiler uden risiko<\/h2>\n<p>Backtraces kan indeholde f\u00f8lsomme <strong>Parametre<\/strong>, filstier eller sessions-ID\u2019er. Jeg minimerer risici ved at udelade query-strings i adgangslogfiler, deaktivere fejlfindingsudskrifter i koden og holde kredsen af personer med l\u00e6seadgang lille. Ved udveksling med tredjeparter anonymiserer jeg stier og fjerner tokens. I produktive milj\u00f8er fastl\u00e6gger jeg korte opbevaringsperioder og gennemf\u00f8rer logrotation og komprimering p\u00e5 tv\u00e6rs af hele systemet.<\/p>\n\n<h2>WordPress: hurtigt at genkende tilbagevendende m\u00f8nstre<\/h2>\n<ul>\n  <li><strong>WP_Query\/WP_Meta_Query<\/strong>: Manglende indekser p\u00e5 <code>postmeta<\/code> eller hvis der filtreres efter felter, der ikke er indekseret, stiger k\u00f8retiden markant. Jeg reducerer meta-foresp\u00f8rgsler, bruger taksonomier eller opretter m\u00e5lrettede indekser.<\/li>\n  <li><strong>Transienter og objektcache<\/strong>: Mange ensartede beregninger tyder p\u00e5, at der mangler en vedvarende cache. Jeg aktiverer objektcachen og optimerer cache-n\u00f8gler og TTL'er.<\/li>\n  <li><strong>Hooks\/filtre<\/strong>: Lange k\u00e6der i stakken tyder p\u00e5 un\u00f8dvendige plugins. Jeg analyserer de dyreste hooks og fjerner eller erstatter udvidelser.<\/li>\n  <li><strong>HTTP-anmodninger<\/strong>: Interne API-kald (wp_remote_get) b\u00f8r udnytte timeout, keep-alive og caching; svarene b\u00f8r om muligt ikke blokere i anmodningstr\u00e5den.<\/li>\n  <li><strong>Skabelonvisning<\/strong>: Dybde <code>get_template_part<\/code>-Kaskader med filadgang drager fordel af caching og mindre fragmentering.<\/li>\n<\/ul>\n\n<h2>Undg\u00e5 fejltolkninger: hvad Slowlog ikke viser<\/h2>\n<p>Snapshot er en <strong>\u00d8jebliksbillede<\/strong>. Den beskriver ikke hele anmodningens levetid, men tilstanden p\u00e5 det tidspunkt, hvor den udl\u00f8ses. Almindelige faldgruber:<\/p>\n<ul>\n  <li><strong>Samplingssk\u00e6vhed<\/strong>: Sj\u00e6ldne, men ekstremt dyre stier kan g\u00e5 tabt, hvis timeout-v\u00e6rdien er for lav, eller hvis fasen var kort.<\/li>\n  <li><strong>Blokerende systemkald<\/strong>: <code>fopen<\/code>, <code>stat<\/code> eller DNS-opslag fremst\u00e5r som PHP-funktioner, men den egentlige ventetid finder sted i kernen eller i netv\u00e6rket.<\/li>\n  <li><strong>Automatisk indl\u00e6sning<\/strong>: Mange sm\u00e5 inkluderinger uden Opcache medf\u00f8rer spild, der virker harml\u00f8st i stakken. Et kig p\u00e5 Opcache-hitrate hj\u00e6lper med at s\u00e6tte det i perspektiv.<\/li>\n<\/ul>\n\n<h2>Hold \u00f8je med CLI, Cron og webhooks<\/h2>\n<p>Ikke alle ydeevneproblemer skyldes FPM. Tunge <strong>Cronjobs<\/strong> (f.eks. wp-cron), k\u00f8-arbejdere eller webhooks belaster CPU, I\/O eller databasen og forv\u00e6rrer dermed indirekte svartiderne. Jeg isolerer s\u00e5danne belastninger i egne processer, planl\u00e6gger dem uden for spidsbelastningsperioder og kontrollerer, om de k\u00f8rer via FPM-udl\u00f8st HTTP i stedet for CLI \u2013 ellers forvr\u00e6nger det visningen i slowloggen.<\/p>\n\n<h2>Praktisk implementering af logrotation<\/h2>\n<p>For at undg\u00e5, at slowlogs vokser sig for store, roterer jeg dem ofte og komprimerer gamle data. En typisk rotation opbevarer f\u00e5 generationer, signalerer til FPM, at den skal gen\u00e5bnes, og undg\u00e5r huller. Vigtigt: Efter rotationen skal FPM gen\u00e5bnes (HUP), s\u00e5 nye poster ikke ender i intetheden. De konkrete indstillinger tilpasser jeg efter trafik, timeout og sporingsdybde.<\/p>\n\n<h2>Tjekliste til hurtige resultater<\/h2>\n<ul>\n  <li>Aktiv\u00e9r Slowlog pr. pool, kontroller stier og rettigheder.<\/li>\n  <li>Start med 5s, indsaml data, t\u00e6l de bedste frames.<\/li>\n  <li>Korrelering med adgangslogfiler: tidsstempel, URI, brugeragent.<\/li>\n  <li>Kontroller tidsgr\u00e6nserne for upstream- og webserverne.<\/li>\n  <li>Overv\u00e5ge FPM-status og k\u00f8, <strong>pm<\/strong>-Juster gr\u00e6nserne.<\/li>\n  <li>L\u00f8s f\u00f8rst de kritiske punkter: SQL-indekser, caching, ressourcekr\u00e6vende hooks, I\/O.<\/li>\n  <li>S\u00e6nk timeout-tiden gradvist, og m\u00e5l igen.<\/li>\n  <li>Roter logfiler, dokumenter indsigter, spor \u00e6ndringer.<\/li>\n<\/ul>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/08\/phpfpm_slowlogs4357.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Kort sagt: din vej til bedre pr\u00e6stationer<\/h2>\n\n<p>Jeg aktiverer Slowlog og l\u00e6ser <strong>Top-rammer<\/strong>, sammenholder jeg det med adgangslogfilerne og l\u00f8ser f\u00f8rst de st\u00f8rste afvigelser. Derefter s\u00e6nker jeg t\u00e6rsklen, unders\u00f8ger tilbagevendende m\u00f8nstre og implementerer m\u00e5lrettede rettelser i koden, konfigurationen og caching. Med logrotation og moderate timeouts holder jeg driftsbelastningen lav. For WordPress fokuserer jeg p\u00e5 ressourcekr\u00e6vende foresp\u00f8rgsler, plugins, hooks og mulige session-locks. P\u00e5 den m\u00e5de finder jeg p\u00e5lideligt de reelle <strong>Flaskehalse<\/strong> og leverer m\u00e6rkbart hurtigere svar.<\/p>","protected":false},"excerpt":{"rendered":"<p>L\u00e6r, hvordan du korrekt fortolker PHP-FPM-slowloggen og analyserer langsomme foresp\u00f8rgsler i detaljer. Med denne vejledning kan du m\u00e5lrettet optimere ydeevnen i din PHP-applikation \u2013 den perfekte indgang til effektiv PHP-fejlfinding.<\/p>","protected":false},"author":1,"featured_media":20979,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[780],"tags":[],"class_list":["post-20986","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administration-anleitungen"],"acf":[],"_wp_attached_file":null,"_wp_attachment_metadata":null,"litespeed-optimize-size":null,"litespeed-optimize-set":null,"_elementor_source_image_hash":null,"_wp_attachment_image_alt":null,"stockpack_author_name":null,"stockpack_author_url":null,"stockpack_provider":null,"stockpack_image_url":null,"stockpack_license":null,"stockpack_license_url":null,"stockpack_modification":null,"color":null,"original_id":null,"original_url":null,"original_link":null,"unsplash_location":null,"unsplash_sponsor":null,"unsplash_exif":null,"unsplash_attachment_metadata":null,"_elementor_is_screenshot":null,"surfer_file_name":null,"surfer_file_original_url":null,"envato_tk_source_kit":null,"envato_tk_source_index":null,"envato_tk_manifest":null,"envato_tk_folder_name":null,"envato_tk_builder":null,"envato_elements_download_event":null,"_menu_item_type":null,"_menu_item_menu_item_parent":null,"_menu_item_object_id":null,"_menu_item_object":null,"_menu_item_target":null,"_menu_item_classes":null,"_menu_item_xfn":null,"_menu_item_url":null,"_trp_menu_languages":null,"rank_math_primary_category":null,"rank_math_title":null,"inline_featured_image":null,"_yoast_wpseo_primary_category":null,"rank_math_schema_blogposting":null,"rank_math_schema_videoobject":null,"_oembed_049c719bc4a9f89deaead66a7da9fddc":null,"_oembed_time_049c719bc4a9f89deaead66a7da9fddc":null,"_yoast_wpseo_focuskw":null,"_yoast_wpseo_linkdex":null,"_oembed_27e3473bf8bec795fbeb3a9d38489348":null,"_oembed_c3b0f6959478faf92a1f343d8f96b19e":null,"_trp_translated_slug_en_us":null,"_wp_desired_post_slug":null,"_yoast_wpseo_title":null,"tldname":null,"tldpreis":null,"tldrubrik":null,"tldpolicylink":null,"tldsize":null,"tldregistrierungsdauer":null,"tldtransfer":null,"tldwhoisprivacy":null,"tldregistrarchange":null,"tldregistrantchange":null,"tldwhoisupdate":null,"tldnameserverupdate":null,"tlddeletesofort":null,"tlddeleteexpire":null,"tldumlaute":null,"tldrestore":null,"tldsubcategory":null,"tldbildname":null,"tldbildurl":null,"tldclean":null,"tldcategory":null,"tldpolicy":null,"tldbesonderheiten":null,"tld_bedeutung":null,"_oembed_d167040d816d8f94c072940c8009f5f8":null,"_oembed_b0a0fa59ef14f8870da2c63f2027d064":null,"_oembed_4792fa4dfb2a8f09ab950a73b7f313ba":null,"_oembed_33ceb1fe54a8ab775d9410abf699878d":null,"_oembed_fd7014d14d919b45ec004937c0db9335":null,"_oembed_21a029d076783ec3e8042698c351bd7e":null,"_oembed_be5ea8a0c7b18e658f08cc571a909452":null,"_oembed_a9ca7a298b19f9b48ec5914e010294d2":null,"_oembed_f8db6b27d08a2bb1f920e7647808899a":null,"_oembed_168ebde5096e77d8a89326519af9e022":null,"_oembed_cdb76f1b345b42743edfe25481b6f98f":null,"_oembed_87b0613611ae54e86e8864265404b0a1":null,"_oembed_27aa0e5cf3f1bb4bc416a4641a5ac273":null,"_oembed_time_27aa0e5cf3f1bb4bc416a4641a5ac273":null,"_tldname":null,"_tldclean":null,"_tldpreis":null,"_tldcategory":null,"_tldsubcategory":null,"_tldpolicy":null,"_tldpolicylink":null,"_tldsize":null,"_tldregistrierungsdauer":null,"_tldtransfer":null,"_tldwhoisprivacy":null,"_tldregistrarchange":null,"_tldregistrantchange":null,"_tldwhoisupdate":null,"_tldnameserverupdate":null,"_tlddeletesofort":null,"_tlddeleteexpire":null,"_tldumlaute":null,"_tldrestore":null,"_tldbildname":null,"_tldbildurl":null,"_tld_bedeutung":null,"_tldbesonderheiten":null,"_oembed_ad96e4112edb9f8ffa35731d4098bc6b":null,"_oembed_8357e2b8a2575c74ed5978f262a10126":null,"_oembed_3d5fea5103dd0d22ec5d6a33eff7f863":null,"_eael_widget_elements":null,"_oembed_0d8a206f09633e3d62b95a15a4dd0487":null,"_oembed_time_0d8a206f09633e3d62b95a15a4dd0487":null,"_aioseo_description":null,"_eb_attr":null,"_eb_data_table":null,"_oembed_819a879e7da16dd629cfd15a97334c8a":null,"_oembed_time_819a879e7da16dd629cfd15a97334c8a":null,"_acf_changed":null,"_wpcode_auto_insert":null,"_edit_last":null,"_edit_lock":null,"_oembed_e7b913c6c84084ed9702cb4feb012ddd":null,"_oembed_bfde9e10f59a17b85fc8917fa7edf782":null,"_oembed_time_bfde9e10f59a17b85fc8917fa7edf782":null,"_oembed_03514b67990db061d7c4672de26dc514":null,"_oembed_time_03514b67990db061d7c4672de26dc514":null,"rank_math_news_sitemap_robots":null,"rank_math_robots":null,"_eael_post_view_count":"118","_trp_automatically_translated_slug_ru_ru":null,"_trp_automatically_translated_slug_et":null,"_trp_automatically_translated_slug_lv":null,"_trp_automatically_translated_slug_fr_fr":null,"_trp_automatically_translated_slug_en_us":null,"_wp_old_slug":null,"_trp_automatically_translated_slug_da_dk":null,"_trp_automatically_translated_slug_pl_pl":null,"_trp_automatically_translated_slug_es_es":null,"_trp_automatically_translated_slug_hu_hu":null,"_trp_automatically_translated_slug_fi":null,"_trp_automatically_translated_slug_ja":null,"_trp_automatically_translated_slug_lt_lt":null,"_elementor_edit_mode":null,"_elementor_template_type":null,"_elementor_version":null,"_elementor_pro_version":null,"_wp_page_template":null,"_elementor_page_settings":null,"_elementor_data":null,"_elementor_css":null,"_elementor_conditions":null,"_happyaddons_elements_cache":null,"_oembed_75446120c39305f0da0ccd147f6de9cb":null,"_oembed_time_75446120c39305f0da0ccd147f6de9cb":null,"_oembed_3efb2c3e76a18143e7207993a2a6939a":null,"_oembed_time_3efb2c3e76a18143e7207993a2a6939a":null,"_oembed_59808117857ddf57e478a31d79f76e4d":null,"_oembed_time_59808117857ddf57e478a31d79f76e4d":null,"_oembed_965c5b49aa8d22ce37dfb3bde0268600":null,"_oembed_time_965c5b49aa8d22ce37dfb3bde0268600":null,"_oembed_81002f7ee3604f645db4ebcfd1912acf":null,"_oembed_time_81002f7ee3604f645db4ebcfd1912acf":null,"_elementor_screenshot":null,"_oembed_7ea3429961cf98fa85da9747683af827":null,"_oembed_time_7ea3429961cf98fa85da9747683af827":null,"_elementor_controls_usage":null,"_elementor_page_assets":[],"_elementor_screenshot_failed":null,"theplus_transient_widgets":null,"_eael_custom_js":null,"_wp_old_date":null,"_trp_automatically_translated_slug_it_it":null,"_trp_automatically_translated_slug_pt_pt":null,"_trp_automatically_translated_slug_zh_cn":null,"_trp_automatically_translated_slug_nl_nl":null,"_trp_automatically_translated_slug_pt_br":null,"_trp_automatically_translated_slug_sv_se":null,"rank_math_analytic_object_id":null,"rank_math_internal_links_processed":"1","_trp_automatically_translated_slug_ro_ro":null,"_trp_automatically_translated_slug_sk_sk":null,"_trp_automatically_translated_slug_bg_bg":null,"_trp_automatically_translated_slug_sl_si":null,"litespeed_vpi_list":null,"litespeed_vpi_list_mobile":null,"rank_math_seo_score":null,"rank_math_contentai_score":null,"ilj_limitincominglinks":null,"ilj_maxincominglinks":null,"ilj_limitoutgoinglinks":null,"ilj_maxoutgoinglinks":null,"ilj_limitlinksperparagraph":null,"ilj_linksperparagraph":null,"ilj_blacklistdefinition":null,"ilj_linkdefinition":null,"_eb_reusable_block_ids":null,"rank_math_focus_keyword":"PHP-FPM Slowlog","rank_math_og_content_image":null,"_yoast_wpseo_metadesc":null,"_yoast_wpseo_content_score":null,"_yoast_wpseo_focuskeywords":null,"_yoast_wpseo_keywordsynonyms":null,"_yoast_wpseo_estimated-reading-time-minutes":null,"rank_math_description":null,"surfer_last_post_update":null,"surfer_last_post_update_direction":null,"surfer_keywords":null,"surfer_location":null,"surfer_draft_id":null,"surfer_permalink_hash":null,"surfer_scrape_ready":null,"_thumbnail_id":"20979","footnotes":null,"_links":{"self":[{"href":"https:\/\/webhosting.de\/da\/wp-json\/wp\/v2\/posts\/20986","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/webhosting.de\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/webhosting.de\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/webhosting.de\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/webhosting.de\/da\/wp-json\/wp\/v2\/comments?post=20986"}],"version-history":[{"count":0,"href":"https:\/\/webhosting.de\/da\/wp-json\/wp\/v2\/posts\/20986\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/webhosting.de\/da\/wp-json\/wp\/v2\/media\/20979"}],"wp:attachment":[{"href":"https:\/\/webhosting.de\/da\/wp-json\/wp\/v2\/media?parent=20986"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/webhosting.de\/da\/wp-json\/wp\/v2\/categories?post=20986"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/webhosting.de\/da\/wp-json\/wp\/v2\/tags?post=20986"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}