[{"data":1,"prerenderedAt":592},["ShallowReactive",2],{"navigation":3,"/docs/image-variations":96,"/docs/image-variations-surround":587},[4],{"title":5,"path":6,"stem":7,"children":8,"page":43},"Docs","/docs","docs",[9,25,44,64,80,88],{"title":10,"path":11,"stem":12,"children":13,"icon":24},"Getting Started","/docs/getting-started","docs/1.getting-started/1.index",[14,16,20],{"title":15,"path":11,"stem":12},"Introduction",{"title":17,"path":18,"stem":19},"Quick start","/docs/getting-started/quick-start","docs/1.getting-started/2.quick-start",{"title":21,"path":22,"stem":23},"Running from source","/docs/getting-started/running-from-source","docs/1.getting-started/3.running-from-source","i-lucide-rocket",{"title":26,"icon":27,"path":28,"stem":29,"children":30,"page":43},"Configuration","i-lucide-settings-2","/docs/configuration","docs/2.configuration",[31,35,39],{"title":32,"path":33,"stem":34},"Adding a real database","/docs/configuration/adding-databases","docs/2.configuration/1.adding-databases",{"title":36,"path":37,"stem":38},"Customizing the image","/docs/configuration/customizing-the-image","docs/2.configuration/2.customizing-the-image",{"title":40,"path":41,"stem":42},"Common tuning strategies","/docs/configuration/common-tuning-strategies","docs/2.configuration/3.common-tuning-strategies",false,{"title":45,"path":46,"stem":47,"children":48,"icon":63},"Image variations","/docs/image-variations","docs/3.image-variations/1.index",[49,51,55,59],{"title":50,"path":46,"stem":47},"Choosing a variation",{"title":52,"path":53,"stem":54},"FPM-NGINX","/docs/image-variations/fpm-nginx","docs/3.image-variations/2.fpm-nginx",{"title":56,"path":57,"stem":58},"FrankenPHP","/docs/image-variations/frankenphp","docs/3.image-variations/3.frankenphp",{"title":60,"path":61,"stem":62},"FPM-Apache","/docs/image-variations/fpm-apache","docs/3.image-variations/4.fpm-apache","i-lucide-layers",{"title":65,"path":66,"stem":67,"children":68,"icon":79},"Benchmarks & Methodology","/docs/benchmarks","docs/4.benchmarks/1.index",[69,71,75],{"title":70,"path":66,"stem":67},"Methodology",{"title":72,"path":73,"stem":74},"Reading your results","/docs/benchmarks/reading-your-results","docs/4.benchmarks/2.reading-your-results",{"title":76,"path":77,"stem":78},"Testing from another machine","/docs/benchmarks/testing-from-another-machine","docs/4.benchmarks/3.testing-from-another-machine","i-lucide-flask-conical",{"title":81,"path":82,"stem":83,"children":84,"icon":87},"Community Results","/docs/community-results","docs/5.community-results/1.index",[85],{"title":86,"path":82,"stem":83},"Submitting your results","i-lucide-users",{"title":89,"path":90,"stem":91,"children":92,"icon":95},"FAQ","/docs/faq","docs/6.faq/1.index",[93],{"title":94,"path":90,"stem":91},"Frequently asked questions","i-lucide-circle-help",{"id":97,"title":50,"body":98,"description":580,"extension":581,"links":582,"meta":583,"navigation":448,"path":46,"redirect":582,"seo":584,"sitemap":585,"stem":47,"__hash__":586},"docs/docs/3.image-variations/1.index.md",{"type":99,"value":100,"toc":574},"minimark",[101,105,119,124,196,207,211,214,224,310,316,319,379,388,392,395,485,492,508,512,518,521,527,533,543,548,570],[102,103,104],"p",{},"BenchKit publishes one application in several image variations, each serving PHP with a different web server, on every PHP version the application supports. The application is identical in all of them, so any difference between two runs comes from the server or the PHP version rather than from the code. The tag you pull decides what you get.",[102,106,107,108,118],{},"Images are published to Docker Hub at ",[109,110,114],"a",{"href":111,"rel":112},"https://hub.docker.com/r/serversideup/benchkit-laravel",[113],"nofollow",[115,116,117],"code",{},"serversideup/benchkit-laravel"," and to the GitHub Container Registry.",[120,121,123],"h2",{"id":122},"at-a-glance","At a glance",[125,126,127,143],"table",{},[128,129,130],"thead",{},[131,132,133,137,140],"tr",{},[134,135,136],"th",{},"Variation",[134,138,139],{},"How PHP is served",[134,141,142],{},"Tag",[144,145,146,164,180],"tbody",{},[131,147,148,156,159],{},[149,150,151],"td",{},[109,152,153],{"href":53},[154,155,52],"strong",{},[149,157,158],{},"nginx hands PHP requests to PHP-FPM",[149,160,161],{},[115,162,163],{},"latest",[131,165,166,172,175],{},[149,167,168],{},[109,169,170],{"href":57},[154,171,56],{},[149,173,174],{},"One binary serves PHP directly",[149,176,177],{},[115,178,179],{},"frankenphp",[131,181,182,188,191],{},[149,183,184],{},[109,185,186],{"href":61},[154,187,60],{},[149,189,190],{},"Apache hands PHP requests to PHP-FPM",[149,192,193],{},[115,194,195],{},"fpm-apache",[102,197,198,199,202,203,206],{},"All three listen on port 8080 inside the container, serve from ",[115,200,201],{},"/var/www/html/public",", and run as ",[115,204,205],{},"www-data",".",[120,208,210],{"id":209},"the-full-tag-schema","The full tag schema",[102,212,213],{},"Every tag is built from three parts, and every part is optional:",[215,216,221],"pre",{"className":217,"code":219,"language":220},[218],"language-text","serversideup/benchkit-laravel:{php-version}-{variation}-{operating-system}\n","text",[115,222,219],{"__ignoreMap":223},"",[125,225,226,239],{},[128,227,228],{},[131,229,230,233,236],{},[134,231,232],{},"Part",[134,234,235],{},"When omitted",[134,237,238],{},"Options",[144,240,241,266,287],{},[131,242,243,248,251],{},[149,244,245],{},[115,246,247],{},"{php-version}",[149,249,250],{},"The newest supported PHP",[149,252,253,254,257,258,261,262,265],{},"A major (",[115,255,256],{},"8","), minor (",[115,259,260],{},"8.4","), or patch (",[115,263,264],{},"8.4.24",") version",[131,267,268,273,278],{},[149,269,270],{},[115,271,272],{},"{variation}",[149,274,275],{},[115,276,277],{},"fpm-nginx",[149,279,280,282,283,282,285],{},[115,281,277],{},", ",[115,284,195],{},[115,286,179],{},[131,288,289,294,297],{},[149,290,291],{},[115,292,293],{},"{operating-system}",[149,295,296],{},"The current Debian stable",[149,298,299,282,302,305,306,309],{},[115,300,301],{},"trixie",[115,303,304],{},"bookworm",", or ",[115,307,308],{},"debian"," (tracks the current stable)",[102,311,312,313,315],{},"Leave every part off and you get ",[115,314,163],{},": the newest PHP, on FPM-NGINX, on the current Debian.",[102,317,318],{},"Some examples, from loosest to most pinned:",[125,320,321,330],{},[128,322,323],{},[131,324,325,327],{},[134,326,142],{},[134,328,329],{},"What you get",[144,331,332,341,350,359,369],{},[131,333,334,338],{},[149,335,336],{},[115,337,163],{},[149,339,340],{},"Newest PHP, FPM-NGINX, current Debian",[131,342,343,347],{},[149,344,345],{},[115,346,179],{},[149,348,349],{},"Newest PHP, FrankenPHP",[131,351,352,356],{},[149,353,354],{},[115,355,260],{},[149,357,358],{},"PHP 8.4, FPM-NGINX",[131,360,361,366],{},[149,362,363],{},[115,364,365],{},"8.4-frankenphp",[149,367,368],{},"PHP 8.4, FrankenPHP",[131,370,371,376],{},[149,372,373],{},[115,374,375],{},"8.5-fpm-apache-bookworm",[149,377,378],{},"Everything pinned",[102,380,381,382,387],{},"The live list is on ",[109,383,386],{"href":384,"rel":385},"https://hub.docker.com/r/serversideup/benchkit-laravel/tags",[113],"Docker Hub",". A PHP version appears there as soon as the application supports it and drops off when it no longer does, so the tag list is the honest answer to \"which versions can I compare\". There are no Alpine images — Geekbench needs glibc, so the hardware stage would not run there.",[120,389,391],{"id":390},"comparing-php-versions","Comparing PHP versions",[102,393,394],{},"The PHP version is a variable you can move on its own. Hold the variation still, change the version, and run the suite twice on the same machine:",[215,396,401],{"className":397,"code":398,"filename":399,"language":400,"meta":223,"style":223},"language-bash shiki shiki-themes github-dark","docker run -p 80:8080 \\\n  -v benchkit-runs:/var/www/html/storage/app/runs \\\n  serversideup/benchkit-laravel:8.4-frankenphp\n\n# then the same thing on the next version up\ndocker run -p 80:8080 \\\n  -v benchkit-runs:/var/www/html/storage/app/runs \\\n  serversideup/benchkit-laravel:8.5-frankenphp\n","Terminal","bash",[115,402,403,426,437,443,450,457,470,479],{"__ignoreMap":223},[404,405,408,412,416,420,423],"span",{"class":406,"line":407},"line",1,[404,409,411],{"class":410},"svObZ","docker",[404,413,415],{"class":414},"sU2Wk"," run",[404,417,419],{"class":418},"sDLfK"," -p",[404,421,422],{"class":414}," 80:8080",[404,424,425],{"class":418}," \\\n",[404,427,429,432,435],{"class":406,"line":428},2,[404,430,431],{"class":418},"  -v",[404,433,434],{"class":414}," benchkit-runs:/var/www/html/storage/app/runs",[404,436,425],{"class":418},[404,438,440],{"class":406,"line":439},3,[404,441,442],{"class":414},"  serversideup/benchkit-laravel:8.4-frankenphp\n",[404,444,446],{"class":406,"line":445},4,[404,447,449],{"emptyLinePlaceholder":448},true,"\n",[404,451,453],{"class":406,"line":452},5,[404,454,456],{"class":455},"sAwPA","# then the same thing on the next version up\n",[404,458,460,462,464,466,468],{"class":406,"line":459},6,[404,461,411],{"class":410},[404,463,415],{"class":414},[404,465,419],{"class":418},[404,467,422],{"class":414},[404,469,425],{"class":418},[404,471,473,475,477],{"class":406,"line":472},7,[404,474,431],{"class":418},[404,476,434],{"class":414},[404,478,425],{"class":418},[404,480,482],{"class":406,"line":481},8,[404,483,484],{"class":414},"  serversideup/benchkit-laravel:8.5-frankenphp\n",[102,486,487,488,491],{},"Both containers mount the same runs volume, so the second container still has the first run and the two open side by side in ",[154,489,490],{},"Compare",". Each run records the exact PHP version that served it, so they are never mistaken for each other.",[102,493,494,495,497,498,501,502,497,505,507],{},"Change one thing at a time. ",[115,496,365],{}," against ",[115,499,500],{},"8.5-frankenphp"," measures PHP 8.5. ",[115,503,504],{},"8.4-fpm-nginx",[115,506,500],{}," measures two things at once, and you will not be able to say which one moved the number.",[120,509,511],{"id":510},"comparing-variations-fairly","Comparing variations fairly",[102,513,514,515,517],{},"Run each variation on the same machine, one after the other, and compare the runs in ",[154,516,490],{},". Because the hardware and the application are identical, what is left is the serving model.",[102,519,520],{},"Two things will spoil that comparison if you let them:",[102,522,523,526],{},[154,524,525],{},"A stock FPM pool is a ceiling, not a measurement."," Under PHP-FPM a request occupies a worker for as long as it takes, so the pool size caps concurrency no matter how fast the hardware is. BenchKit flags a run where the pool was the limit.",[102,528,529,532],{},[154,530,531],{},"Neither side is tuned out of the box."," A stock pool against a stock FrankenPHP tells you about the defaults rather than about the servers. Compare tuned against tuned, and say which tuning you used.",[534,535,536],"tip",{"to":37},[102,537,538,539,542],{},"Tune the pool before you compare. ",[115,540,541],{},"PHP_FPM_PM_MAX_CHILDREN"," is the one that matters most.",[102,544,545,547],{},[109,546,72],{"href":73}," covers both in more depth.",[549,550,551,558,564],"card-group",{},[552,553,555],"card",{"icon":554,"title":52,"to":53},"i-simple-icons-nginx",[102,556,557],{},"The default image and the baseline for every comparison.",[552,559,561],{"icon":560,"title":56,"to":57},"i-lucide-zap",[102,562,563],{},"Runs classic or in Octane worker mode, from the same image.",[552,565,567],{"icon":566,"title":60,"to":61},"i-simple-icons-apache",[102,568,569],{},"For when Apache is what you run in production.",[571,572,573],"style",{},"html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":223,"searchDepth":428,"depth":428,"links":575},[576,577,578,579],{"id":122,"depth":428,"text":123},{"id":209,"depth":428,"text":210},{"id":390,"depth":428,"text":391},{"id":510,"depth":428,"text":511},"BenchKit ships the same application on three web servers and every PHP version it supports. The image tag picks both.","md",null,{},{"title":50,"description":580},{"loc":46},"Z0H9TG99pF2atBhkg63ArepgJZHPOth39snXt1kmJNc",[588,590],{"title":40,"path":41,"stem":42,"description":589,"children":-1},"BenchKit ships deliberately untuned. Here is what to change, and how to tell whether it helped.",{"title":52,"path":53,"stem":54,"description":591,"children":-1},"The default BenchKit image, and the baseline every other variation is measured against.",1787761544505]