<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Milan Felix Šulc</title>
    <description>The latest articles on DEV Community by Milan Felix Šulc (@f3l1x).</description>
    <link>https://dev.to/f3l1x</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F133297%2Fafa356ae-47e5-42b1-a7a4-11df31150773.png</url>
      <title>DEV Community: Milan Felix Šulc</title>
      <link>https://dev.to/f3l1x</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/f3l1x"/>
    <language>en</language>
    <item>
      <title>Vercel PHP: PHP 8.4 &amp; PHP 8.5</title>
      <dc:creator>Milan Felix Šulc</dc:creator>
      <pubDate>Wed, 21 Jan 2026 09:21:25 +0000</pubDate>
      <link>https://dev.to/nx1/vercel-php-php-84-php-85-18ch</link>
      <guid>https://dev.to/nx1/vercel-php-php-84-php-85-18ch</guid>
      <description>&lt;p&gt;Back in the ZEIT Now days, I wrote a couple of posts about running PHP on “a frontend platform” and shipping tiny serverless endpoints next to static sites:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://dev.to/nx1/bleeding-edge-php-on-zeit-now-565g"&gt;https://dev.to/nx1/bleeding-edge-php-on-zeit-now-565g&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/nx1/deploy-static-frontend-php-files-using-zeit-now-mg"&gt;https://dev.to/nx1/deploy-static-frontend-php-files-using-zeit-now-mg&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://community.vercel.com/t/vercel-php/31428" rel="noopener noreferrer"&gt;https://community.vercel.com/t/vercel-php/31428&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fast-forward: ZEIT is now Vercel, and the community PHP runtime has matured into a pretty practical way to run PHP on &lt;strong&gt;Vercel Functions&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And there’s fresh news: &lt;strong&gt;v0.8.0 adds PHP 8.4&lt;/strong&gt;, and &lt;strong&gt;v0.9.0 adds PHP 8.5&lt;/strong&gt; 🎉&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Runtime repo: &lt;a href="https://github.com/vercel-community/php/" rel="noopener noreferrer"&gt;https://github.com/vercel-community/php/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Announcement thread: &lt;a href="https://community.vercel.com/t/vercel-php/31428" rel="noopener noreferrer"&gt;https://community.vercel.com/t/vercel-php/31428&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What shipped
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;vercel-php@0.8.0&lt;/code&gt; → &lt;strong&gt;PHP 8.4.x&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;vercel-php@0.9.0&lt;/code&gt; → &lt;strong&gt;PHP 8.5.x&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Why you might care about PHP 8.4 / 8.5
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;PHP 8.4&lt;/strong&gt; is a major language update with features like &lt;strong&gt;property hooks&lt;/strong&gt;, &lt;strong&gt;asymmetric visibility&lt;/strong&gt;, DOM updates, and general performance/cleanup.&lt;br&gt;&lt;br&gt;
Release notes: &lt;a href="https://www.php.net/releases/8.4/en.php" rel="noopener noreferrer"&gt;https://www.php.net/releases/8.4/en.php&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PHP 8.5&lt;/strong&gt; (released &lt;strong&gt;Nov 20, 2025&lt;/strong&gt;) adds goodies like a built-in &lt;strong&gt;URI&lt;/strong&gt; extension and the &lt;strong&gt;pipe operator (&lt;code&gt;|&amp;gt;&lt;/code&gt;)&lt;/strong&gt;, plus other improvements.&lt;br&gt;&lt;br&gt;
Release notes: &lt;a href="https://www.php.net/releases/8.5/en.php" rel="noopener noreferrer"&gt;https://www.php.net/releases/8.5/en.php&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you’re deploying micro-APIs, webhooks, “backend-for-frontend” endpoints, or lightweight PHP apps on Vercel, being able to pin a modern runtime version is a big deal.&lt;/p&gt;


