[{"data":1,"prerenderedAt":736},["ShallowReactive",2],{"navigation":3,"/docs/upgrading/upgrade-to-v4":249,"/docs/upgrading/upgrade-to-v4-surround":731},[4],{"title":5,"path":6,"stem":7,"children":8},"Docs","/docs","docs",[9,12,48,77,132,160,185,206,219,236],{"title":10,"path":6,"stem":11},"","docs/index",{"title":13,"path":14,"stem":15,"children":16,"icon":47},"Getting Started","/docs/getting-started","docs/1.getting-started/1.index",[17,19,23,27,31,35,39,43],{"title":18,"path":14,"stem":15},"Introduction",{"title":20,"path":21,"stem":22},"Container basics","/docs/getting-started/container-basics","docs/1.getting-started/2.container-basics",{"title":24,"path":25,"stem":26},"Installation","/docs/getting-started/installation","docs/1.getting-started/3.installation",{"title":28,"path":29,"stem":30},"These images vs others","/docs/getting-started/these-images-vs-others","docs/1.getting-started/4.these-images-vs-others",{"title":32,"path":33,"stem":34},"Choosing an image","/docs/getting-started/choosing-an-image","docs/1.getting-started/5.choosing-an-image",{"title":36,"path":37,"stem":38},"Default configurations","/docs/getting-started/default-configurations","docs/1.getting-started/6.default-configurations",{"title":40,"path":41,"stem":42},"Migrating from official PHP images","/docs/getting-started/migrating-from-official-php-images","docs/1.getting-started/7.migrating-from-official-php-images",{"title":44,"path":45,"stem":46},"Contributing","/docs/getting-started/contributing","docs/1.getting-started/99.contributing",false,{"title":49,"path":50,"stem":51,"children":52,"page":47},"Image Variations","/docs/image-variations","docs/2.image-variations",[53,57,61,65,69,73],{"title":54,"path":55,"stem":56},"CLI","/docs/image-variations/cli","docs/2.image-variations/cli",{"title":58,"path":59,"stem":60},"FPM","/docs/image-variations/fpm","docs/2.image-variations/fpm",{"title":62,"path":63,"stem":64},"FPM-Apache","/docs/image-variations/fpm-apache","docs/2.image-variations/fpm-apache",{"title":66,"path":67,"stem":68},"FPM-NGINX","/docs/image-variations/fpm-nginx","docs/2.image-variations/fpm-nginx",{"title":70,"path":71,"stem":72},"FrankenPHP","/docs/image-variations/frankenphp","docs/2.image-variations/frankenphp",{"title":74,"path":75,"stem":76},"NGINX Unit (removed)","/docs/image-variations/unit","docs/2.image-variations/unit",{"title":78,"path":79,"stem":80,"children":81,"page":47},"Framework Guides","/docs/framework-guides","docs/3.framework-guides",[82,123],{"title":83,"icon":47,"defaultOpen":47,"path":84,"stem":85,"children":86,"page":47},"Laravel","/docs/framework-guides/laravel","docs/3.framework-guides/1.laravel",[87,91,95,99,103,107,111,115,119],{"title":88,"path":89,"stem":90},"Automations","/docs/framework-guides/laravel/automations","docs/3.framework-guides/1.laravel/1.automations",{"title":92,"path":93,"stem":94},"Running workers","/docs/framework-guides/laravel/workers","docs/3.framework-guides/1.laravel/2.workers",{"title":96,"path":97,"stem":98},"Health checks","/docs/framework-guides/laravel/health-checks","docs/3.framework-guides/1.laravel/3.health-checks",{"title":100,"path":101,"stem":102},"Horizon","/docs/framework-guides/laravel/horizon","docs/3.framework-guides/1.laravel/4.horizon",{"title":104,"path":105,"stem":106},"Nightwatch","/docs/framework-guides/laravel/nightwatch","docs/3.framework-guides/1.laravel/5.nightwatch",{"title":108,"path":109,"stem":110},"Octane","/docs/framework-guides/laravel/octane","docs/3.framework-guides/1.laravel/6.octane",{"title":112,"path":113,"stem":114},"Queue","/docs/framework-guides/laravel/queue","docs/3.framework-guides/1.laravel/7.queue",{"title":116,"path":117,"stem":118},"Reverb","/docs/framework-guides/laravel/reverb","docs/3.framework-guides/1.laravel/8.reverb",{"title":120,"path":121,"stem":122},"Task scheduler","/docs/framework-guides/laravel/task-scheduler","docs/3.framework-guides/1.laravel/9.task-scheduler",{"title":124,"icon":47,"defaultOpen":47,"path":125,"stem":126,"children":127,"page":47},"WordPress","/docs/framework-guides/wordpress","docs/3.framework-guides/2.wordpress",[128],{"title":129,"path":130,"stem":131},"Using WordPress with Docker","/docs/framework-guides/wordpress/using-wordpress-with-docker","docs/3.framework-guides/2.wordpress/4.using-wordpress-with-docker",{"title":133,"path":134,"stem":135,"children":136,"page":47},"Deployment And Production","/docs/deployment-and-production","docs/4.deployment-and-production",[137,141,145,148,152,156],{"title":138,"path":139,"stem":140},"Packaging your app for deployment","/docs/deployment-and-production/packaging-your-app-for-deployment","docs/4.deployment-and-production/1.packaging-your-app-for-deployment",{"title":142,"path":143,"stem":144},"Configuring SSL","/docs/deployment-and-production/configuring-ssl","docs/4.deployment-and-production/2.configuring-ssl",{"title":96,"path":146,"stem":147},"/docs/deployment-and-production/health-checks","docs/4.deployment-and-production/3.health-checks",{"title":149,"path":150,"stem":151},"Configuring trusted proxies","/docs/deployment-and-production/configuring-trusted-proxies","docs/4.deployment-and-production/4.configuring-trusted-proxies",{"title":153,"path":154,"stem":155},"Production performance tuning","/docs/deployment-and-production/production-performance-tuning","docs/4.deployment-and-production/5.production-performance-tuning",{"title":157,"path":158,"stem":159},"Choosing a host","/docs/deployment-and-production/choosing-a-host","docs/4.deployment-and-production/6.choosing-a-host",{"title":161,"icon":47,"defaultOpen":47,"path":162,"stem":163,"children":164,"page":47},"Customization","/docs/customizing-the-image","docs/5.customizing-the-image",[165,169,173,177,181],{"title":166,"path":167,"stem":168},"Changing php.ini settings","/docs/customizing-the-image/changing-common-php-settings","docs/5.customizing-the-image/1.changing-common-php-settings",{"title":170,"path":171,"stem":172},"Installing PHP extensions","/docs/customizing-the-image/installing-additional-php-extensions","docs/5.customizing-the-image/2.installing-additional-php-extensions",{"title":174,"path":175,"stem":176},"Adding start up scripts","/docs/customizing-the-image/adding-your-own-start-up-scripts","docs/5.customizing-the-image/3.adding-your-own-start-up-scripts",{"title":178,"path":179,"stem":180},"Using S6 Overlay","/docs/customizing-the-image/using-s6-overlay","docs/5.customizing-the-image/4.using-s6-overlay",{"title":182,"path":183,"stem":184},"Understanding file permissions","/docs/customizing-the-image/understanding-file-permissions","docs/5.customizing-the-image/5.understanding-file-permissions",{"title":186,"icon":47,"defaultOpen":47,"path":187,"stem":188,"children":189,"page":47},"Upgrading","/docs/upgrading","docs/6.upgrading",[190,194,198,202],{"title":191,"path":192,"stem":193},"Upgrade guide","/docs/upgrading/upgrade-guide","docs/6.upgrading/1.upgrade-guide",{"title":195,"path":196,"stem":197},"Upgrade to v5","/docs/upgrading/upgrade-to-v5","docs/6.upgrading/2.upgrade-to-v5",{"title":199,"path":200,"stem":201},"Upgrade to v4","/docs/upgrading/upgrade-to-v4","docs/6.upgrading/3.upgrade-to-v4",{"title":203,"path":204,"stem":205},"Upgrade to v3","/docs/upgrading/upgrade-to-v3","docs/6.upgrading/4.upgrade-to-v3",{"title":207,"path":208,"stem":209,"children":210,"page":47},"Troubleshooting","/docs/troubleshooting","docs/7.troubleshooting",[211,215],{"title":212,"path":213,"stem":214},"Common issues","/docs/troubleshooting/common-issues","docs/7.troubleshooting/1.common-issues",{"title":216,"path":217,"stem":218},"Getting help","/docs/troubleshooting/getting-help","docs/7.troubleshooting/2.getting-help",{"title":220,"path":221,"stem":222,"children":223,"page":47},"Security","/docs/security","docs/8.security",[224,228,232],{"title":225,"path":226,"stem":227},"How images are built","/docs/security/how-images-are-built","docs/8.security/1.how-images-are-built",{"title":229,"path":230,"stem":231},"Verifying images","/docs/security/verifying-images","docs/8.security/2.verifying-images",{"title":233,"path":234,"stem":235},"Vulnerability scanning","/docs/security/vulnerability-scanning","docs/8.security/3.vulnerability-scanning",{"title":237,"path":238,"stem":239,"children":240,"page":47},"Reference","/docs/reference","docs/9.reference",[241,245],{"title":242,"path":243,"stem":244},"Environment variable specification","/docs/reference/environment-variable-specification","docs/9.reference/1.environment-variable-specification",{"title":246,"path":247,"stem":248},"Command reference","/docs/reference/command-reference","docs/9.reference/2.command-reference",{"id":250,"title":199,"body":251,"description":722,"extension":723,"links":724,"meta":725,"navigation":728,"path":200,"redirect":724,"seo":729,"stem":201,"__hash__":730},"docs/docs/6.upgrading/3.upgrade-to-v4.md",{"type":252,"value":253,"toc":709},"minimark",[254,261,266,389,395,419,424,445,448,484,489,502,506,631,635,695,705],[255,256,257],"lead-p",{},[258,259,260],"p",{},"Version 4 adds the FrankenPHP variation and more environment variables. Most apps need no changes, but check the four below before you update your tag.",[262,263,265],"h2",{"id":264},"changes-to-check","Changes to check",[267,268,269,285],"table",{},[270,271,272],"thead",{},[273,274,275,279,282],"tr",{},[276,277,278],"th",{},"Change",[276,280,281],{},"Likelihood of impact",[276,283,284],{},"You're affected if",[286,287,288,324,344,367],"tbody",{},[273,289,290,303,306],{},[291,292,293],"td",{},[294,295,297,298,302],"a",{"href":296},"#php-fpm-uses-ondemand-behind-a-web-server","PHP-FPM uses ",[299,300,301],"code",{},"ondemand"," behind a web server",[291,304,305],{},"Low",[291,307,308,309,312,313,316,317,320,321],{},"You tuned ",[299,310,311],{},"PHP_FPM_PM_*"," for ",[299,314,315],{},"dynamic"," on ",[299,318,319],{},"fpm-nginx"," or ",[299,322,323],{},"fpm-apache",[273,325,326,335,337],{},[291,327,328],{},[294,329,331,332],{"href":330},"#laravel-automations-run-php-artisan-optimize","Laravel automations run ",[299,333,334],{},"php artisan optimize",[291,336,305],{},[291,338,339,340,343],{},"You set ",[299,341,342],{},"AUTORUN_ENABLED=true"," and rely on the individual cache commands",[273,345,346,352,355],{},[291,347,348],{},[294,349,351],{"href":350},"#automations-stop-the-container-when-laravel-is-missing","Automations stop the container when Laravel is missing",[291,353,354],{},"Medium",[291,356,339,357,359,360,363,364],{},[299,358,342],{}," on a container without ",[299,361,362],{},"artisan"," and ",[299,365,366],{},"vendor/",[273,368,369,379,382],{},[291,370,371],{},[294,372,374,375,378],{"href":373},"#the-unit-variation-was-removed-in-v410","The ",[299,376,377],{},"unit"," variation was removed in v4.1.0",[291,380,381],{},"High for Unit users",[291,383,384,385,388],{},"You use a ",[299,386,387],{},"-unit"," tag",[390,391,297,393,302],"h3",{"id":392},"php-fpm-uses-ondemand-behind-a-web-server",[299,394,301],{},[258,396,397,400,401,316,403,363,405,407,408,411,412,414,415,418],{},[299,398,399],{},"PHP_FPM_PM_CONTROL"," now defaults to ",[299,402,301],{},[299,404,319],{},[299,406,323],{},", which starts PHP-FPM workers only when requests arrive. The ",[299,409,410],{},"fpm"," variation still defaults to ",[299,413,315],{},". Set ",[299,416,417],{},"PHP_FPM_PM_CONTROL=dynamic"," to keep the v3 behavior.",[390,420,331,422],{"id":421},"laravel-automations-run-php-artisan-optimize",[299,423,334],{},[258,425,426,427,429,430,432,433,436,437,440,441,444],{},"With ",[299,428,342],{},", the automations now run ",[299,431,334],{}," instead of each cache command on its own. Turn off one cache with its variable, such as ",[299,434,435],{},"AUTORUN_LARAVEL_ROUTE_CACHE=false",". On Laravel 11.38.0 and later that becomes ",[299,438,439],{},"optimize --except",". See ",[294,442,443],{"href":89},"Laravel automations",".",[390,446,351],{"id":447},"automations-stop-the-container-when-laravel-is-missing",[258,449,450,451,453,454,456,457,460,461,463,464,467,468,471,472,475,476,479,480,483],{},"In v3, the automations were skipped silently when ",[299,452,362],{}," wasn't found. In v4, a container with ",[299,455,342],{}," exits with an error unless ",[299,458,459],{},"APP_BASE_DIR"," has both ",[299,462,362],{}," and a ",[299,465,466],{},"vendor"," directory. It also exits when ",[299,469,470],{},"AUTORUN_LARAVEL_MIGRATION_ISOLATION=true"," and Laravel is older than 9.38.0. Run ",[299,473,474],{},"composer install"," when you build the image, or set ",[299,477,478],{},"AUTORUN_ENABLED"," only on containers that have your app. v5 adds ",[299,481,482],{},"AUTORUN_LARAVEL_SKIP_IF_NOT_FOUND=true"," to skip instead.",[390,485,374,487,378],{"id":486},"the-unit-variation-was-removed-in-v410",[299,488,377],{},[258,490,491,492,494,495,497,498,501],{},"NGINX archived the Unit project, so v4.1.0 and later don't build the ",[299,493,377],{}," variation. Existing ",[299,496,387],{}," tags still pull but are no longer updated. See ",[294,499,500],{"href":75},"Unit"," for how to move to another variation.",[262,503,505],{"id":504},"new-features","New features",[507,508,509,519,536,556,577,588,597,608,614],"ul",{},[510,511,512,516,517,444],"li",{},[513,514,515],"strong",{},"FrankenPHP variation"," on Debian and Alpine, with a health check and environment variable configuration. See ",[294,518,70],{"href":71},[510,520,521,524,525,528,529,532,533,444],{},[513,522,523],{},"More Laravel automation options:"," migration modes (",[299,526,527],{},"fresh",", ",[299,530,531],{},"refresh","), a database connection, seeding, and ",[299,534,535],{},"AUTORUN_DEBUG",[510,537,538,541,542,528,545,548,549,552,553,444],{},[513,539,540],{},"More environment variables"," for PHP, OPcache, NGINX, Apache, and FrankenPHP, such as ",[299,543,544],{},"NGINX_HTTP_PORT",[299,546,547],{},"NGINX_CLIENT_MAX_BODY_SIZE",", and ",[299,550,551],{},"PHP_OPCACHE_VALIDATE_TIMESTAMPS",". See the ",[294,554,555],{"href":243},"environment variable reference",[510,557,558,561,562,565,566,528,569,572,573,576],{},[513,559,560],{},"IPv6 for NGINX"," with ",[299,563,564],{},"NGINX_LISTEN_IP_PROTOCOL"," (",[299,567,568],{},"all",[299,570,571],{},"ipv4",", or ",[299,574,575],{},"ipv6",").",[510,578,579,561,582,363,585,444],{},[513,580,581],{},"Faster health checks at startup",[299,583,584],{},"--start-period",[299,586,587],{},"--start-interval",[510,589,590,316,593,363,595,444],{},[513,591,592],{},"Health checks stay out of the access logs",[299,594,319],{},[299,596,323],{},[510,598,599,604,605,444],{},[513,600,601],{},[299,602,603],{},"docker-php-serversideup-set-file-permissions"," detects the variation and accepts extra directories with ",[299,606,607],{},"--dir",[510,609,610,613],{},[513,611,612],{},"Apache access logs"," include the referrer and user agent.",[510,615,616,619,620,623,624,627,628,444],{},[513,617,618],{},"NGINX"," sets ",[299,621,622],{},"absolute_redirect off;",", handles ",[299,625,626],{},"svgz"," with Symfony's asset mapper, and lets PHP generate ",[299,629,630],{},"robots.txt",[262,632,634],{"id":633},"update-your-tag","Update your tag",[636,637,642],"pre",{"className":638,"code":639,"filename":640,"language":641,"meta":10,"style":10},"language-yaml shiki shiki-themes github-dark","services:\n  php:\n    image: serversideup/php:8.5-fpm-nginx\n    ports:\n      - \"80:8080\"\n","compose.yml","yaml",[299,643,644,657,665,678,686],{"__ignoreMap":10},[645,646,649,653],"span",{"class":647,"line":648},"line",1,[645,650,652],{"class":651},"s4JwU","services",[645,654,656],{"class":655},"s95oV",":\n",[645,658,660,663],{"class":647,"line":659},2,[645,661,662],{"class":651},"  php",[645,664,656],{"class":655},[645,666,668,671,674],{"class":647,"line":667},3,[645,669,670],{"class":651},"    image",[645,672,673],{"class":655},": ",[645,675,677],{"class":676},"sU2Wk","serversideup/php:8.5-fpm-nginx\n",[645,679,681,684],{"class":647,"line":680},4,[645,682,683],{"class":651},"    ports",[645,685,656],{"class":655},[645,687,689,692],{"class":647,"line":688},5,[645,690,691],{"class":655},"      - ",[645,693,694],{"class":676},"\"80:8080\"\n",[258,696,697,698,701,702,704],{},"This is a floating v5 tag. To stop at v4, use a version-pinned tag such as ",[299,699,700],{},"8.5-fpm-nginx-v4.5.3",", then read ",[294,703,195],{"href":196}," before you move on.",[706,707,708],"style",{},"html pre.shiki code .s4JwU, html code.shiki .s4JwU{--shiki-default:#85E89D}html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}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":10,"searchDepth":659,"depth":659,"links":710},[711,720,721],{"id":264,"depth":659,"text":265,"children":712},[713,715,717,718],{"id":392,"depth":667,"text":714},"PHP-FPM uses ondemand behind a web server",{"id":421,"depth":667,"text":716},"Laravel automations run php artisan optimize",{"id":447,"depth":667,"text":351},{"id":486,"depth":667,"text":719},"The unit variation was removed in v4.1.0",{"id":504,"depth":659,"text":505},{"id":633,"depth":659,"text":634},"What changed when serversideup/php moved from v3 to v4, and the defaults to check before you update your tag.","md",null,{"head":726,"layout":7},{"title":727},"Upgrade to v4 - Docker PHP - Server Side Up",true,{"title":199,"description":722},"TaMMKNP9bFP4dN7J4ooYVttgPLfhfkuI5o11HOWOKQY",[732,734],{"title":195,"path":196,"stem":197,"description":733,"children":-1},"The breaking changes, new defaults, and new variables when you move from serversideup/php v4 to v5.",{"title":203,"path":204,"stem":205,"description":735,"children":-1},"The breaking changes and migration steps when you move from serversideup/php v2 to v3.",1793811963865]