{"data":{"allMarkdownRemark":{"edges":[{"node":{"id":"61712d64-9fb5-5c05-8e36-ae37d9bf956d","frontmatter":{"category":"Coding","title":"Take a deep Bref, and run your Symfony app serverless","date":"2019-06-24","summary":"Yet another case study of developing serverless apps with PHP.","thumbnail":{"relativePath":"pages/php-serverless-with-bref/blog.jpeg","childImageSharp":{"resolutions":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAABAACA//EABUBAQEAAAAAAAAAAAAAAAAAAAAC/9oADAMBAAIQAxAAAAFvIGahEOP/xAAYEAADAQEAAAAAAAAAAAAAAAAAARMCEv/aAAgBAQABBQLlG9clCrRTXVWf/8QAFREBAQAAAAAAAAAAAAAAAAAAEBH/2gAIAQMBAT8Bh//EABURAQEAAAAAAAAAAAAAAAAAAAAR/9oACAECAQE/Aar/xAAXEAADAQAAAAAAAAAAAAAAAAAAESAh/9oACAEBAAY/AsFP/8QAGRABAQEBAQEAAAAAAAAAAAAAAREAMSFx/9oACAEBAAE/IROt9TIugIGZBbfeZrv/2gAMAwEAAgADAAAAEC//AP/EABcRAAMBAAAAAAAAAAAAAAAAAAABESH/2gAIAQMBAT8Q0qiI/8QAFhEBAQEAAAAAAAAAAAAAAAAAAREQ/9oACAECAQE/ECGLn//EAB4QAQEAAQMFAAAAAAAAAAAAAAERACExUUFhgcHR/9oACAEBAAE/EG97q6XxipRA8SmUKC93GIysvGBJkuwRxavr5n//2Q==","width":488,"height":325,"src":"/static/af9a71b099ce7da56586de41ed112b03/a2998/blog.jpeg","srcSet":"/static/af9a71b099ce7da56586de41ed112b03/a2998/blog.jpeg 1x"}}},"authorName":"Wojciech Oroński","authorDescription":"Wojciech is a Senior Software Engineer at AUTO1 Group.","authorAvatar":{"relativePath":"pages/php-serverless-with-bref/avatar.png","childImageSharp":{"resolutions":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsSAAALEgHS3X78AAACtklEQVQ4y4VUvWtTURS/SV7sUIeK+g/o6GSS9/Ly8pKmKc0g2gqBVkrBQAcpOggOuhVxcbAG/FpcOgqOguAg1G6COIifCKKIijo5qDWf/n4v57QHFx/8uOfde+7vnm9Xq8WZqalKmmupVNzl5Mvn81WgncvlXmHtAh3IH7CuA7NhONKNojBbrUbbHI7C5GSc4YEQFYGNQqEw9H1/CHkohD3K3JP950CTd0gUxyWvXq+kkx9DtqyXhGBLiQnKtJQwD17l3Xq9mq5UooxTN0lmLOooMdx8B/k+cA94RiJD3AuCgPJ1cpTLJc8ZN617JPqD9UwQ+OMaV3jiYe8I8ElI6UVXSJedScCGWJe8KvIpns3M1NLlcpgl4JIn+hEe7IsBPZLj/zPWvUk25bW+gIdffL+wZ3FxLsX4Ms4EY2RCtGli3RErz/KgLQd0tS/kL+Hq7lar6UiihAQtFcI75p569dDBmjdilbXwG4j38WIcRx5Ki3WWYXkZtx+phdAfyL0fTpMADMxLt0dkJY8kUvyZf0rstAnVQEmdEClhVwgv81IYBmMsVnWXTYAOGRPCEyaGO4QQPoq5AyWH/BPrIW0tbSu6u7R0PAWicei81tIxLv/mS+smuENTV3d33C4n1pkMnxedri0drI95OGuDK6+pQkutNNnNQ+eX8Wpoyuai49SA8MJU/kALXPZCEs3PH03hfz9Ivsr+FhNi3GWYDmqnNK3bfK1YLPJ/k/W4sHAsZbJ7g2fUUWKx7pL2pyquCcl74CZwDt0ywTPGDshqt8hUagNP5c6DRqOWZps6DsdkMI5Ib8lQOOn+87Fl2aKcA5qsZNowe8wkV1FcYfqB75CvAXP50XcYaDDwOHsrybiyurqy7SlnYjJgWbx0RTOJ2ExA+QLwRDOqWZVWXQMOUHd6upqmZSQj119HCq8aFJGDXQAAAABJRU5ErkJggg==","width":50,"height":50,"src":"/static/d606e0fe3a0b15d5494a19629b2b3022/45876/avatar.png","srcSet":"/static/d606e0fe3a0b15d5494a19629b2b3022/45876/avatar.png 1x"}}},"headerImage":null},"html":"<h2>tl;dr</h2>\n<p>Since AWS lambda supports custom runtimes you can use PHP to create AWS lambda functions.\nBut it comes with two major drawbacks </p>\n<ul>\n<li>first running custom runtime for PHP is not very easy,</li>\n<li>the second which is limiting usage of popular PHP frameworks in lambda functions development process.</li>\n</ul>\n<p>With bref.sh these problems will disappear. Let's try to run Symfony framework as a serverless app.</p>\n<h2>What is serverless ?</h2>\n<p>What does it mean that something is Serverless? Does it mean there are no servers at all?\nOf course not. There are still servers behind scenes, but you don't have to worry about maintaining the servers and reserve their capacity. Your infrastructure is scaled automatically, and you just pay only for what you use.\nDoes this kind of architecture have only pros or there are some drawbacks?\nLet's leave the discussion of all the smaller pros and cons of serverless applications for another article.\nI will focus on the biggest drawback which is an impact on our code. Frameworks that we use in our daily PHP development are not ready to work with lambdas because they were not designed for those kinds of architecture.\nImagine you are a PHP developer and you want to run serverless microservice using one of the most popular frameworks like Symfony or Laravel. Imagine you can develop your microservice locally and just deploy it as lambda functions. Is it possible with PHP\nprogramming language? Yes, it is. Even if AWS Lambda does not have native support for PHP.</p>\n<h2>Here comes Bref.</h2>\n<p>Since AWS lambda supports custom runtimes, you can create one for PHP and run your lambda functions written in that language. There are plenty of articles which describe the process of creating custom runtimes, but believe me it's time-consuming and not super easy.\nLet's take a look at the bref.sh project and try to run a simple Symfony app as lambda.</p>\n<p>I assume you have knowledge about Symfony framework, or you have an existing project and some knowledge about AWS platform.</p>\n<p>Before we start please make sure you have installed:</p>\n<ul>\n<li><a href=\"https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html\">AWS CLI</a></li>\n<li><a href=\"https://aws.amazon.com/serverless/sam/\">AWS SAM CLI</a></li>\n<li>And setup AWS credentials</li>\n</ul>\n<p>First, we have to add Bref to our project with <code class=\"language-text\">composer require mnapoli/bref</code>\nThen from your project root command line run <code class=\"language-text\">vendor/bin/bref init</code>\nIt will create two additional files in your project template.yaml and index.php.\nYou can remove index.php for this moment, as it will be unnecessary.</p>\n<p>As you may know, AWS lambda filesystem is read-only excluding <code class=\"language-text\">/tmp</code> dir\nSo we have to extend <code class=\"language-text\">src/Kernel.php</code> of Symfony with these two functions</p>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre class=\"language-html\"><code class=\"language-html\">    public function getLogDir(): string\n    {\n        // When on the lambda only /tmp is writeable\n        if (getenv('LAMBDA_TASK_ROOT') !== false) {\n            return '/tmp/log/';\n        }\n\n        return $this->getProjectDir().'/var/log';\n    }\n\n    public function getCacheDir(): string\n    {\n        // When on the lambda only /tmp is writeable\n        if (getenv('LAMBDA_TASK_ROOT') !== false) {\n            return '/tmp/cache/'.$this->environment;\n        }\n\n        return $this->getProjectDir().'/var/cache/'.$this->environment;\n    }</code></pre></div>\n<p>Let's take a closer look at template.yaml</p>\n<div class=\"gatsby-highlight\" data-language=\"yaml\"><pre class=\"language-yaml\"><code class=\"language-yaml\"><span class=\"token key atrule\">Resources</span><span class=\"token punctuation\">:</span>\n    <span class=\"token key atrule\">Website</span><span class=\"token punctuation\">:</span>\n        <span class=\"token key atrule\">Type</span><span class=\"token punctuation\">:</span> AWS<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span>Serverless<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span>Function\n        <span class=\"token key atrule\">Properties</span><span class=\"token punctuation\">:</span>\n            <span class=\"token key atrule\">FunctionName</span><span class=\"token punctuation\">:</span> <span class=\"token string\">'symfony-website'</span>\n            <span class=\"token key atrule\">CodeUri</span><span class=\"token punctuation\">:</span> .\n            <span class=\"token key atrule\">Handler</span><span class=\"token punctuation\">:</span> public/index.php\n            <span class=\"token key atrule\">Timeout</span><span class=\"token punctuation\">:</span> <span class=\"token number\">30</span> <span class=\"token comment\"># in seconds (API Gateway has a timeout of 30 seconds)</span>\n            <span class=\"token key atrule\">MemorySize</span><span class=\"token punctuation\">:</span> <span class=\"token number\">1024</span>\n            <span class=\"token key atrule\">Runtime</span><span class=\"token punctuation\">:</span> provided\n            <span class=\"token key atrule\">Layers</span><span class=\"token punctuation\">:</span>\n                <span class=\"token punctuation\">-</span> <span class=\"token string\">'arn:aws:lambda:us-east-1:209497400698:layer:php-73-fpm:1'</span>\n            <span class=\"token key atrule\">Events</span><span class=\"token punctuation\">:</span>\n                <span class=\"token key atrule\">HttpRoot</span><span class=\"token punctuation\">:</span>\n                    <span class=\"token key atrule\">Type</span><span class=\"token punctuation\">:</span> Api\n                    <span class=\"token key atrule\">Properties</span><span class=\"token punctuation\">:</span>\n                        <span class=\"token key atrule\">Path</span><span class=\"token punctuation\">:</span> /\n                        <span class=\"token key atrule\">Method</span><span class=\"token punctuation\">:</span> ANY\n                <span class=\"token key atrule\">HttpSubPaths</span><span class=\"token punctuation\">:</span>\n                    <span class=\"token key atrule\">Type</span><span class=\"token punctuation\">:</span> Api\n                    <span class=\"token key atrule\">Properties</span><span class=\"token punctuation\">:</span>\n                        <span class=\"token key atrule\">Path</span><span class=\"token punctuation\">:</span> /<span class=\"token punctuation\">{</span>proxy+<span class=\"token punctuation\">}</span>\n                        <span class=\"token key atrule\">Method</span><span class=\"token punctuation\">:</span> ANY\n\n    <span class=\"token key atrule\">Console</span><span class=\"token punctuation\">:</span>\n        <span class=\"token key atrule\">Type</span><span class=\"token punctuation\">:</span> AWS<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span>Serverless<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span>Function\n        <span class=\"token key atrule\">Properties</span><span class=\"token punctuation\">:</span>\n            <span class=\"token key atrule\">FunctionName</span><span class=\"token punctuation\">:</span> <span class=\"token string\">'symfony-console'</span>\n            <span class=\"token key atrule\">CodeUri</span><span class=\"token punctuation\">:</span> .\n            <span class=\"token key atrule\">Handler</span><span class=\"token punctuation\">:</span> bin/console\n            <span class=\"token key atrule\">Timeout</span><span class=\"token punctuation\">:</span> <span class=\"token number\">120</span> <span class=\"token comment\"># in seconds</span>\n            <span class=\"token key atrule\">Runtime</span><span class=\"token punctuation\">:</span> provided\n            <span class=\"token key atrule\">Layers</span><span class=\"token punctuation\">:</span>\n                <span class=\"token punctuation\">-</span> <span class=\"token string\">'arn:aws:lambda:us-east-1:209497400698:layer:php-73:1'</span> <span class=\"token comment\"># PHP</span>\n                <span class=\"token punctuation\">-</span> <span class=\"token string\">'arn:aws:lambda:us-east-1:209497400698:layer:console:1'</span> <span class=\"token comment\"># The \"console\" layer</span></code></pre></div>\n<p>Thanks to the configuration stored in template.yaml, Bref will create CloudFormation with two most important resources which are lambda functions that will handle all the requests. One called symfony-website and the second symfony-console, both names are defined under <code class=\"language-text\">FunctionName</code> key.\nTheir execution will be available thanks to API Gateway which also will be created during the deploy process.\nFor testing purpose, you don't have to change template file much. Please remember to check your AWS default region if it's different than <code class=\"language-text\">us-east-1</code> just change it in all <code class=\"language-text\">Layers</code> key of your Resources.</p>\n<p>OK. Let's check how it works and deploy.\nFirst, we need to create s3 bucket per our app with simple AWS CLI command <code class=\"language-text\">aws s3 mb s3://&lt;bucket-name></code>\nThen upload the code and generate the stack configuration:</p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre class=\"language-shell\"><code class=\"language-shell\">sam package \\\n    --output-template-file .stack.yaml \\\n    --s3-bucket &lt;bucket-name&gt;</code></pre></div>\n<p>Finnaly deploy our microservice: </p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre class=\"language-shell\"><code class=\"language-shell\">sam deploy \\\n    --template-file .stack.yaml \\\n    --capabilities CAPABILITY_IAM \\\n    --stack-name &lt;stack-name&gt;</code></pre></div>\n<p>After we receive output \"Successfully created/updated stack - <stack-name>\" our serverless microservice is ready to use.\nLet's check our resources in the AWS console. SAM deploy created the corresponding AWS Lambda Functions and API Gateway resources.</p>\n<p>Lambda Functions:</p>\n<p><a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/9f965078bf4cd620f90ecee4869716fd/7f308/aws-lambda.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 590px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 50.13648771610555%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsTAAALEwEAmpwYAAABNUlEQVQoz61Sy07DMBDs/x/4Ar6AX+DGjV8AIaRKtFWdOH7GiZN0mN2qKCqUUw8j7+6MZ3edbKwPOFoHay0655BSQozxX4QQ9FRt18A3BwR71PrGh4i37Rc+dwfYvsCVEV0/3ITNBTsO0MQMk0fY1yfE5weEl0c13Xh2ed8bfBwMtq3DPmS0NG17olQ0q1NRzpCaaI33qCUjxwAvE0YaptzDtBZH0yAmkqWgozDEhH4Y4CjMnF7ilDNzrstcdKKR2lgrxEsN53mGz7yYCpZlUYzjiImiE2N5q8ymUp+mSd9P6jNjz28wsNHptKixGg68bGOBCT0K40qjSnGt07kzp3BykZxAcuUYyzcQQ9GroewtcFxR1rzkawjnVpy74tZaNQzyK9wJP4aXDn+Jrrlb8S/De0z4DT/9/7PjufbWAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n    ></span>\n    <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;box-shadow:inset 0px 0px 0px 400px white;\"\n        alt=\"lambda\"\n        title=\"Lambda\"\n        src=\"/static/9f965078bf4cd620f90ecee4869716fd/40fad/aws-lambda.png\"\n        srcset=\"/static/9f965078bf4cd620f90ecee4869716fd/707e9/aws-lambda.png 148w,\n/static/9f965078bf4cd620f90ecee4869716fd/649e0/aws-lambda.png 295w,\n/static/9f965078bf4cd620f90ecee4869716fd/40fad/aws-lambda.png 590w,\n/static/9f965078bf4cd620f90ecee4869716fd/b3fef/aws-lambda.png 885w,\n/static/9f965078bf4cd620f90ecee4869716fd/7f308/aws-lambda.png 1099w\"\n        sizes=\"(max-width: 590px) 100vw, 590px\"\n      />\n  </span>\n  </a></p>\n<p>API Gateway:</p>\n<p><a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/8fe03eca82db3f2292591c6c2d95aac2/a7e37/aws-api.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 590px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 45.95782073813708%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAAAsTAAALEwEAmpwYAAAA0klEQVQoz61SUarCMBDM/a/lxxO8Q3mCWkvbxE1Fk22zY1ONWqso6MD8LDuzMyGKbAN7cChqwjrfwhQ5inWFAzm4hnt6HK0HuxYiMmEIARHOOTAzVFkb5BRQ7gXkgTKzWC1KLOcF/v+2A7PZBlVGg/CZaWSCMsZA+iMyXBJ0XQttNPbNDm3H10XBWPiIZDwYpkG4VGBuwd735t2oWjJ8lXJieP8mz4T3s1dQWuuJOOGclkcH3uGaMIpDuFU7p5VR7U+oouCXUFVVI/5FIovdhfQFT8GXwnE+CMQGAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n    ></span>\n    <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;box-shadow:inset 0px 0px 0px 400px white;\"\n        alt=\"api-gateway\"\n        title=\"API Gateway\"\n        src=\"/static/8fe03eca82db3f2292591c6c2d95aac2/40fad/aws-api.png\"\n        srcset=\"/static/8fe03eca82db3f2292591c6c2d95aac2/707e9/aws-api.png 148w,\n/static/8fe03eca82db3f2292591c6c2d95aac2/649e0/aws-api.png 295w,\n/static/8fe03eca82db3f2292591c6c2d95aac2/40fad/aws-api.png 590w,\n/static/8fe03eca82db3f2292591c6c2d95aac2/b3fef/aws-api.png 885w,\n/static/8fe03eca82db3f2292591c6c2d95aac2/a7e37/aws-api.png 1138w\"\n        sizes=\"(max-width: 590px) 100vw, 590px\"\n      />\n  </span>\n  </a></p>\n<p>Just check your execution url in API Gateway:</p>\n<p><a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/e34b8df67c48bf1b913344107d7bda18/2e35f/aws-api-invoke.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 590px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 72.31833910034602%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB7klEQVQ4y4WSeU/bQBDF8/0/TUtIgECpFNTwb9MmqFCphwiub8fnenftvM6M4zQHoiv9NN5r/N7sDIJUYV0aYNOiMg2ec4tVbvBSdHFV9PMG88cE9/MQs0WOT19L3H0pcL8shdmCIjEAjc1mwwHaaLieAyeI8PuPj2cvxM8XFys/wi/Hw/cfHh4ePSy+ufi8dLB8CrCg+fzBkbh89DGQZASnbJsGVZFhncRQVYXGGuhawehaorUaTUPYGtbUdF7TXkXfStYYSdgrbNsWxhghzzJEYQitNd4a1jZot/d5HFhuSGHg+1g5ruC4PuJ1hiTNUJYFiqJAnvcxl1iW5UE8SMgK67qG0hZJVsINYiEv690+wz9m5Lv9982cJNwfhh4pjkKqZ4k0TUXB8ZnjcZJQKUXyK1HKNtZsVxmpZX+ur/trnNQwSRIEQYA4juF5Ljw/IMuKG4HstTtrzH8THtux1orNLEuhzIYa/227Ynm/bVhhp8wTpWyfkYeivuQS9Cha43uiluOWwX523mRVDCfPqBdD6sUoimQuPSr7RuavKmzbza4enIj7q6YH0HS5e6BOkdbdw+zDygVqM7Vl8HE6wy3Rx/HkFu+GlxheXGM4vsbo8gajqw84v7iRtbPRBGfjDjlD6+eTKd5fTTGc3OEvcF4zJwFgXgwAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n    ></span>\n    <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;box-shadow:inset 0px 0px 0px 400px white;\"\n        alt=\"aws-api-invoke\"\n        title=\"API Gateway invoke url\"\n        src=\"/static/e34b8df67c48bf1b913344107d7bda18/40fad/aws-api-invoke.png\"\n        srcset=\"/static/e34b8df67c48bf1b913344107d7bda18/707e9/aws-api-invoke.png 148w,\n/static/e34b8df67c48bf1b913344107d7bda18/649e0/aws-api-invoke.png 295w,\n/static/e34b8df67c48bf1b913344107d7bda18/40fad/aws-api-invoke.png 590w,\n/static/e34b8df67c48bf1b913344107d7bda18/b3fef/aws-api-invoke.png 885w,\n/static/e34b8df67c48bf1b913344107d7bda18/2e35f/aws-api-invoke.png 1156w\"\n        sizes=\"(max-width: 590px) 100vw, 590px\"\n      />\n  </span>\n  </a></p>\n<p>Then run it in your browser. You should see symfony default page.</p>\n<p><a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/6f5d7e9de050b02b7ca242f43134d64a/0f040/symfony.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 590px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 64.08333333333334%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAABYlAAAWJQFJUiTwAAABvklEQVQ4y51Ty3LiMBDk//9gvyG58At74pYEiI2BFNjYhlrwS37bsnvVUrwkl60kU9XVo7E06pmRZ3Ec4xZFuF6vOJ/POJ1OYKxpmi+hbVtUVYXNZoMgCDAryxJ932McR0gptU9w43fA5HVdY8bDaZpiv98jDEN9CxX+xChoRmWO4+Dx8QEPCvP5HIvFAp7nwXVdsAIa9/0PNIrTCpMkwfPTErbt6OTb7RaXy0UrZilfNZ1wOtCPObqhRNt0KIpCt6GsSu0nSQqRZRBC6Dj9SA2S6zzPMQzDB4WdhKj+4Pf6F7LiCmezVWqfFJ6xXq9hWRaWy5VSb8O2bKxWK1ivr5o5WbblU8ld26myaohcgMmpiFPjrbLn1KXxVcOlnPgeI7/nu/eQU315WeJwOKj+7b7VN2MfFXad7gWl+77/b7ru0UUY+Dh5ZxyPg3rwEm/7XvPxILHb9fBcEwt8eU/I8mjDMIK9NWzAUhjjFoLCJ64rw1PMvMOBU2bPYvXKI4MmUr/STftNE2vUzQ1Ny/VN+63yJ0zfyF0nMKuqDHkRIssCAxEgzXztC2GQvscZ4zeRh3otRKieka9ZCB+VEvEXRYzl11Ft7fsAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n    ></span>\n    <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;box-shadow:inset 0px 0px 0px 400px white;\"\n        alt=\"symfony\"\n        title=\"Symfony\"\n        src=\"/static/6f5d7e9de050b02b7ca242f43134d64a/40fad/symfony.png\"\n        srcset=\"/static/6f5d7e9de050b02b7ca242f43134d64a/707e9/symfony.png 148w,\n/static/6f5d7e9de050b02b7ca242f43134d64a/649e0/symfony.png 295w,\n/static/6f5d7e9de050b02b7ca242f43134d64a/40fad/symfony.png 590w,\n/static/6f5d7e9de050b02b7ca242f43134d64a/b3fef/symfony.png 885w,\n/static/6f5d7e9de050b02b7ca242f43134d64a/301c0/symfony.png 1180w,\n/static/6f5d7e9de050b02b7ca242f43134d64a/0f040/symfony.png 1200w\"\n        sizes=\"(max-width: 590px) 100vw, 590px\"\n      />\n  </span>\n  </a></p>\n<p>Performance:</p>\n<ul>\n<li>PHP Performance on Lambda isn't super-hot. During my tests, I achieved ~40ms for a simple CRUD POST request with 2048 MB of the memory set.</li>\n</ul>\n<p>Other drawbacks:</p>\n<ul>\n<li>While using MySQL or PqSql cold starts (around 5s)</li>\n<li>Bref is a young project in advanced beta stage.</li>\n<li>Still, it's a unicorn and only AWS is supported</li>\n<li>Not all PHP extensions are working out of the box, but almost every extension can be used thanks to custom extension <a href=\"https://bref.sh/docs/environment/php.html\" target=\"_blank\">Bref PHP</a></li>\n</ul>\n<p>But still I think this is a great starting point and I believe it can solve two major problems of the \"serverless PHP\":</p>\n<ul>\n<li>easily deploy process on serverless platforms </li>\n<li>make development with PHP frameworks like before</li>\n</ul>\n<h2>Further info</h2>\n<ul>\n<li><a href=\"https://bref.sh\" target=\"_blank\">Bref project</a></li>\n<li><a href=\"https://aws.amazon.com/blogs/apn/aws-lambda-custom-runtime-for-php-a-practical-example\" target=\"_blank\">PHP AWS Lambda</a> </li>\n</ul>","fields":{"slug":"/php-serverless-with-bref/","tags":["Symfony","PHP","serverless"]}}}]}},"pageContext":{"slug":"/tags/serverless","tag":"serverless","categories":["Architecture","Coding","DevOps","Engineering","ProjectManagement","QA","Social","TechRadar"]}}