&lt;h2&gt;
  
  
  The runtime in one sentence
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;vercel-php&lt;/code&gt; is a community runtime that runs your PHP code inside &lt;strong&gt;Vercel Functions&lt;/strong&gt;, with Composer support and a bunch of bundled extensions.&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/vercel-community/php/" rel="noopener noreferrer"&gt;https://github.com/vercel-community/php/&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Quickstart: “Hello PHP” on Vercel (PHP 8.5)
&lt;/h2&gt;

&lt;p&gt;Minimal structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;project/
├─ api/
│  └─ index.php
└─ vercel.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;code&gt;api/index.php&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="nb"&gt;header&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'content-type: application/json'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nb"&gt;json_encode&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
  &lt;span class="s1"&gt;'ok'&lt;/span&gt;  &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s1"&gt;'php'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;PHP_VERSION&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s1"&gt;'sapi'&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;php_sapi_name&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;code&gt;vercel.json&lt;/code&gt;&lt;/strong&gt; (pin &lt;strong&gt;PHP 8.5&lt;/strong&gt;)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"functions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"api/*.php"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"runtime"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vercel-php@0.9.0"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Deploy with the Vercel CLI or the Dashboard. Done.&lt;/p&gt;

&lt;p&gt;If you want a canonical “works out of the box” demo, there’s also a tiny landing/demo here:&lt;br&gt;&lt;br&gt;
&lt;a href="https://php.vercel.app/" rel="noopener noreferrer"&gt;https://php.vercel.app/&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Want PHP 8.4 instead?
&lt;/h2&gt;

&lt;p&gt;Same setup—just change the runtime version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"functions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"api/*.php"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"runtime"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vercel-php@0.8.0"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  “Route everything to index.php” (classic app style)
&lt;/h2&gt;

&lt;p&gt;If you’re adapting a small framework/router or want a single entrypoint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"functions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"api/index.php"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"runtime"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vercel-php@0.9.0"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"routes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"src"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/(.*)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"dest"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/api/index.php"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Composer support (yes)
&lt;/h2&gt;

&lt;p&gt;If you have dependencies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;project/
├─ api/
│  └─ index.php
├─ composer.json
└─ vercel.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Practical tip: add a &lt;code&gt;.vercelignore&lt;/code&gt; and ignore &lt;code&gt;/vendor&lt;/code&gt; so you don’t upload it—let the build install deps instead.&lt;/p&gt;




&lt;h2&gt;
  
  
  Tuning Function limits (duration + memory)
&lt;/h2&gt;

&lt;p&gt;You can configure per-function limits in &lt;code&gt;vercel.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"functions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"api/*.php"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"runtime"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vercel-php@0.9.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"memory"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"maxDuration"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note: Duration limits depend on your Vercel plan and whether features like Fluid Compute are enabled.&lt;br&gt;&lt;br&gt;
Docs: &lt;a href="https://vercel.com/docs/functions/configuring-functions/duration" rel="noopener noreferrer"&gt;https://vercel.com/docs/functions/configuring-functions/duration&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Overriding php.ini
&lt;/h2&gt;

&lt;p&gt;Need custom INI settings? Drop a &lt;code&gt;php.ini&lt;/code&gt; next to your handlers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;api/
├─ index.php
└─ php.ini
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="py"&gt;memory_limit&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;1024M&lt;/span&gt;
&lt;span class="py"&gt;disable_functions&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"exec,system"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  A couple of gotchas
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Local dev&lt;/strong&gt;: the runtime ecosystem historically hasn’t been perfect with &lt;code&gt;vercel dev&lt;/code&gt; in every setup. If you hit issues, the simplest fallback is using PHP’s built-in server locally and treating Vercel as your deploy target.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Config file choice&lt;/strong&gt;: Vercel supports &lt;code&gt;vercel.json&lt;/code&gt; or &lt;code&gt;vercel.ts&lt;/code&gt; (programmatic), but you typically use one configuration approach per project.
Docs: &lt;a href="https://vercel.com/docs/projects/project-configuration" rel="noopener noreferrer"&gt;https://vercel.com/docs/projects/project-configuration&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Upgrading from older pins
&lt;/h2&gt;

&lt;p&gt;If you’re already using &lt;code&gt;vercel-php&lt;/code&gt;, upgrading is often just changing the runtime string:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;vercel-php@0.7.x&lt;/code&gt; → &lt;code&gt;vercel-php@0.8.0&lt;/code&gt; (PHP 8.4)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;vercel-php@0.8.x&lt;/code&gt; → &lt;code&gt;vercel-php@0.9.0&lt;/code&gt; (PHP 8.5)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;make sure your &lt;code&gt;composer.json&lt;/code&gt; PHP constraint matches (e.g. &lt;code&gt;^8.4&lt;/code&gt; / &lt;code&gt;^8.5&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;run tests&lt;/li&gt;
&lt;li&gt;deploy to a Preview URL and hit the endpoints&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Runtime repo: &lt;a href="https://github.com/vercel-community/php/" rel="noopener noreferrer"&gt;https://github.com/vercel-community/php/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Announcement thread: &lt;a href="https://community.vercel.com/t/vercel-php/31428" rel="noopener noreferrer"&gt;https://community.vercel.com/t/vercel-php/31428&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Demo: &lt;a href="https://php.vercel.app/" rel="noopener noreferrer"&gt;https://php.vercel.app/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;PHP 8.4 release notes: &lt;a href="https://www.php.net/releases/8.4/en.php" rel="noopener noreferrer"&gt;https://www.php.net/releases/8.4/en.php&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;PHP 8.5 release notes: &lt;a href="https://www.php.net/releases/8.5/en.php" rel="noopener noreferrer"&gt;https://www.php.net/releases/8.5/en.php&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Vercel function duration: &lt;a href="https://vercel.com/docs/functions/configuring-functions/duration" rel="noopener noreferrer"&gt;https://vercel.com/docs/functions/configuring-functions/duration&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Vercel project configuration: &lt;a href="https://vercel.com/docs/projects/project-configuration" rel="noopener noreferrer"&gt;https://vercel.com/docs/projects/project-configuration&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>php</category>
      <category>vercel</category>
      <category>serverless</category>
      <category>devops</category>
    </item>
    <item>
      <title>Deploy Static Frontend + PHP Files Using ZEIT Now</title>
      <dc:creator>Milan Felix Šulc</dc:creator>
      <pubDate>Mon, 16 Dec 2019 09:10:12 +0000</pubDate>
      <link>https://dev.to/nx1/deploy-static-frontend-php-files-using-zeit-now-mg</link>
      <guid>https://dev.to/nx1/deploy-static-frontend-php-files-using-zeit-now-mg</guid>
      <description>&lt;p&gt;I am quite a fan of &lt;a href="https://zeit.co"&gt;ZEIT&lt;/a&gt; company and even more of their tool called &lt;a href="https://zeit.co/now"&gt;Now&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I consider myself mainly as PHP developer, but I also like JavaScript. In these days static site generators are raising and I am totally into it.&lt;/p&gt;

&lt;p&gt;So how to take advantage of static frontend but with dynamic backend written in PHP?&lt;/p&gt;

&lt;p&gt;Since November 2019 it's simple as possible with &lt;a href="https://zeit.co/blog/customizing-serverless-functions"&gt;ZEIT Now&lt;/a&gt;.&lt;/p&gt;


&lt;blockquote class="ltag__twitter-tweet"&gt;
      &lt;div class="ltag__twitter-tweet__media"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--b0Gs7zbp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/media/ELbMUELW4AAo0So.jpg" alt="unknown tweet media content"&gt;
      &lt;/div&gt;

  &lt;div class="ltag__twitter-tweet__main"&gt;
    &lt;div class="ltag__twitter-tweet__header"&gt;
      &lt;img class="ltag__twitter-tweet__profile-image" src="https://res.cloudinary.com/practicaldev/image/fetch/s--ialxF8ae--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/profile_images/463019920343592960/bJdt4ud2_normal.png" alt="Milan Felix Šulc profile image"&gt;
      &lt;div class="ltag__twitter-tweet__full-name"&gt;
        Milan Felix Šulc
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__username"&gt;
        @xf3l1x
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__twitter-logo"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--P4t6ys1m--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/twitter-f95605061196010f91e64806688390eb1a4dbc9e913682e043eb8b1e06ca484f.svg" alt="twitter logo"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__body"&gt;
      &lt;a href="https://twitter.com/rauchg"&gt;@rauchg&lt;/a&gt; &lt;a href="https://twitter.com/drk"&gt;@drk&lt;/a&gt; &lt;a href="https://twitter.com/rjs"&gt;&lt;/a&gt;&lt;a href="https://twitter.com/rjs"&gt;@rjs&lt;/a&gt; &lt;a href="https://twitter.com/ionos_com"&gt;@ionos_com&lt;/a&gt; &lt;a href="https://twitter.com/zeithq"&gt;&lt;/a&gt;&lt;a href="https://twitter.com/zeithq"&gt;@zeithq&lt;/a&gt; Hi &lt;a href="https://twitter.com/rjs"&gt;&lt;/a&gt;&lt;a href="https://twitter.com/rjs"&gt;@rjs&lt;/a&gt;. &lt;br&gt;&lt;br&gt;Deploy static frontend with PHP files to &lt;a href="https://twitter.com/zeithq"&gt;&lt;/a&gt;&lt;a href="https://twitter.com/zeithq"&gt;@zeithq&lt;/a&gt; is pretty easy. We're using it daily.&lt;br&gt;&lt;br&gt;I've prepared for you a demo. 🎄&lt;br&gt;&lt;br&gt;You can reach me anytime. 👨🏻‍💻&lt;br&gt;&lt;br&gt;&lt;a href="https://t.co/IP96WzPE73"&gt;bit.ly/2RF8cbh&lt;/a&gt; 
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__date"&gt;
      12:17 PM - 10 Dec 2019
    &lt;/div&gt;


    &lt;div class="ltag__twitter-tweet__actions"&gt;
      &lt;a href="https://twitter.com/intent/tweet?in_reply_to=1204374619433635841" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-reply-action.svg" alt="Twitter reply action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/retweet?tweet_id=1204374619433635841" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-retweet-action.svg" alt="Twitter retweet action"&gt;
      &lt;/a&gt;
      0
      &lt;a href="https://twitter.com/intent/like?tweet_id=1204374619433635841" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-like-action.svg" alt="Twitter like action"&gt;
      &lt;/a&gt;
      1
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;


&lt;p&gt;👀 &lt;a href="https://imgur.com/V7CcInl"&gt;https://imgur.com/V7CcInl&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Minimal project structure looks like this, you gonna need only 3 files.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;project/
├── api/
│   ├── index.php
├── now.json
└── index.html
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;File &lt;strong&gt;index.html&lt;/strong&gt; contains static frontend.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;

#
# Fetch data from /api/index.php using Fetch API
#

&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;File &lt;strong&gt;api/index.php&lt;/strong&gt; contains dynamic data or expose API endpoint.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="nb"&gt;header&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'conten-type: application/json'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nb"&gt;json_encode&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'tech'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'ZEIT Now'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;File &lt;strong&gt;now.json&lt;/strong&gt; setup deployment.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"functions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"api/index.php"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"runtime"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"now-php@0.0.7"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Finally you can call &lt;code&gt;now&lt;/code&gt; command and see what happened.&lt;/p&gt;

&lt;p&gt;View this &lt;a href="https://github.com/juicyfx/now-examples"&gt;example on Github&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>php</category>
      <category>deployment</category>
      <category>static</category>
      <category>serverless</category>
    </item>
    <item>
      <title>Bleeding Edge PHP on ZEIT Now</title>
      <dc:creator>Milan Felix Šulc</dc:creator>
      <pubDate>Sun, 07 Jul 2019 16:11:03 +0000</pubDate>
      <link>https://dev.to/nx1/bleeding-edge-php-on-zeit-now-565g</link>
      <guid>https://dev.to/nx1/bleeding-edge-php-on-zeit-now-565g</guid>
      <description>&lt;p&gt;Today I would like to show you ZEIT Now platform. Well, you've probably heard about it. There are many blogposts about this awesome piece of technology (&lt;a href="https://dev.to/search?q=zeit%20now"&gt;https://dev.to/search?q=zeit%20now&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;But, I have some good news for PHP devs. Since June (06/2019) I am working on the enhanced PHP builders for ZEIT Now.&lt;/p&gt;

&lt;p&gt;These builders support:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;multiple PHP versions (7.2.20, 7.3.7, 7.4.0alpha2) 🚀

&lt;ul&gt;
&lt;li&gt;official PHP builder is 7.1.22&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;multiple running modes (server, cgi, cli, fpm) 🧙‍♂️

&lt;ul&gt;
&lt;li&gt;just pick whatever you like&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;many preinstalled PHP extensions 📦&lt;/li&gt;
&lt;li&gt;install dependencies via Composer 🤩&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The updated builders you can find at the Github &lt;a href="https://github.com/juicyfx/now-php"&gt;juicyfx/now-php&lt;/a&gt; and I would appreciate any feedback.&lt;/p&gt;

&lt;p&gt;How to test it? Take a look at &lt;a href="https://github.com/juicyfx/now-php/tree/master/examples"&gt;examples&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;How to deploy under 1 minute? Create &lt;code&gt;index.php&lt;/code&gt; and &lt;code&gt;now.json&lt;/code&gt; in your project's folder. If you're not familiar with ZEIT Now, &lt;a href="https://zeit.co/now"&gt;take a look&lt;/a&gt; at official website.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt; 

&lt;span class="nb"&gt;phpinfo&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;





&lt;div class="highlight"&gt;&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"builds"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"src"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"old.php"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"use"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@now/php"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"src"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"new.php"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"use"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"now-php"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Yep, that's all. And now call &lt;code&gt;now&lt;/code&gt;. 🤓&lt;/p&gt;

&lt;p&gt;You should saw something like that.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4MZ9w3hZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/oyvm8n1l6m360q2b2bfn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4MZ9w3hZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/oyvm8n1l6m360q2b2bfn.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;At the end, some examples.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;official - &lt;a href="https://php.now.sh/"&gt;https://php.now.sh/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;phpinfo - &lt;a href="https://php.jfx.cz/"&gt;https://php.jfx.cz/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;extensions - &lt;a href="https://php.jfx.cz/ext/"&gt;https://php.jfx.cz/ext/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;ini - &lt;a href="https://php.jfx.cz/ini/"&gt;https://php.jfx.cz/ini/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;JSON API - &lt;a href="https://php.jfx.cz/api/users.php"&gt;https://php.jfx.cz/api/users.php&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;test - &lt;a href="https://php.jfx.cz/test.php"&gt;https://php.jfx.cz/test.php&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'm also testing Caddy server with FPM and &lt;a href="http://bref.sh"&gt;Bref.sh&lt;/a&gt;. There are many features you might be looking for.&lt;/p&gt;




&lt;p&gt;PHP builder was separated from zeit/now-builders to solo repository - &lt;a href="https://github.com/juicyfx/now-php"&gt;https://github.com/juicyfx/now-php&lt;/a&gt;. Take a look.&lt;/p&gt;




&lt;p&gt;Happy testing,&lt;br&gt;
Felix&lt;/p&gt;

</description>
      <category>php</category>
      <category>static</category>
      <category>deployment</category>
      <category>serverless</category>
    </item>
  </channel>
</rss>
