<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>php &#8211; Rafael Bernard Araujo</title>
	<atom:link href="https://rafael.bernard-araujo.com/tag/php/feed" rel="self" type="application/rss+xml" />
	<link>https://rafael.bernard-araujo.com</link>
	<description>desenvolvendo... while(!success){  try(); }</description>
	<lastBuildDate>Wed, 22 Apr 2026 05:45:10 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	
<site xmlns="com-wordpress:feed-additions:1">21941730</site>	<item>
		<title>Introduce Parameter Object &#124; Refactoring Patterns</title>
		<link>https://rafael.bernard-araujo.com/introduce-parameter-object-refactoring-patterns.php</link>
					<comments>https://rafael.bernard-araujo.com/introduce-parameter-object-refactoring-patterns.php#respond</comments>
		
		<dc:creator><![CDATA[rafael]]></dc:creator>
		<pubDate>Wed, 22 Apr 2026 05:45:10 +0000</pubDate>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[refactoring patterns]]></category>
		<category><![CDATA[rust]]></category>
		<category><![CDATA[software architecture]]></category>
		<guid isPermaLink="false">https://rafael.bernard-araujo.com/?p=2357</guid>

					<description><![CDATA[This refactoring pattern involves grouping parameters that naturally go together into a single object. When you see a group of data items that regularly travel together, appearing in function after function, it's a sign they should be combined into a single object. Check https://rafael.bernard-araujo.com/refactoring-patterns/introduce-parameter-object There are PHP and Rust implemenation examples.]]></description>
										<content:encoded><![CDATA[<p>This refactoring pattern involves grouping parameters that naturally go together into a single object. When you see a group of data items that regularly travel together, appearing in function after function, it's a sign they should be combined into a single object.</p>
<p>Check <a href="https://rafael.bernard-araujo.com/refactoring-patterns/introduce-parameter-object">https://rafael.bernard-araujo.com/refactoring-patterns/introduce-parameter-object</a></p>
<p>There are PHP and Rust implemenation examples.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://rafael.bernard-araujo.com/introduce-parameter-object-refactoring-patterns.php/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2357</post-id>	</item>
		<item>
		<title>Tropeçando 117</title>
		<link>https://rafael.bernard-araujo.com/tropecando-117.php</link>
					<comments>https://rafael.bernard-araujo.com/tropecando-117.php#respond</comments>
		
		<dc:creator><![CDATA[rafael]]></dc:creator>
		<pubDate>Thu, 20 Nov 2025 08:02:00 +0000</pubDate>
				<category><![CDATA[Tropeçando]]></category>
		<category><![CDATA[ai]]></category>
		<category><![CDATA[llm]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[site reliability]]></category>
		<category><![CDATA[software engineering]]></category>
		<guid isPermaLink="false">https://rafael.bernard-araujo.com/?p=2221</guid>

					<description><![CDATA[How far can we push AI autonomy in code generation? We ran a series of experiments to explore how far Generative AI can currently be pushed toward autonomously developing high-quality, up-to-date software without human intervention. As a test case, we created an agentic workflow to build a simple Spring Boot application end to end. We [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><a href="https://martinfowler.com/articles/pushing-ai-autonomy.html">How far can we push AI autonomy in code generation?</a></p>
<blockquote>
<p>We ran a series of experiments to explore how far Generative AI can currently be pushed toward autonomously developing high-quality, up-to-date software without human intervention. As a test case, we created an agentic workflow to build a simple Spring Boot application end to end. We found that the workflow could ultimately generate these simple applications, but still observed significant issues in the results—especially as we increased the complexity. The model would generate features we hadn't asked for, make shifting assumptions around gaps in the requirements, and declare success even when tests were failing. We concluded that while many of our strategies — such as reusable prompts or a reference application — are valuable for enhancing AI-assisted workflows, a human in the loop to supervise generation remains essential. </p>
</blockquote>
<p><a href="https://thephp.foundation/blog/2025/09/05/php-mcp-sdk/">Announcing the Official PHP SDK for MCP</a></p>
<blockquote>
<p>The PHP Foundation, Anthropic’s MCP team, and Symfony are collaborating on the official PHP SDK for the Model Context Protocol (MCP). Our goal is a framework-agnostic, production-ready reference implementation the PHP ecosystem can rely on.</p>
</blockquote>
<p><a href="https://ashallendesign.co.uk/blog/covariance-and-contravariance-in-php">Covariance and Contravariance in PHP </a></p>
<blockquote>
<p>Before we dive into the details and code examples, let me quickly define covariance and contravariance:</p>
<p>Covariance: Making something more specific<br />
Contravariance: Making something less specific</p>
<p>Now let's dive in and see how these concepts apply to PHP.</p>
</blockquote>
<p><a href="https://slack.engineering/break-stuff-on-purpose/">Break Stuff on Purpose</a></p>
<blockquote>
<p>Strengthen your system’s ability to recover by intentionally causing and resolving failures</p>
</blockquote>
<p><a href="https://read.thecoder.cafe/p/nothing-beats-kindness">Nothing Beats Kindness</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://rafael.bernard-araujo.com/tropecando-117.php/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2221</post-id>	</item>
		<item>
		<title>Tropeçando 116</title>
		<link>https://rafael.bernard-araujo.com/tropecando-116.php</link>
					<comments>https://rafael.bernard-araujo.com/tropecando-116.php#respond</comments>
		
		<dc:creator><![CDATA[rafael]]></dc:creator>
		<pubDate>Tue, 26 Aug 2025 08:30:54 +0000</pubDate>
				<category><![CDATA[Miscelaneous]]></category>
		<category><![CDATA[e2e test]]></category>
		<category><![CDATA[microservices]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[software testing]]></category>
		<guid isPermaLink="false">https://rafael.bernard-araujo.com/?p=2142</guid>

					<description><![CDATA[End-to-end testing across bounded contexts in a microservices environment requires a careful balance of responsibilities and collaboration. And depending on how your organisation is structured, different teams are responsible for testing parts or the entirety of the user journey. Check Yan Cui answering &#34;How to end-to-end test microservices across bounded contexts?&#34; Do you know you [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>End-to-end testing across bounded contexts in a microservices environment requires a careful balance of responsibilities and collaboration. And depending on how your organisation is structured, different teams are responsible for testing parts or the entirety of the user journey. Check Yan Cui answering <em>&quot;<a href="https://theburningmonk.com/2024/12/how-to-e2e-test-microservices-across-bounded-contexts/">How to end-to-end test microservices across bounded contexts?</a>&quot;</em></p>
<p>Do you know you can make use of PHP XDEBUG and <a href="https://laravel-news.com/flexible-docker-images-with-php-ini-environment-variables">make your Docker images flexible using environment variables with INI settings</a>? Paul Redmond shows you how to use Xdebug's built-in environment variables to configure things if you prefer simplicity in a team's environment, so you can still have the INI settings ready in a way you can enable or disable whenever it suits.</p>
<p><a href="https://theburningmonk.com/2025/04/how-to-use-neon-and-ephemeral-environments-to-simplify-serverless-development/">How to use Neon and ephemeral environments to simplify serverless development</a>, with Yan Cui.</p>
<p><a href="https://newsletter.goodtechthings.com/p/harsh-truths-to-save-you-from-chatgpt">Harsh truths to save you from ChatGPT psychosis</a></p>
<blockquote>
<p>Once you come to believe that you are sort of a minor cybernetic deity, you have lost touch with reality in a subtle, terrifying way. You are at the mercy of whatever weird fantasy the LLM spits out next.</p>
<p>The major LLMs are all in a sycophantic phase right now, which doesn’t help, but I doubt that “make the chatbots less encouraging” is an easy fix here. We are dealing with a technology uniquely suited to snipe intelligent, well-educated people into believing they are much, much smarter than they really are. That is an addictive sensation, not easily quit.</p>
</blockquote>
<p><a href="https://frederickvanbrabant.com/blog/2025-07-22-the-real-ask/">The real ask</a></p>
<blockquote>
<p>The question we receive is not always the problem we need to solve.</p>
</blockquote>
<p>Asking the right question to understand the real problem. And to provide the true solution.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://rafael.bernard-araujo.com/tropecando-116.php/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2142</post-id>	</item>
		<item>
		<title>Tropeçando 115</title>
		<link>https://rafael.bernard-araujo.com/tropecando-115.php</link>
					<comments>https://rafael.bernard-araujo.com/tropecando-115.php#comments</comments>
		
		<dc:creator><![CDATA[rafael]]></dc:creator>
		<pubDate>Sun, 29 Dec 2024 07:10:02 +0000</pubDate>
				<category><![CDATA[Tropeçando]]></category>
		<category><![CDATA[aws]]></category>
		<category><![CDATA[aws-cdk]]></category>
		<category><![CDATA[design pattern]]></category>
		<category><![CDATA[lazy loading]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[project management]]></category>
		<guid isPermaLink="false">https://rafael.bernard-araujo.com/?p=2098</guid>

					<description><![CDATA[PHP is the Best Choice for Long‑Term Business Mature and health ecosystem, long-term stability with clear release cycles, at least two well-proven frameworks, self-reflecting Technology and open-source adaptation to the future are points to put PHP as a great (if not the best) choice for long-term business. Optimize for optionality and build towards checkpoints Optimize [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><a href="https://tomasvotruba.com/blog/php-is-the-best-choice-for-long-term-business">PHP is the Best Choice for Long‑Term Business</a></p>
<blockquote>
<p>Mature and health ecosystem, long-term stability with clear release cycles, at least two well-proven frameworks, self-reflecting Technology and open-source adaptation to the future are points to put PHP as a great (if not the best) choice for long-term business.</p>
</blockquote>
<p><a href="https://sebastiandedeyne.com/optimize-for-optionality-and-build-towards-checkpoints">Optimize for optionality and build towards checkpoints </a></p>
<blockquote>
<p>Optimize for optionality and build towards checkpoints</p>
<p>To make this plea actionable: treat each chunk of work as something that should be merged by the end of the week. That doesn't mean it needs to be &quot;done&quot; or available to the end user, it needs to become a citizen of The Codebase.</p>
</blockquote>
<p><a href="https://jolicode.com/blog/php-object-lazy-loading-is-more-than-what-you-think">PHP Object Lazy-Loading is More Than What You Think</a></p>
<blockquote>
<p>In short: lazy-loading consists of delaying load or initialization of resources or objects until they’re actually needed. It’s something you will never see directly, the whole objective of lazy-loading is to be invisible so you can use your applications the way you always do.</p>
<p>Check this blog posts, which talks about this pattern, a new PHP RFC and some ways you can boost the performance of your application when you use lots of API calls.</p>
</blockquote>
<p><a href="https://opensourcepledge.com/">Open Source Pledge</a></p>
<blockquote>
<p>What is the Open Source Pledge?</p>
<p>Open Source Pledge is a group of companies with a shared commitment to paying the maintainers of the Open Source software we all consume. Our goal is to establish a new social norm in the tech industry of companies paying Open Source maintainers, so that burnout and related security issues such as those in XZ and Apache Log4j can become a thing of the past.</p>
</blockquote>
<p><a href="https://blog.jetbrains.com/idea/2024/10/code-analysis-for-your-projects-with-intellij-idea-and-qodana/">Code Analysis for Your Projects With IntelliJ IDEA and Qodana</a></p>
<blockquote>
<p>As developers, we spend more time maintaining existing code than we do writing new code. Any tools that can help make this easier can save us a lot of time.</p>
</blockquote>
<p><a href="https://www.youtube.com/watch?v=Sr339AKcxT0">Live coding - Event Sourcing in PHP - Let's overcomplicate a single-page - Brendt Roose</a></p>
<blockquote>
<p>Brendt did a live coding session demonstrating how event-sourcing in PHP looks like. He used <a href="https://tempestphp.com/">Tempest framework</a>, but concepts apply to any application.</p>
</blockquote>
<p><a href="https://blog.serverlessadvocate.com/configuring-aws-cdk-apps-across-multiple-environments-f9e0f1158a70">Configuring AWS CDK Apps Across Multiple Environments</a></p>
<blockquote>
<p>In this quick article, we will cover how we can setup our deterministic serverless application configuration in a way that it can differ between different environments, and where the correct environment is deployed to the correct AWS accounts. We will do a super simple example to show the concepts.</p>
</blockquote>
<p><a href="https://medium.com/@volvogroup/how-to-successfully-adopt-serverless-in-large-organizations-2e0db1b72881">How to successfully adopt serverless in large organizations</a></p>
<blockquote>
<p>Why serverless?</p>
<p>Serverless has disrupted the tech industry in recent years and leveled the playing field by giving organizations instant access to the same resources. In fact, it gives startups and small organizations an edge. They can move faster because they have fewer processes in place than larger traditional organizations, and serverless enables this agility.</p>
</blockquote>
]]></content:encoded>
					
					<wfw:commentRss>https://rafael.bernard-araujo.com/tropecando-115.php/feed</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2098</post-id>	</item>
		<item>
		<title>Tropeçando 114</title>
		<link>https://rafael.bernard-araujo.com/tropecando-114.php</link>
					<comments>https://rafael.bernard-araujo.com/tropecando-114.php#respond</comments>
		
		<dc:creator><![CDATA[rafael]]></dc:creator>
		<pubDate>Fri, 27 Sep 2024 04:44:36 +0000</pubDate>
				<category><![CDATA[Tropeçando]]></category>
		<category><![CDATA[aws-cdk]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[developer experience]]></category>
		<category><![CDATA[front-end]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[PostGreSQL]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[software architecture]]></category>
		<category><![CDATA[testing]]></category>
		<guid isPermaLink="false">https://rafael.bernard-araujo.com/?p=2076</guid>

					<description><![CDATA[What's new in PHP 8.4 Don't miss these great features Property hooks new without parentheses JIT changes RFC Implicit nullable types New HTML5 support array_find Serverless Ephemeral Environments with Serverful AWS Services How to successfully use ephemeral environments with serverful resources, with example in the AWS CDK and Typescript. Comparison of Serverless Development and Hosting [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><a href="https://stitcher.io/blog/new-in-php-84">What's new in PHP 8.4</a></p>
<blockquote>
<p>Don't miss these great features</p>
<ul>
<li>Property hooks</li>
<li>new without parentheses</li>
<li>JIT changes RFC</li>
<li>Implicit nullable types</li>
<li>New HTML5 support</li>
<li>array_find</li>
</ul>
</blockquote>
<p><a href="https://blog.serverlessadvocate.com/serverless-ephemeral-environments-with-serverful-aws-services-c803d24b353f">Serverless Ephemeral Environments with Serverful AWS Services</a></p>
<blockquote>
<p>How to successfully use ephemeral environments with serverful resources, with example in the AWS CDK and Typescript.</p>
</blockquote>
<p><a href="https://dev.to/aws-builders/comparison-of-serverless-development-and-hosting-platforms-5dld">Comparison of Serverless Development and Hosting Platforms</a></p>
<blockquote>
<p>When designing solutions in the cloud, there is (almost) always more than one alternative for achieving the same goal.</p>
<p>One of the characteristics of cloud-native applications is the ability to have an automated development process (such as the use of CI/CD pipelines).</p>
<p>In this blog post, I will compare serverless solutions for developing and hosting web and mobile applications in the cloud. </p>
</blockquote>
<p><a href="https://vnegrisolo.github.io/postgresql/generate-fake-data-using-sql">Generating fake data using SQL</a></p>
<blockquote>
<p>Fake data are very useful in development environment for testing your application or some query performances for example.</p>
</blockquote>
<p><a href="https://khalilstemmler.com/articles/client-side-architecture/introduction/">Client-Side Architecture Basics [Guide]</a></p>
<blockquote>
<p>Though the tools we use to build client-side web apps have changed substantially over the years, the fundamental principles behind designing robust software have remained relatively the same. In this guide, we go back to basics and discuss a better way to think about the front-end architecture using modern tools like React, xState, and Apollo Client.</p>
</blockquote>
]]></content:encoded>
					
					<wfw:commentRss>https://rafael.bernard-araujo.com/tropecando-114.php/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2076</post-id>	</item>
		<item>
		<title>Tropeçando 113</title>
		<link>https://rafael.bernard-araujo.com/tropecando-113.php</link>
					<comments>https://rafael.bernard-araujo.com/tropecando-113.php#respond</comments>
		
		<dc:creator><![CDATA[rafael]]></dc:creator>
		<pubDate>Fri, 16 Aug 2024 05:13:13 +0000</pubDate>
				<category><![CDATA[Tropeçando]]></category>
		<category><![CDATA[aws]]></category>
		<category><![CDATA[aws-cdk]]></category>
		<category><![CDATA[clean architecture]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[ddd]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[serverless]]></category>
		<category><![CDATA[software engineering]]></category>
		<category><![CDATA[sql]]></category>
		<category><![CDATA[sqli]]></category>
		<guid isPermaLink="false">https://rafael.bernard-araujo.com/?p=1976</guid>

					<description><![CDATA[Neon Serverless PostgreSQL database with real zero-scaling. The fully managed serverless Postgres with a generous free tier. We separate storage and compute to offer autoscaling, branching, and bottomless storage. Compute scales dynamically to ensure you're ready for peak hours. Compute scales to zero and cold storage offloads to S3 for cost efficiency. Create a fully [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><a href="https://neon.tech">Neon</a></p>
<blockquote>
<p>Serverless PostgreSQL database with real zero-scaling. The fully managed serverless Postgres with a generous free tier. We separate storage and compute to offer autoscaling, branching, and bottomless storage.</p>
<p>Compute scales dynamically to ensure you're ready for peak hours. Compute scales to zero and cold storage offloads to S3 for cost efficiency. Create a fully managed serverless Postgres instance in seconds.</p>
</blockquote>
<p><a href="https://laravel-news.com/make-your-app-faster-with-php-83">Make your app faster with PHP 8.3</a></p>
<blockquote>
<p>PHP 8.3 is the latest version of PHP. It has exciting new features and major improvements in performance. By upgrading to 8.3, you can achieve a significant increase in speed. In this article, we dive into how PHP 8.3 can be a game changer. It can speed up your application's performance.</p>
</blockquote>
<p><a href="https://dzone.com/articles/owasp-top-10-explained-3-sql-injection?">OWASP Top 10 Explained: SQL Injection</a></p>
<blockquote>
<p>SQL Injection (SQLi) is a code injection technique that exploits a security vulnerability occurring in the database layer of an application.</p>
<p>The vulnerability is present when user inputs are either improperly filtered for string literal escape characters embedded in SQL statements or user input is not strongly typed and thereby unexpectedly executed.</p>
<p>This allows an attacker to manipulate SQL queries, enabling them to unauthorized access, modify, and delete data in the database. This can lead to significant breaches of confidentiality, integrity, and availability, ranging from unauthorized viewing of data to complete database compromise.</p>
</blockquote>
<p><a href="https://blog.serverlessadvocate.com/15-quick-useful-tips-for-aws-cdk-engineers-a7675e1557aa">15 Quick Useful Tips for AWS CDK Engineers</a></p>
<blockquote>
<p>In this short article, we will cover 15 useful tips with accompanying code snippets for AWS CDK users.</p>
</blockquote>
<p><a href="https://khalilstemmler.com/articles/typescript-domain-driven-design/repository-dto-mapper/">Implementing DTOs, Mappers &amp; the Repository Pattern using the Sequelize ORM [with Examples] - DDD w/ TypeScript</a></p>
<blockquote>
<p>There are several patterns that we can utilize in order to handle data access concerns in Domain-Driven Design. In this article, we talk about the role of DTOs, repositories &amp; data mappers in DDD.</p>
</blockquote>
]]></content:encoded>
					
					<wfw:commentRss>https://rafael.bernard-araujo.com/tropecando-113.php/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1976</post-id>	</item>
		<item>
		<title>A bref AWS PHP story – Part 3</title>
		<link>https://rafael.bernard-araujo.com/a-bref-aws-php-story-part-3.php</link>
					<comments>https://rafael.bernard-araujo.com/a-bref-aws-php-story-part-3.php#respond</comments>
		
		<dc:creator><![CDATA[rafael]]></dc:creator>
		<pubDate>Tue, 27 Feb 2024 07:44:50 +0000</pubDate>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[aws]]></category>
		<category><![CDATA[aws-cdk]]></category>
		<category><![CDATA[bref]]></category>
		<category><![CDATA[bref-php-aws-story]]></category>
		<category><![CDATA[cdk]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[serverless]]></category>
		<guid isPermaLink="false">https://rafael.bernard-araujo.com/?p=1980</guid>

					<description><![CDATA[We are starting Part 3 of the Series &#34;A bref AWS PHP history&#34;. You can check Part 1, where I presented the PHP language as a reliable and good alternative for Serverless applications and Part 2 where we see the usage of CDK features in favour of a faithful CI/CD. Part 3 is to show [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>We are starting Part 3 of the Series <a href="https://rafael.bernard-araujo.com/tag/bref-php-aws-story">&quot;A bref AWS PHP history&quot;</a>. You can check <a href="https://dev.to/rafaelbernard/a-bref-aws-php-history-part-1-2agn">Part 1</a>, where I presented the PHP language as a reliable and good alternative for Serverless applications and <a href="https://dev.to/rafaelbernard/a-bref-aws-php-story-part-2-1dhe">Part 2</a> where we see the usage of CDK features in favour of a faithful CI/CD.</p>
<p>Part 3 is to show the upgrade path to Bref 2 and to achieve more coverage of the AWS resources. We will use DynamoDB, a powerful database for serverless architectures.</p>
<p>Some of those topics seem straightforward to some people, but I would like to avoid guessing that this is known to the audience since I have experienced some PHP developers struggling to put all these together for the first time due to the paradigm change. It should be fun.</p>
<p>Table of contents:</p>
<ol>
<li>What else are we doing?</li>
<li>Describing more AWS services - Adding a DynamoDB table</li>
<li>Bref upgrade</li>
<li>Testing CDK</li>
<li>PHP and AWS Services</li>
<li>Wrap-up</li>
</ol>
<h2>What else are we doing?</h2>
<p>In this section, we'll explore additional functionalities and enhancements to our serverless application. Building upon the foundation laid in Part 2, we'll introduce new features and integrations to further extend the capabilities of our AWS PHP application.</p>
<p>The <a href="https://dev.to/rafaelbernard/a-bref-aws-php-story-part-2-1dhe">Part 2</a> uses the result of the Fibonacci of a provided integer or a random integer from 400 to 1000 (to get a good image and not to overflow <code>integer</code>). This integer is the number of pixels of an image from the bucket and an arbitrary request metadata we are creating. If the image does not exist, the lambda will fetch a random image from the web with that number of pixels, save it and generate the metadata.</p>
<p>The computing complexity is irrelevant because it could be very complex logic or very simple, and the topics we are discussing in this part of the series will use the same design.</p>
<p>The lambda will now search the metadata in a DynamoDB table, saving the metadata when it does not exist. DynamoDB is largely used in Lambda code.</p>
<p><a href="https://github.com/rafaelbernard/bref-initial-php-aws-story/tree/part-3">Get the part-3 source-code on GitHub</a> and <a href="https://github.com/rafaelbernard/bref-initial-php-aws-story/compare/tag-part-2...tag-part-3">the diff from part-2</a>.</p>
<h2>Describing more AWS services - Adding a DynamoDB Table</h2>
<p>DynamoDB plays a crucial role in serverless architectures, offering scalable and high-performance NoSQL database capabilities. In this section, we'll delve into the process of integrating DynamoDB into our AWS CDK stack, expanding our application's data storage and retrieval capabilities.</p>
<p><a href="https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html">DynamoDB</a> is a fully managed NoSQL database service provided by AWS, offering seamless integration with other AWS services, automatic scaling, and built-in security features. Its scalability, low latency, and flexible data model make it well-suited for serverless architectures and applications with varying throughput requirements.</p>
<pre><code class="language-ts">    const table = new Table(this, TableName, {
      partitionKey: { name: &#039;PK&#039;, type: AttributeType.STRING },
      sortKey: { name: &#039;SK&#039;, type: AttributeType.STRING },
      removalPolicy: RemovalPolicy.DESTROY,
      tableName: TableName,
    });</code></pre>
<p>Following the same principles for creating other AWS resources, we utilize the AWS CDK to define a DynamoDB table within our stack. Let's dive into the key parameters of the Table constructor:</p>
<ul>
<li><code>partitionKey</code>: This parameter defines the primary key attribute for the DynamoDB table, used to distribute items across partitions for scalability. In our example, <code>{ name: &#039;PK&#039;, type: AttributeType.STRING }</code> specifies a partition key named 'PK' with a string type. The naming convention ('PK') is arbitrary and can be tailored to suit your application's needs.</li>
<li><code>sortKey</code>: For tables requiring a composite primary key (partition key and sort key), the sortKey parameter comes into play. Here, <code>{ name: &#039;SK&#039;, type: AttributeType.STRING }</code> defines a sort key named 'SK' with a string type. Like the partition key, the name and type of the sort key can be customized based on your data model.</li>
<li><code>removalPolicy</code>: This parameter determines the behaviour of the DynamoDB table when the CloudFormation stack is deleted. By setting <code>RemovalPolicy.DESTROY</code>, we specify that the table should be deleted (destroyed) along with the stack. Alternatively, you can opt for <code>RemovalPolicy.RETAIN</code> to preserve the table post-stack deletion, which may be useful for retaining data.</li>
</ul>
<p>By decoupling configuration from implementation, we adhere to SOLID principles, ensuring cleaner and more robust code. This approach fosters flexibility, allowing our code to seamlessly adapt to changes, such as modifications to the table name while maintaining its functionality.</p>
<p>The implementation code is aware that the name will come from an environment variable and will work with that (yes, if you think that test will be easy to write, you are right):</p>
<pre><code class="language-ts">    const lambdaEnvironment = {
      TableName,
      TableArn: table.tableArn,
      BucketName: brefBucket.bucketName,
    };</code></pre>
<h2>Bref Upgrade</h2>
<p><a href="https://bref.sh">Bref</a>, the PHP runtime for AWS Lambda, continually evolves to provide developers with the latest features and optimizations. In this section, we'll discuss the upgrade to Bref 2.0 and explore how it enhances the deployment process and performance of our serverless PHP applications.</p>
<p>In this section, we're upgrading our usage of <a href="https://bref.sh">Bref</a>, a PHP runtime for AWS Lambda, to version 2.0. Bref simplifies the deployment of PHP applications to AWS Lambda, enabling us to run PHP code serverlessly.</p>
<p>The upgrade involves modifying our AWS CDK code to utilize the new features and improvements introduced in Bref 2.0. One notable improvement is the automatic selection of the latest layer of the PHP version, which simplifies the deployment process and ensures that our Lambda functions run on the most up-to-date PHP environment available.</p>
<pre><code class="language-ts">  const getLambda = new PhpFunction(this, <code>${stackPrefix}${functionName}</code>, {
    handler: 'get.php',
    phpVersion: '8.3',
    runtime: Runtime.PROVIDED_AL2,
    code: packagePhpCode(join(__dirname, <code>../assets/get</code>), {
      exclude: ['test', 'tests'],
    }),
    functionName,
    environment: lambdaEnvironment,
  });</code></pre>
<ul>
<li><strong>`PhpFunction` Constructor</strong>: We&#039;re using the `PhpFunction` constructor provided by Bref to define our Lambda function. This constructor allows us to specify parameters such as the handler file, PHP version, runtime, code location, function name, and environment variables.</li>
<li>`handler`: Specifies the entry point file for our Lambda function, where the execution starts.</li>
<li>`phpVersion`: Defines the PHP version to be used by the Lambda function. In this case, we&#039;re using PHP version 8.3.</li>
<li>`runtime`: Indicates the Lambda runtime environment. Here, `Runtime.PROVIDED_AL2` signifies the use of the Amazon Linux 2 operating system.</li>
<li>`code`: Specifies the location of the PHP code to be deployed to Lambda.</li>
<li>`functionName`: Sets the name of the Lambda function.</li>
<li>`environment`: Allows us to define environment variables required by the Lambda function, such as database connection strings or configuration settings.</li>
</ul>
<p>By upgrading to Bref 2.0 and configuring our Lambda function accordingly, we ensure compatibility with the latest enhancements and optimizations provided by Bref, thereby improving the performance and reliability of our serverless PHP applications on AWS Lambda.</p>
<h2>Testing CDK</h2>
<p>Ensuring the correctness and reliability of our AWS CDK infrastructure is crucial for maintaining a robust serverless architecture. In this section, we&#039;ll delve into testing our CDK resources, focusing on the DynamoDB table we added in the previous section.</p>
<p>As described earlier, we utilized the AWS CDK to provision a DynamoDB table within our serverless stack. Now, let&#039;s ensure that the table is configured correctly and behaves as expected by writing tests using the CDK&#039;s testing framework.</p>
<p>First, let&#039;s revisit how we added the DynamoDB table:</p>
<pre><code class="language-ts">const table = new Table(this, TableName, {
  partitionKey: { name: 'PK', type: AttributeType.STRING },
  sortKey: { name: 'SK', type: AttributeType.STRING },
  removalPolicy: RemovalPolicy.DESTROY,
  tableName: TableName,
});</code></pre>
<p>In this code snippet, we define a DynamoDB table with specified attributes such as partition key, sort key, removal policy, and table name. Now, to ensure that this table is created with the correct configuration, we&#039;ll write tests using CDK&#039;s testing constructs.</p>
<p>Check the following thest:</p>
<pre><code class="language-ts">test('Should have DynamoDB', () => {
  expectCDK(stack).to(
    haveResource(
      'AWS::DynamoDB::Table',
      {
        "DeletionPolicy": "Delete",
        "Properties": {
          "AttributeDefinitions": [
            {
              "AttributeName": "PK",
              "AttributeType": "S",
            },
            {
              "AttributeName": "SK",
              "AttributeType": "S",
            },
          ],
          "KeySchema": [
            {
              "AttributeName": "PK",
              "KeyType": "HASH",
            },
            {
              "AttributeName": "SK",
              "KeyType": "RANGE",
            },
          ],
          "ProvisionedThroughput": {
            "ReadCapacityUnits": 5,
            "WriteCapacityUnits": 5,
          },
          "TableName": "BrefStory-table",
        },
        "Type": "AWS::DynamoDB::Table",
        "UpdateReplacePolicy": "Delete",
      },
      ResourcePart.CompleteDefinition,
    )
  );
});</code></pre>
<p>This test ensures that the DynamoDB table is created with the correct attribute definitions, key schema, provisioned throughput, table name, and other properties specified during its creation. By writing such tests, we validate that our CDK infrastructure is provisioned accurately and functions as intended.</p>
<h2>PHP and AWS Services</h2>
<p>Leveraging PHP in a serverless environment opens up new possibilities for interacting with AWS services. In this section, we&#039;ll examine how PHP code seamlessly integrates with various AWS services, following best practices for maintaining clean and modular code architecture.</p>
<p>This is the part where we have fewer serverless needs impacting the code, as the PHP code will follow the same logic we might be using to communicate with AWS services on any other platform overall (there are always some specific use cases).</p>
<p>The reuse of the same existing logic is excellent. It leverages the decision to keep using PHP when moving that workload to Serverless, as the bulk of the knowledge and already proven code would remain as-is. We may escape the trap of classifying that PHP code as legacy as if it should be avoided, terminated or halted.</p>
<p>As a side note, a few external layers of our software architecture are touched if a good software architecture was applied before. Therefore, during the implementation of this architectural change, it should be quick to realise how beneficial and time-saving it is to have a well-architectured application with a balanced decision for patterns, principles, and designs to be applied, ultimately giving flexibility to the application and its features.</p>
<p>The handler is simplified now and should accommodate everything to a class in the direction of following SRP, a principle that we are bringing to the code during the code bites:</p>
<h3>Applications, domains, infrastructure, etc</h3>
<p>Our `PicsumPhotoService` is still orchestrating the business logic. The Single Responsibility Principle and Inversion of Control are applied. We are injecting the specialized services in the constructor:</p>
<pre><code class="language-php">// readonly class PicsumPhotoService
    public function __construct(
        private HttpClientInterface $httpClient,
        private ImageStorageService $storageService,
        private ImageRepository $repository,
    )
    {
    }</code></pre>
<p>Each specialized service has all its dependencies injected in the constructor as well. We can see the factory instantiation:</p>
<pre><code class="language-php">    public static function createPicsumPhotoService(): PicsumPhotoService
    {
        return new PicsumPhotoService(
            HttpClient::create(),
            new S3ImageService(
                new S3Client(),
                getenv('BucketName'),
            ),
            new DynamoDbImageRepository(
                new DynamoDbClient(),
                getenv('TableName'),
            ),
        );
    }</code></pre>
<p>The `ImageStorageService` will handle all image operations, connecting to the AWS Service when appropriate and observing business logic details. This is a slim interface:</p>
<pre><code class="language-php">interface ImageStorageService
{
    public function getImageFromBucket(int $imagePixels): ?array;

    public function saveImage(int $imagePixels, mixed $fetchedImage): void;

    public function createAndPutMetadata(int $imagePixels, array $metadata): PutObjectOutput;
}</code></pre>
<p>Instead of `: PutObjectOutput`, usually we would return a domain object, to not couple the interface with implementation details of using S3 Services, but for simplicity, I did not create a domain object here. It would be preferable though.</p>
<p>The `ImageRepository` will handle all metadata operations. It will save into a repository and observe logic details as well. Following the same principles, this is a slim interface:</p>
<pre><code class="language-php">interface ImageRepository
{
    public function findImage(int $imagePixels): ImageMetadataItem;

    public function addImageMetadata(ImageMetadataItem $imageMetadataItem): PutItemOutput;
}</code></pre>
<p>The `ImageMetadataItem` is a representation of one of the domain objects we have in our codebase.</p>
<pre><code class="language-php">readonly class ImageMetadataItem
{
    public function __construct(public int $imagePixels, public array $metadata)
    {
    }

    public function toDynamoDbItem(): array
    {
        return [
            'PK' => new AttributeValue(['S' => 'IMAGE']),
            'SK' => new AttributeValue(['S' => "PIXELS#{$this->imagePixels}"]),
            'pixels' => new AttributeValue(['N' => "{$this->imagePixels}"]),
            'metadata' => new AttributeValue(['S' => json_encode($this->metadata)]),
            ...ConvertToDynamoDb::item($this->metadata),
        ];
    }

    /**
     * @param array<string, AttributeValue> $item
     */
    public static function fromDynamoDb(array $item): static
    {
        return new static(
            (int) $item['pixels']->getN(),
            (array) json_decode($item['metadata']->getS()),
        );
    }
}</code></pre>
<p>If you check the implementation details, it operates transparently with all the services, business logic and AWS Services without any high couple with them. There are two utility functions:</p>
<ul>
<li><code>toDynamoDbItem</code>: to transform the object into a valid DynamoDb Item to be added</li>
<li><code>fromDynamoDb</code>: to perform the opposite operation, transforming a DynamoDb Item into a domain object</li>
</ul>
<p>The scope of the operation is very clear and does not bring the domain into dependency on those services, as the domain object can be used independently. It does not block any other way of dealing with it, giving the usage with other types of services, such as different databases or APIs. This is very important to the maintainability of the application without sacrificing the ease of readiness as it keeps the context of the utilities in the right place.</p>
<p>If you check all PHP code carefully, Bref is such a great abstraction layer that, removing the code from the handler file, any other line of code can be used as a lambda or a web application interchangeably without changing any line of code. This is very powerful, as you can imagine how you can leverage and migrate some of the existing code to lambda by just creating a handler that will trigger your existing code, if the code is well structured.</p>
<h2>Wrap-up</h2>
<p>It would be simple like that. Check more details in the source code, install it and try it yourself. This project is ready to:</p>
<ul>
<li>Extend lambda function using Bref</li>
<li>Upgrade to use Bref 2.0</li>
<li>Create a DynamoDB table</li>
<li>Test the stack Cloudformation code</li>
<li>Separate the PHP logic</li>
<li>Have PHP communicating with AWS Services</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://rafael.bernard-araujo.com/tag/bref-php-aws-story">https://rafael.bernard-araujo.com/tag/bref-php-aws-story</a></li>
<li><a href="https://bref.sh">https://bref.sh</a></li>
<li><a href="https://dev.to/rafaelbernard/a-bref-aws-php-history-part-1-2agn">https://dev.to/rafaelbernard/a-bref-aws-php-history-part-1-2agn</a></li>
<li><a href="https://dev.to/rafaelbernard/a-bref-aws-php-story-part-2-1dhe">https://dev.to/rafaelbernard/a-bref-aws-php-story-part-2-1dhe</a></li>
<li><a href="https://github.com/rafaelbernard/bref-initial-php-aws-story/tree/part-3">https://github.com/rafaelbernard/bref-initial-php-aws-story/tree/part-3</a></li>
<li><a href="https://github.com/rafaelbernard/bref-initial-php-aws-story/compare/tag-part-2...tag-part-3">https://github.com/rafaelbernard/bref-initial-php-aws-story/compare/tag-part-2...tag-part-3</a></li>
<li><a href="https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html">https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html</a></li>
</ul>
]]></content:encoded>
					
					<wfw:commentRss>https://rafael.bernard-araujo.com/a-bref-aws-php-story-part-3.php/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1980</post-id>	</item>
		<item>
		<title>Tropeçando 112</title>
		<link>https://rafael.bernard-araujo.com/tropecando-112.php</link>
					<comments>https://rafael.bernard-araujo.com/tropecando-112.php#respond</comments>
		
		<dc:creator><![CDATA[rafael]]></dc:creator>
		<pubDate>Mon, 22 Jan 2024 01:09:51 +0000</pubDate>
				<category><![CDATA[Tropeçando]]></category>
		<category><![CDATA[aws]]></category>
		<category><![CDATA[blue-green]]></category>
		<category><![CDATA[codedeploy]]></category>
		<category><![CDATA[docker]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[serverless]]></category>
		<category><![CDATA[terraform]]></category>
		<guid isPermaLink="false">https://rafael.bernard-araujo.com/?p=1862</guid>

					<description><![CDATA[Treezor: a serverless banking platform This case study dives into how Treezor went serverless for their banking platform. From legacy code running on servers to a serverless monolith, and then event-driven microservices on AWS with Bref. Treezor is a high available banking application running mostly in PHP. Wait, is cloud bad? Forrest Brazeal review 37signals [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><a href="https://bref.sh/docs/case-studies/treezor">Treezor: a serverless banking platform</a></p>
<blockquote>
<p>This case study dives into how Treezor went serverless for their banking platform. From legacy code running on servers to a serverless monolith, and then event-driven microservices on AWS with Bref.</p>
<p>Treezor is a high available banking application running mostly in PHP.</p>
</blockquote>
<p><a href="https://newsletter.goodtechthings.com/p/wait-is-cloud-bad">Wait, is cloud bad?</a></p>
<blockquote>
<p>Forrest Brazeal review 37signals (Basecamp) movement from the Cloud back to DataCenter, their use-case and some reasoning about the mentioned arguments for Data Center.</p>
</blockquote>
<p><a href="https://dev.to/aws-builders/ecs-bluegreen-deployment-with-codedeploy-and-terraform-3gf1">ECS Blue/Green deployment with CodeDeploy and Terraform </a></p>
<p><a href="https://getrector.com/blog/how-to-make-rector-contribute-your-pull-requests-every-day">How to make Rector Contribute Your Pull Requests Every Day</a></p>
<blockquote>
<p>Do you enjoy making code-reviews with hundreds of rules in your head and adding extra work to the pull-request author?</p>
<p>We don't, so we let Rector for us in active code review.</p>
</blockquote>
<p><a href="https://tim.mcnamara.nz/post/643989589027078144/docker-for-the-late-majority">Docker for the late majority</a></p>
<blockquote>
<p>This is a guide for people who would like a brief introduction to Docker and are too afraid to ask for one. I get it. Everyone around you already seems to know what they’re talking about. Looking ignorant is no fun.</p>
</blockquote>
<p><a href="https://chrisshennan.com/blog/10-essential-phpini-tweaks-for-improved-web-performance">10 Essential PHP.ini Tweaks for Improved Web Performance</a></p>
<blockquote>
<p>If you're running a website or web application with PHP, you may have encountered issues with slow loading times, high memory usage, or other performance problems. Fortunately, there are several tweaks you can make to your PHP configuration file (php.ini) to optimize your scripts and improve your website's performance. In this article, I'll cover the top 10 most common changes you might need to make to your php.ini file for best performance.</p>
</blockquote>
]]></content:encoded>
					
					<wfw:commentRss>https://rafael.bernard-araujo.com/tropecando-112.php/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1862</post-id>	</item>
		<item>
		<title>Solving problems 1: ECS, Event Bridge Scheduler, PHP, migrations</title>
		<link>https://rafael.bernard-araujo.com/solving-problems-1-ecs-event-bridge-scheduler-php-migrations.php</link>
					<comments>https://rafael.bernard-araujo.com/solving-problems-1-ecs-event-bridge-scheduler-php-migrations.php#respond</comments>
		
		<dc:creator><![CDATA[rafael]]></dc:creator>
		<pubDate>Thu, 30 Nov 2023 08:40:27 +0000</pubDate>
				<category><![CDATA[Solving Problems]]></category>
		<category><![CDATA[aws]]></category>
		<category><![CDATA[ecs fargate]]></category>
		<category><![CDATA[EventBridge]]></category>
		<category><![CDATA[migration]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[test automation]]></category>
		<guid isPermaLink="false">https://rafael.bernard-araujo.com/?p=1865</guid>

					<description><![CDATA[I love Mondays and Business as Usual. Solving problems is a delightful day-to-day task. Maybe this is what working with software means in the end. Do not take me wrong, it opens the doors for greenfield projects and experimentation. While mastering the business I can experiment, change and rebuild. The solving problems series is just [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>I love Mondays and Business as Usual. Solving problems is a delightful day-to-day task. Maybe this is what working with software means in the end. Do not take me wrong, it opens the doors for greenfield projects and experimentation. While mastering the business I can experiment, change and rebuild.</p>
<p>The solving problems series is just a way to share small ideas, experiences and outcomes of solving daily problems as I go. I wonder if some tips or experiences shared can help you build better what you are working on right now.</p>
<hr />
<p>During the last months, <a href="https://dev.to/lpossamai/smooth-sailing-from-aws-ec2-to-ecs-a-comprehensive-migration-guide-2dci">I have been migrating</a> an important <a href="https://www.php.net/">PHP</a> service to <a href="https://aws.amazon.com/ecs/">ECS Fargate</a> along with the runtime upgrade. The service is composed of a lot of parts and we have been architecting the migration so the operation causes no downtime to customers, even when they are over four different continents and many time zones.</p>
<p>One very important part of the service is already running in production for some months with success. We are preparing the next service.</p>
<p>For the migration plan, we deployed infrastructure ahead of starting moving traffic, planned to daily incremental traffic switch, like 5, 10, 25, 50, 75, and close monitoring. Also prepared a second plan to avoid rollback in case some performance issue arises. While monitoring we created backlog tickets with the observability outcomes.</p>
<p>During migration phases prepare yourself beforehand for the initial (1%, or 5%) traffic switch, so you can catch quickly those hidden use cases that only happen in production and act quickly. If you do so, other phases are just a matter of watching how scaling works.</p>
<p>Using containers (of course Kubernetes is a great alternative) is a fantastic opportunity to upgrade PHP runtimes efficiently at the same time where we use a much better platform that helps with delivery and developer experiences. The very first and most important step I recommend is to review how you deal with your secret and environment variables. This is pivotal for the success of a smooth migration.</p>
<p>We can expect that those type of applications has a fair amount of cron jobs associated with them. This is a great opportunity to follow the old saying &quot;use the right tool for the right problem&quot; and my suggestion would be to rewrite it, turning it into <a href="https://aws.amazon.com/lambda/">Lambda</a> or <a href="https://aws.amazon.com/step-functions/">Step Functions</a>, as applicable to each of what the cron job is doing. This is closer to what and how a job should run.</p>
<p>It happens that not always we can start refactoring right away, and then I can say that my experiences with <a href="https://docs.aws.amazon.com/eventbridge/latest/userguide/using-eventbridge-scheduler.html">Event Bridge Scheduler</a> triggering ECS tasks (previously cron jobs) are great. They are interestingly cheap alternatives while waiting for the refactoring project to take over. Don't take this as your permanent solution though, because it is not just right and a waste of resources and couple the cron job too much with parts of the application not really related.</p>
<p>We were reviewing the backlog and observability results of the last service. As we could prioritise and execute some backlog tickets, the dashboard and metrics highlighted that we had some room to review scaling and resource thresholds. We changed them carefully, resulting in a bill ~50% cheaper, CPU and memory resource stable and no performance degradation.</p>
<p>Some notes:</p>
<ul>
<li>Investing in test automation is good for your developer experience, site reliability and revenue; also a great support for technology improvements</li>
<li>It is worth taking a look at the <a href="https://docs.aws.amazon.com/autoscaling/ec2/APIReference/API_PredefinedMetricSpecification.html"><code>ALBRequestCountPerTarget</code></a> metric if you have CPU-heavy processes as you can better control how <a href="https://docs.aws.amazon.com/autoscaling/ec2/userguide/as-scaling-target-tracking.html">ECS will handle scale policies</a>, avoiding peak of CPU where the CPU average metric is not enough for scaling</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://dev.to/lpossamai/smooth-sailing-from-aws-ec2-to-ecs-a-comprehensive-migration-guide-2dci">https://dev.to/lpossamai/smooth-sailing-from-aws-ec2-to-ecs-a-comprehensive-migration-guide-2dci</a></li>
<li><a href="https://www.php.net/">https://www.php.net/</a></li>
<li><a href="https://docs.aws.amazon.com/eventbridge/latest/userguide/using-eventbridge-scheduler.html">https://docs.aws.amazon.com/eventbridge/latest/userguide/using-eventbridge-scheduler.html</a></li>
<li><a href="https://docs.aws.amazon.com/AmazonECS/latest/userguide/what-is-fargate.html">https://docs.aws.amazon.com/AmazonECS/latest/userguide/what-is-fargate.html</a></li>
<li><a href="https://aws.amazon.com/ecs/">https://aws.amazon.com/ecs/</a></li>
<li><a href="https://docs.aws.amazon.com/autoscaling/ec2/userguide/as-scaling-target-tracking.html">https://docs.aws.amazon.com/autoscaling/ec2/userguide/as-scaling-target-tracking.html</a></li>
<li><a href="https://docs.aws.amazon.com/autoscaling/ec2/APIReference/API_PredefinedMetricSpecification.html">https://docs.aws.amazon.com/autoscaling/ec2/APIReference/API_PredefinedMetricSpecification.html</a></li>
<li><a href="https://aws.amazon.com/lambda/">https://aws.amazon.com/lambda/</a></li>
</ul>
]]></content:encoded>
					
					<wfw:commentRss>https://rafael.bernard-araujo.com/solving-problems-1-ecs-event-bridge-scheduler-php-migrations.php/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1865</post-id>	</item>
		<item>
		<title>Tropeçando 110</title>
		<link>https://rafael.bernard-araujo.com/tropecando-110.php</link>
					<comments>https://rafael.bernard-araujo.com/tropecando-110.php#respond</comments>
		
		<dc:creator><![CDATA[rafael]]></dc:creator>
		<pubDate>Sat, 05 Aug 2023 14:24:46 +0000</pubDate>
				<category><![CDATA[Tropeçando]]></category>
		<category><![CDATA[aws-cdk]]></category>
		<category><![CDATA[ci/cd]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[serverless]]></category>
		<category><![CDATA[software architecture]]></category>
		<category><![CDATA[software engineering]]></category>
		<guid isPermaLink="false">https://rafael.bernard-araujo.com/?p=1829</guid>

					<description><![CDATA[Enabling the Optimal Serverless Platform Team — CDK and Team Topologies Serverless, and related technologies, have enabled teams to move faster, reduce total cost of ownership and overall empowered developers to have greater ownership of the systems they build. However, Serverless is not a silver bullet — there is an organisational side that’s key to [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><a href="https://medium.com/serverless-transformation/enabling-the-optimal-serverless-platform-team-cdk-and-team-topologies-fe4d9299adc9">Enabling the Optimal Serverless Platform Team — CDK and Team Topologies</a></p>
<blockquote><p>
Serverless, and related technologies, have enabled teams to move faster, reduce total cost of ownership and overall empowered developers to have greater ownership of the systems they build. However, Serverless is not a silver bullet — there is an organisational side that’s key to unlock the full benefits of Cloud.
</p></blockquote>
<p><a href="https://laravel-news.com/controller-refactor">Restructuring a Laravel Controller using Services, Events, Jobs, Actions, and more</a></p>
<blockquote><p>
A simple but nice walk-though about code decoupling.
</p></blockquote>
<p><a href="https://fly.io/blog/the-serverless-server/">The Serverless Server </a></p>
<blockquote><p>
I'm Will Jordan, and I work on SRE at Fly.io. We transmogrify Docker containers into lightweight micro-VMs and run them on our own hardware in racks around the world, so your apps can run close to your users. Check it out—your app can be up and running in minutes. This is a post about how services like ours are structured, and, in particular, what the term &quot;serverless&quot; has come to mean to me.
</p></blockquote>
<p><a href="https://web.archive.org/web/20240617070102/https://tomasvotruba.com/blog/keep-cognitive-complexity-low-with-phpstan/">Keep Cognitive Complexity Low with PHPStan</a></p>
<blockquote><p>
What is cognitive complexity? It's the amount of information we have to hold in our heads simultaneously to understand the code. The more indents, continue, break, nested foreach, and if/else branches, the harder is code to read.</p>
<p>You can use PHPStan rules to decrease the cognitive complexity of your codebase. This brings matuiry to your application and a more maintainable code.
</p></blockquote>
<p><a href="https://tomasvotruba.com/blog/how-to-release-php-81-and-72-package-in-the-same-repository">How to release PHP 8.1 and 7.2 package in the Same Repository</a></p>
<blockquote><p>
Some steps to release a package in more than one version, to allow compatibility for different PHP runtimes.
</p></blockquote>
]]></content:encoded>
					
					<wfw:commentRss>https://rafael.bernard-araujo.com/tropecando-110.php/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1829</post-id>	</item>
	</channel>
</rss>
