<?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>Forem: Ahmed Raza Idrisi</title>
    <description>The latest articles on Forem by Ahmed Raza Idrisi (@ahmedraza_fyntune).</description>
    <link>https://forem.com/ahmedraza_fyntune</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%2F2533524%2F63d54c29-49fc-4cf7-8a18-18a098084828.png</url>
      <title>Forem: Ahmed Raza Idrisi</title>
      <link>https://forem.com/ahmedraza_fyntune</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/ahmedraza_fyntune"/>
    <language>en</language>
    <item>
      <title>🔥 Arrays vs Slices in Go (Explained in the Simplest Way)</title>
      <dc:creator>Ahmed Raza Idrisi</dc:creator>
      <pubDate>Wed, 22 Apr 2026 17:10:21 +0000</pubDate>
      <link>https://forem.com/ahmedraza_fyntune/arrays-vs-slices-in-go-explained-in-the-simplest-way-48ca</link>
      <guid>https://forem.com/ahmedraza_fyntune/arrays-vs-slices-in-go-explained-in-the-simplest-way-48ca</guid>
      <description>&lt;p&gt;If you just started learning Go, one thing will confuse you quickly:&lt;/p&gt;

&lt;p&gt;👉 Arrays vs Slices&lt;/p&gt;

&lt;p&gt;They look similar… but behave very differently.&lt;/p&gt;

&lt;p&gt;Let’s break it down in the simplest way possible 👇&lt;/p&gt;




&lt;h2&gt;
  
  
  📦 What is an Array?
&lt;/h2&gt;

&lt;p&gt;An &lt;strong&gt;array&lt;/strong&gt; is a fixed-size collection.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Key points:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Size is &lt;strong&gt;fixed&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Cannot grow or shrink&lt;/li&gt;
&lt;li&gt;Rarely used in real-world Go apps&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔄 What is a Slice?
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;slice&lt;/strong&gt; is a dynamic version of an array.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Key points:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Size is &lt;strong&gt;dynamic&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Can grow using &lt;code&gt;append&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Used &lt;strong&gt;almost everywhere in Go&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ⚡ Adding Data (Only Works with Slice)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now:&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="mi"&gt;1&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="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&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;
  
  
  🧠 Under the Hood (Important Concept)
&lt;/h2&gt;

&lt;p&gt;A slice is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pointer to an array&lt;/li&gt;
&lt;li&gt;Length&lt;/li&gt;
&lt;li&gt;Capacity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Think of it like:&lt;br&gt;
👉 “A flexible view on top of an array”&lt;/p&gt;


&lt;h2&gt;
  
  
  🔍 Slice Example with Capacity
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nb"&gt;make&lt;/span&gt;&lt;span class="p"&gt;([]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c"&gt;// 2&lt;/span&gt;
&lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;cap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c"&gt;// 5&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ❗ Common Mistake
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;arr&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;arr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c"&gt;// ❌ ERROR&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Why?&lt;br&gt;
👉 Because arrays are fixed size&lt;/p&gt;


&lt;h2&gt;
  
  
  🔥 Real-World Use Case
&lt;/h2&gt;

&lt;p&gt;When building APIs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Ahmed"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"John"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dynamic data = slices ✅&lt;/p&gt;




&lt;h2&gt;
  
  
  🧭 When to Use What?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Array&lt;/th&gt;
&lt;th&gt;Slice&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Size&lt;/td&gt;
&lt;td&gt;Fixed&lt;/td&gt;
&lt;td&gt;Dynamic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Usage&lt;/td&gt;
&lt;td&gt;Rare&lt;/td&gt;
&lt;td&gt;Common&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flexibility&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;👉 In 95% of cases → use &lt;strong&gt;slice&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  💬 Final Thought
&lt;/h2&gt;

&lt;p&gt;If you understand slices, you understand &lt;strong&gt;how Go manages data internally&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This is a foundational concept—don’t skip it.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 Coming Next
&lt;/h2&gt;

&lt;p&gt;Next post:&lt;br&gt;
👉 Structs in Go (this is where real backend modeling starts)&lt;/p&gt;




&lt;h1&gt;
  
  
  golang #backend #programming #webdev #devto
&lt;/h1&gt;

</description>
      <category>go</category>
      <category>webdev</category>
      <category>programming</category>
      <category>ai</category>
    </item>
    <item>
      <title>🚀 Getting Started with Go (Golang) for Backend Developers</title>
      <dc:creator>Ahmed Raza Idrisi</dc:creator>
      <pubDate>Wed, 22 Apr 2026 17:07:57 +0000</pubDate>
      <link>https://forem.com/ahmedraza_fyntune/getting-started-with-go-golang-for-backend-developers-4lpp</link>
      <guid>https://forem.com/ahmedraza_fyntune/getting-started-with-go-golang-for-backend-developers-4lpp</guid>
      <description>&lt;p&gt;If you're coming from PHP, Node.js, or Laravel, learning Go can feel different—but in a good way.&lt;/p&gt;

&lt;p&gt;Go is designed for &lt;strong&gt;performance, simplicity, and concurrency&lt;/strong&gt;. Many modern systems use it for building fast APIs and scalable services.&lt;/p&gt;

&lt;p&gt;Let’s understand it in a simple way 👇&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 What is Go?
&lt;/h2&gt;

&lt;p&gt;Go (or Golang) is a &lt;strong&gt;compiled programming language&lt;/strong&gt; created at Google.&lt;/p&gt;

&lt;p&gt;Think of it like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⚡ Faster than PHP/Node (compiled)&lt;/li&gt;
&lt;li&gt;🧼 Cleaner syntax than Java&lt;/li&gt;
&lt;li&gt;🔁 Built for concurrency (handling multiple tasks efficiently)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ⚙️ Your First Go Program
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="s"&gt;"fmt"&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello, World!"&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;h3&gt;
  
  
  What’s happening?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;package main&lt;/code&gt; → entry point&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;import "fmt"&lt;/code&gt; → used for printing&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;func main()&lt;/code&gt; → main function where execution starts&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔤 Variables in Go
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="s"&gt;"Ahmed"&lt;/span&gt;
&lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;25&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No need to write types explicitly (Go infers them).&lt;/p&gt;




&lt;h2&gt;
  
  
  🔁 Loops (Only ONE loop in Go)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&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;Simple and clean.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚡ Functions
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧵 Concurrency (This is where Go shines)
&lt;/h2&gt;

&lt;p&gt;Go uses &lt;strong&gt;goroutines&lt;/strong&gt; (lightweight threads):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;go&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Running in background"&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;h3&gt;
  
  
  Why this matters:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Handle multiple API requests easily&lt;/li&gt;
&lt;li&gt;Build high-performance systems&lt;/li&gt;
&lt;li&gt;Perfect for microservices&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🌐 Simple API in Go
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"fmt"&lt;/span&gt;
    &lt;span class="s"&gt;"net/http"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ResponseWriter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Hello from Go API"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HandleFunc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ListenAndServe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;":8080"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;nil&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;Run it and open:&lt;br&gt;
👉 &lt;a href="http://localhost:8080" rel="noopener noreferrer"&gt;http://localhost:8080&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🔥 Why You Should Learn Go
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;High performance (close to C++)&lt;/li&gt;
&lt;li&gt;Simple syntax&lt;/li&gt;
&lt;li&gt;Great for backend + APIs&lt;/li&gt;
&lt;li&gt;Used by companies like Google, Uber, Netflix&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧭 Coming Next
&lt;/h2&gt;

&lt;p&gt;In upcoming posts, I’ll cover:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Building REST APIs in Go&lt;/li&gt;
&lt;li&gt;Connecting Go with PostgreSQL&lt;/li&gt;
&lt;li&gt;Using Go with Docker&lt;/li&gt;
&lt;li&gt;Concurrency deep dive (goroutines + channels)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  💬 Final Thought
&lt;/h2&gt;

&lt;p&gt;If you already know backend development, Go will feel like a &lt;strong&gt;power upgrade&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Start small. Stay consistent. Share what you learn.&lt;/p&gt;




&lt;h1&gt;
  
  
  golang #backend #programming #webdev #devto
&lt;/h1&gt;

</description>
      <category>go</category>
      <category>programming</category>
      <category>webdev</category>
      <category>opensource</category>
    </item>
    <item>
      <title>🚀 5 Modern PHP Features You Should Start Using Today</title>
      <dc:creator>Ahmed Raza Idrisi</dc:creator>
      <pubDate>Wed, 22 Apr 2026 17:03:48 +0000</pubDate>
      <link>https://forem.com/ahmedraza_fyntune/5-modern-php-features-you-should-start-using-today-4i2j</link>
      <guid>https://forem.com/ahmedraza_fyntune/5-modern-php-features-you-should-start-using-today-4i2j</guid>
      <description>&lt;p&gt;If you’re still writing PHP like it's 2015, you're missing out on some powerful features that make your code cleaner, safer, and easier to maintain.&lt;/p&gt;

&lt;p&gt;In this post, I’ll walk you through &lt;strong&gt;5 modern PHP features&lt;/strong&gt; in a very simple way — with examples you can actually use in real projects.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. ✅ Typed Properties (Strict Data Handling)
&lt;/h2&gt;

&lt;p&gt;Before PHP 7.4, you couldn’t define types for class properties.&lt;/p&gt;

&lt;h3&gt;
  
  
  ❌ Old way:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nv"&gt;$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;h3&gt;
  
  
  ✅ New way:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$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;h3&gt;
  
  
  Why it matters:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Prevents invalid data&lt;/li&gt;
&lt;li&gt;Makes your code predictable&lt;/li&gt;
&lt;li&gt;Helps avoid bugs early&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. ✅ Arrow Functions (Shorter Closures)
&lt;/h2&gt;

&lt;p&gt;Arrow functions make your code shorter and cleaner.&lt;/p&gt;

&lt;h3&gt;
  
  
  ❌ Old way:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$numbers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="nv"&gt;$squared&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;array_map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$n&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nv"&gt;$n&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="nv"&gt;$numbers&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ✅ New way:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$squared&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;array_map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$n&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nv"&gt;$n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Why it matters:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Less boilerplate&lt;/li&gt;
&lt;li&gt;More readable functional code&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. ✅ Null Safe Operator (&lt;code&gt;?-&amp;gt;&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;Avoid those annoying null checks.&lt;/p&gt;

&lt;h3&gt;
  
  
  ❌ Old way:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;profile&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;profile&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;email&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;h3&gt;
  
  
  ✅ New way:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="o"&gt;?-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;profile&lt;/span&gt;&lt;span class="o"&gt;?-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Why it matters:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Cleaner code&lt;/li&gt;
&lt;li&gt;No more "trying to access property of null" errors&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4. ✅ Match Expression (Better than switch)
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;match&lt;/code&gt; is more strict and cleaner than &lt;code&gt;switch&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  ❌ switch:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;switch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$status&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s1"&gt;'success'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="nv"&gt;$msg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Done'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s1"&gt;'error'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="nv"&gt;$msg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Failed'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;break&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;h3&gt;
  
  
  ✅ match:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$msg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$status&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s1"&gt;'success'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Done'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'error'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Failed'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Unknown'&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Why it matters:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;No &lt;code&gt;break&lt;/code&gt; needed&lt;/li&gt;
&lt;li&gt;Strict comparison (no type confusion)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  5. ✅ Constructor Property Promotion
&lt;/h2&gt;

&lt;p&gt;Less boilerplate when creating classes.&lt;/p&gt;

&lt;h3&gt;
  
  
  ❌ Old way:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__construct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$name&lt;/span&gt;&lt;span class="p"&gt;;&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;h3&gt;
  
  
  ✅ New way:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__construct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$name&lt;/span&gt;&lt;span class="p"&gt;)&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;h3&gt;
  
  
  Why it matters:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Cleaner classes&lt;/li&gt;
&lt;li&gt;Less repetitive code&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔥 Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Modern PHP is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Faster ⚡&lt;/li&gt;
&lt;li&gt;Cleaner ✨&lt;/li&gt;
&lt;li&gt;Safer 🔒&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're working with frameworks like Laravel, these features are already being used under the hood — so understanding them will level up your coding skills.&lt;/p&gt;




&lt;h2&gt;
  
  
  💬 What Next?
&lt;/h2&gt;

&lt;p&gt;If you found this useful, I can share:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Real-world Laravel examples using these features&lt;/li&gt;
&lt;li&gt;Performance tips for PHP apps&lt;/li&gt;
&lt;li&gt;Clean architecture patterns in PHP&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let me know in the comments 👇&lt;/p&gt;




&lt;h1&gt;
  
  
  PHP #Laravel #WebDevelopment #Backend #Programming
&lt;/h1&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>php</category>
      <category>laravel</category>
    </item>
    <item>
      <title>The Case of the Empty 500: How I Proved the API Failure Wasn't Our Fault</title>
      <dc:creator>Ahmed Raza Idrisi</dc:creator>
      <pubDate>Wed, 11 Feb 2026 17:40:56 +0000</pubDate>
      <link>https://forem.com/ahmedraza_fyntune/the-case-of-the-empty-500-how-i-proved-the-api-failure-wasnt-our-fault-1h37</link>
      <guid>https://forem.com/ahmedraza_fyntune/the-case-of-the-empty-500-how-i-proved-the-api-failure-wasnt-our-fault-1h37</guid>
      <description>&lt;p&gt;We’ve all been there. You make an API call, it fails, and the finger-pointing begins. "It’s the frontend," says the backend team. "It’s your service," says the API provider.&lt;/p&gt;

&lt;p&gt;Recently, I faced a debugging challenge where our application was receiving an empty response from an external API. On the surface, it looked like our request was simply vanishing into the void. Here is how I tracked down the culprit: The WAF.&lt;/p&gt;

&lt;p&gt;The Problem&lt;br&gt;
Our application was calling an external endpoint. The symptoms were frustratingly vague:&lt;/p&gt;

&lt;p&gt;Response Body: Completely empty.&lt;/p&gt;

&lt;p&gt;Result: The application logic failed because there was no data to parse.&lt;/p&gt;

&lt;p&gt;Internal Consensus: Initial thoughts were that our request payload was malformed or our connection was dropping.&lt;/p&gt;

&lt;p&gt;Digging into the Headers&lt;br&gt;
While the response body was empty, the HTTP Status Code and Response Headers told a different story. I noticed two red flags:&lt;/p&gt;

&lt;p&gt;Status Code 500: A "500 Internal Server Error" usually implies the server tried to do something and failed. If it were our network, we’d likely see a 404 or a timeout.&lt;/p&gt;

&lt;p&gt;Infrastructure Headers: Looking at the network trace, I saw headers related to Cloudflare and specific WAF (Web Application Firewall) signatures.&lt;/p&gt;

&lt;p&gt;The "Aha!" Moment&lt;br&gt;
By analyzing the custom headers injected by their WAF, I realized the request wasn't even reaching their application code. Their security layer was intercepting our request and dropping the payload before the server could process it.&lt;/p&gt;

&lt;p&gt;Even though the body was empty, the presence of those specific infrastructure headers proved that the hand-off to their network was successful, but their security rules were blocking us.&lt;/p&gt;

&lt;p&gt;The Resolution&lt;br&gt;
I presented the logs and the specific WAF headers to the provider's network team. With this evidence, they were able to:&lt;/p&gt;

&lt;p&gt;Identify the specific firewall rule that was flagging our IP/payload.&lt;/p&gt;

&lt;p&gt;Whitelist our service.&lt;/p&gt;

&lt;p&gt;Restore the API functionality.&lt;/p&gt;

&lt;p&gt;Key Takeaways for Debugging APIs&lt;br&gt;
Never ignore the headers: The body might be empty, but headers are the "fingerprints" of the servers the request passed through.&lt;/p&gt;

&lt;p&gt;Status codes matter: A 500 error is a server-side confession.&lt;/p&gt;

&lt;p&gt;Check for Middleware: In modern web dev, you aren't just talking to a server; you're talking to Load Balancers, WAFs, and Proxies.&lt;/p&gt;

</description>
      <category>api</category>
      <category>webdev</category>
      <category>debugging</category>
      <category>security</category>
    </item>
    <item>
      <title>laravel request life cycle</title>
      <dc:creator>Ahmed Raza Idrisi</dc:creator>
      <pubDate>Fri, 26 Sep 2025 15:21:04 +0000</pubDate>
      <link>https://forem.com/ahmedraza_fyntune/laravel-request-life-cycle-3l4</link>
      <guid>https://forem.com/ahmedraza_fyntune/laravel-request-life-cycle-3l4</guid>
      <description>&lt;h3&gt;
  
  
  Laravel Request Lifecycle
&lt;/h3&gt;

&lt;p&gt;The Laravel request lifecycle begins when a user sends an HTTP request to the web server (Apache, Nginx). The server forwards the request to the &lt;code&gt;public/index.php&lt;/code&gt; file, the application's single entry point. This file loads Composer’s autoloader, performs essential bootstrapping, and constructs a new instance of the Laravel application.&lt;/p&gt;

&lt;p&gt;The next step is the HTTP Kernel, which manages the request, response, and middleware stacks. The global middleware stack runs first, acting as filters for every HTTP request. Service providers register core services, and after bootstrapping, the router dispatches the request to a route or controller, executing any route-specific middleware.&lt;/p&gt;

&lt;p&gt;Controllers (or route closures) process the request and generate a response—HTML view, JSON, download, or redirect. Before the response is sent to the user's browser, it passes back out through the middleware stack for any post-processing. Finally, the Kernel’s &lt;code&gt;handle()&lt;/code&gt; method returns the response for &lt;code&gt;index.php&lt;/code&gt; to deliver to the browser.&lt;/p&gt;

&lt;h3&gt;
  
  
  Middleware's Role in the Lifecycle
&lt;/h3&gt;

&lt;p&gt;Middleware in Laravel act as filters operating before or after the core route/controller logic. They check authentication, log requests, manipulate headers, etc. Middleware can be global (applied to all requests) or route-specific (applied only to selected routes). Middleware can halt, redirect, modify requests, or even process responses before they're sent back to the client.&lt;/p&gt;

&lt;h3&gt;
  
  
  Creating Custom Middleware
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Global Middleware
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Generate middleware:
&lt;code&gt;php artisan make:middleware CustomGlobalMiddleware&lt;/code&gt;.[8]&lt;/li&gt;
&lt;li&gt;Add logic in &lt;code&gt;app/Http/Middleware/CustomGlobalMiddleware.php&lt;/code&gt;:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;  &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;handle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;Closure&lt;/span&gt; &lt;span class="nv"&gt;$next&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// Custom logic here&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$request&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;ul&gt;
&lt;li&gt;Register in &lt;code&gt;app/Http/Kernel.php&lt;/code&gt; by adding to the &lt;code&gt;$middleware&lt;/code&gt; array:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;  &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="nv"&gt;$middleware&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="c1"&gt;// ... existing middleware,&lt;/span&gt;
      &lt;span class="nc"&gt;\App\Http\Middleware\CustomGlobalMiddleware&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&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;ul&gt;
&lt;li&gt;Now the middleware runs for every HTTP request.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Route Middleware
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Generate middleware:
&lt;code&gt;php artisan make:middleware CustomRouteMiddleware&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Add logic in &lt;code&gt;app/Http/Middleware/CustomRouteMiddleware.php&lt;/code&gt; as above.&lt;/li&gt;
&lt;li&gt;Register in &lt;code&gt;app/Http/Kernel.php&lt;/code&gt; within &lt;code&gt;$routeMiddleware&lt;/code&gt;:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;  &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="nv"&gt;$routeMiddleware&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="s1"&gt;'custom'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;\App\Http\Middleware\CustomRouteMiddleware&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&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;ul&gt;
&lt;li&gt;Apply to route:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;  &lt;span class="nc"&gt;Route&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/example'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s1"&gt;'Example Route'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;middleware&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'custom'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;For groups:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;  &lt;span class="nc"&gt;Route&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;middleware&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'custom'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;group&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nc"&gt;Route&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/a'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;...&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nc"&gt;Route&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/b'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;...&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;h3&gt;
  
  
  Passing Parameters to Middleware
&lt;/h3&gt;

&lt;p&gt;Parameters can be sent to route middleware by appending them after a colon in the route definition:&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="nc"&gt;Route&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/post/{id}'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'PostController@show'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;middleware&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'verify.role:admin'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the middleware class, receive them as extra arguments:&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="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;handle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;Closure&lt;/span&gt; &lt;span class="nv"&gt;$next&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$role&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Check for required role&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$request&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;To access route parameters (like &lt;code&gt;{id}&lt;/code&gt;) inside middleware:&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="nv"&gt;$id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'id'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Gets route param 'id'&lt;/span&gt;
&lt;span class="nv"&gt;$params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;route&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// All parameters array&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This lets you make your middleware context-aware and dynamic.&lt;/p&gt;




&lt;h3&gt;
  
  
  Quick Reference Table: Request Lifecycle Steps
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Web Server&lt;/td&gt;
&lt;td&gt;Receives &amp;amp; forwards HTTP request&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;index.php&lt;/td&gt;
&lt;td&gt;Application entry, bootstraps Laravel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kernel&lt;/td&gt;
&lt;td&gt;Handles requests, global middleware&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Service Providers&lt;/td&gt;
&lt;td&gt;Register services&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Router&lt;/td&gt;
&lt;td&gt;Routes requests, applies route middleware&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Controller/View&lt;/td&gt;
&lt;td&gt;Core logic &amp;amp; generates response&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Middleware&lt;/td&gt;
&lt;td&gt;Filters/Processes requests &amp;amp; responses&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Response&lt;/td&gt;
&lt;td&gt;Sent back via Kernel &amp;amp; index.php&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;p&gt;This sequence gives a robust, hands-on understanding of where middleware intercepts requests, how to build custom ones, and how parameters integrate with the lifecycle—all as essential for mastering Laravel’s request flow and middleware.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>laravel</category>
      <category>php</category>
      <category>programming</category>
    </item>
    <item>
      <title>Replication &amp; High Availability</title>
      <dc:creator>Ahmed Raza Idrisi</dc:creator>
      <pubDate>Sat, 20 Sep 2025 06:15:42 +0000</pubDate>
      <link>https://forem.com/ahmedraza_fyntune/replication-high-availability-46fk</link>
      <guid>https://forem.com/ahmedraza_fyntune/replication-high-availability-46fk</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;Replication &amp;amp; High Availability&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🔹 What is Replication?
&lt;/h3&gt;

&lt;p&gt;Replication is the process of &lt;strong&gt;copying data from one database server (the primary) to one or more other servers (replicas/secondaries)&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;primary&lt;/strong&gt; (or master) handles writes (INSERT, UPDATE, DELETE).&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;replicas&lt;/strong&gt; (or slaves, followers, standbys) receive these changes and apply them.&lt;/li&gt;
&lt;li&gt;This ensures &lt;strong&gt;multiple copies of the same data&lt;/strong&gt; exist across servers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Think of it like keeping &lt;strong&gt;photocopies&lt;/strong&gt; of your important notebook in multiple places — if one is lost, you still have backups.&lt;/p&gt;




&lt;h3&gt;
  
  
  🔹 Types of Replication
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Synchronous Replication&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Writes on the primary are &lt;strong&gt;confirmed only after replicas also confirm&lt;/strong&gt; they’ve written the change.&lt;/li&gt;
&lt;li&gt;Ensures &lt;strong&gt;no data loss&lt;/strong&gt; but can &lt;strong&gt;slow down performance&lt;/strong&gt; (since it waits).&lt;/li&gt;
&lt;li&gt;Example: PostgreSQL &lt;strong&gt;synchronous replication&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Asynchronous Replication&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Primary writes immediately return success, and replicas catch up &lt;strong&gt;later&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Faster, but &lt;strong&gt;risk of data loss&lt;/strong&gt; if primary crashes before replicas sync.&lt;/li&gt;
&lt;li&gt;Example: MySQL’s default replication.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Semi-synchronous Replication&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;A middle ground: primary waits for &lt;strong&gt;at least one replica&lt;/strong&gt; to confirm before success.&lt;/li&gt;
&lt;li&gt;Balance between &lt;strong&gt;safety &amp;amp; performance&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🔹 Why Replication is Important?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Read Scaling&lt;/strong&gt;: Distribute reads across replicas (read-heavy apps benefit).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;High Availability&lt;/strong&gt;: If primary fails, replicas can be promoted as new primary.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Disaster Recovery&lt;/strong&gt;: Data is safe even if one server is lost.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Geographic Distribution&lt;/strong&gt;: Users in Asia can read from an Asia replica instead of a US server.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🔹 High Availability (HA)
&lt;/h3&gt;

&lt;p&gt;HA is about keeping your &lt;strong&gt;database always online&lt;/strong&gt;, even during failures. Replication is a &lt;strong&gt;core building block&lt;/strong&gt; of HA, but HA adds &lt;strong&gt;automatic failover and monitoring&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If primary &lt;strong&gt;dies&lt;/strong&gt;, a &lt;strong&gt;replica automatically becomes the new primary&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Clients reconnect automatically without manual intervention.&lt;/li&gt;
&lt;li&gt;Requires a &lt;strong&gt;cluster manager / orchestrator&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🔹 Replication &amp;amp; HA in Popular Databases
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;MySQL&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Replication: Asynchronous by default (&lt;code&gt;binlog&lt;/code&gt;-based).&lt;/li&gt;
&lt;li&gt;HA: Tools like &lt;strong&gt;MySQL InnoDB Cluster&lt;/strong&gt;, &lt;strong&gt;Orchestrator&lt;/strong&gt;, or &lt;strong&gt;ProxySQL&lt;/strong&gt; handle failover.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;PostgreSQL&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Built-in streaming replication.&lt;/li&gt;
&lt;li&gt;HA: Tools like &lt;strong&gt;Patroni&lt;/strong&gt;, &lt;strong&gt;PgBouncer&lt;/strong&gt;, &lt;strong&gt;repmgr&lt;/strong&gt;, or &lt;strong&gt;Stolon&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;MongoDB&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Replica sets built-in: one &lt;strong&gt;primary&lt;/strong&gt;, multiple &lt;strong&gt;secondaries&lt;/strong&gt;, automatic failover.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Cassandra&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Replication is &lt;strong&gt;peer-to-peer&lt;/strong&gt; (no master/replica distinction). Every node can handle writes.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h3&gt;
  
  
  🔹 Example Scenario
&lt;/h3&gt;

&lt;p&gt;Imagine a &lt;strong&gt;banking app&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Primary DB (Mumbai) → handles all &lt;strong&gt;deposits/withdrawals&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Replicas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Delhi replica → handles &lt;strong&gt;read queries&lt;/strong&gt; for North India users.&lt;/li&gt;
&lt;li&gt;London replica → handles reads for European users.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;If the &lt;strong&gt;Mumbai primary crashes&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Delhi replica is promoted to &lt;strong&gt;new primary&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;All writes now go to Delhi, ensuring &lt;strong&gt;zero downtime&lt;/strong&gt; for customers.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;✅ &lt;strong&gt;Summary&lt;/strong&gt;&lt;br&gt;
Replication = Copying data across servers.&lt;br&gt;
High Availability = Making sure the database &lt;strong&gt;stays alive automatically&lt;/strong&gt;, even if one server dies.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔹 How Automatic Failover Works
&lt;/h2&gt;

&lt;h2&gt;
  
  
  1. &lt;strong&gt;Health Monitoring&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Tools like &lt;strong&gt;Patroni (PostgreSQL)&lt;/strong&gt;, &lt;strong&gt;Orchestrator (MySQL)&lt;/strong&gt;, or &lt;strong&gt;MongoDB built-in replica sets&lt;/strong&gt; constantly &lt;strong&gt;ping the primary DB&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;They check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is the DB server &lt;strong&gt;alive&lt;/strong&gt; (via TCP/heartbeat)?&lt;/li&gt;
&lt;li&gt;Is replication &lt;strong&gt;up-to-date&lt;/strong&gt;?&lt;/li&gt;
&lt;li&gt;Is there &lt;strong&gt;network partition&lt;/strong&gt; (primary is alive but unreachable)?&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;👉 If the primary &lt;strong&gt;stops responding&lt;/strong&gt; within a certain timeout (say 10s), it’s marked as &lt;strong&gt;failed&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. &lt;strong&gt;Leader Election&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;In a cluster, you don’t want &lt;strong&gt;two primaries&lt;/strong&gt; (split-brain issue ⚠️).&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;consensus system&lt;/strong&gt; like &lt;strong&gt;Etcd, Consul, or Zookeeper&lt;/strong&gt; is used.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Cluster members vote:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Primary is dead, we need a new one."&lt;/li&gt;
&lt;li&gt;They agree on &lt;strong&gt;which replica is most up-to-date&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;👉 The &lt;strong&gt;most recent replica&lt;/strong&gt; (with the least replication lag) becomes the new &lt;strong&gt;Primary&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. &lt;strong&gt;Failover / Promotion&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The chosen replica:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Promotes itself to &lt;strong&gt;Primary&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Stops being read-only.&lt;/li&gt;
&lt;li&gt;Starts accepting &lt;strong&gt;writes&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;👉 In Patroni (PostgreSQL), this is done with &lt;code&gt;pg_ctl promote&lt;/code&gt;.&lt;br&gt;
👉 In Orchestrator (MySQL), it issues &lt;code&gt;RESET SLAVE ALL&lt;/code&gt; + reconfigures replication.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. &lt;strong&gt;Reconfiguration&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Other replicas now start replicating from the &lt;strong&gt;new Primary&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;The cluster updates routing so &lt;strong&gt;apps know where to send writes&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Tools like &lt;strong&gt;HAProxy, ProxySQL, or PgBouncer&lt;/strong&gt; help by pointing apps to the current Primary.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  5. &lt;strong&gt;Application Transparency&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Applications don’t have to know which DB is Primary.&lt;/li&gt;
&lt;li&gt;They just connect to a &lt;strong&gt;load balancer / proxy&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;If failover happens, the proxy redirects traffic to the new Primary.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 This ensures &lt;strong&gt;no downtime&lt;/strong&gt; for the app.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔹 Example with Tools
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;PostgreSQL + Patroni&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Patroni uses &lt;strong&gt;Etcd/Consul&lt;/strong&gt; for cluster state.&lt;/li&gt;
&lt;li&gt;Monitors DB health.&lt;/li&gt;
&lt;li&gt;On failure → promotes replica → updates routing.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;MySQL + Orchestrator&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Continuously monitors replication topology.&lt;/li&gt;
&lt;li&gt;Detects primary failure.&lt;/li&gt;
&lt;li&gt;Promotes the best replica automatically.&lt;/li&gt;
&lt;li&gt;Updates HAProxy/ProxySQL.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;MongoDB Replica Set&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Built-in heartbeat detection.&lt;/li&gt;
&lt;li&gt;Automatic election (no external tool needed).&lt;/li&gt;
&lt;li&gt;One secondary becomes new primary.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;p&gt;✅ &lt;strong&gt;Summary in Simple Words&lt;/strong&gt;&lt;br&gt;
Failover tools are like a &lt;strong&gt;traffic cop&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Check if the main road (primary DB) is open.&lt;/li&gt;
&lt;li&gt;If closed, find the &lt;strong&gt;best alternative road (replica)&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Redirect all cars (applications) automatically.&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>webdev</category>
      <category>database</category>
      <category>programming</category>
    </item>
    <item>
      <title>Advance Indexing in MYSql and Psql</title>
      <dc:creator>Ahmed Raza Idrisi</dc:creator>
      <pubDate>Fri, 19 Sep 2025 12:25:42 +0000</pubDate>
      <link>https://forem.com/ahmedraza_fyntune/advance-indexing-in-mysql-and-psql-297k</link>
      <guid>https://forem.com/ahmedraza_fyntune/advance-indexing-in-mysql-and-psql-297k</guid>
      <description>&lt;p&gt;Perfect 👌 Let’s go &lt;strong&gt;deep into Indexing&lt;/strong&gt; since it’s the heart of database performance.&lt;br&gt;
I’ll keep it &lt;strong&gt;detailed but easy to follow&lt;/strong&gt; with MySQL &amp;amp; PostgreSQL examples.&lt;/p&gt;


&lt;h2&gt;
  
  
  🔹 Advanced Indexing Explained
&lt;/h2&gt;

&lt;p&gt;Indexes are like the &lt;strong&gt;table of contents&lt;/strong&gt; in a book 📖.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Without index → You scan the whole book to find “Chapter 10”.&lt;/li&gt;
&lt;li&gt;With index → You jump directly to the page number listed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In databases, indexes speed up &lt;strong&gt;SELECT&lt;/strong&gt; queries by avoiding full table scans.&lt;/p&gt;


&lt;h2&gt;
  
  
  1. &lt;strong&gt;B-Tree Index (Default in MySQL &amp;amp; PostgreSQL)&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Most common type.&lt;/li&gt;
&lt;li&gt;Great for equality (&lt;code&gt;=&lt;/code&gt;) and range queries (&lt;code&gt;&amp;lt;, &amp;gt;, BETWEEN&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Data stored in a balanced tree → lookup is &lt;strong&gt;O(log n)&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example (Postgres/MySQL):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;idx_users_email&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Query using it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'abc@gmail.com'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 Index lets DB jump directly to matching rows instead of scanning all.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. &lt;strong&gt;Hash Index&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Only good for &lt;strong&gt;exact matches&lt;/strong&gt; (&lt;code&gt;=&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Not good for ranges (&lt;code&gt;&amp;lt;&lt;/code&gt;, &lt;code&gt;&amp;gt;&lt;/code&gt;, &lt;code&gt;BETWEEN&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;MySQL has them in &lt;strong&gt;Memory engine&lt;/strong&gt;; PostgreSQL supports &lt;code&gt;HASH&lt;/code&gt; explicitly.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example (Postgres):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;idx_users_username_hash&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="k"&gt;USING&lt;/span&gt; &lt;span class="n"&gt;HASH&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 &lt;code&gt;WHERE username = 'john_doe'&lt;/code&gt; becomes super fast.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. &lt;strong&gt;GIN Index (Generalized Inverted Index – PostgreSQL only)&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Used for &lt;strong&gt;full-text search&lt;/strong&gt; and JSONB queries.&lt;/li&gt;
&lt;li&gt;Stores a mapping from &lt;strong&gt;value → rows containing it&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example: Full-text search&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;idx_post_content_gin&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;posts&lt;/span&gt; &lt;span class="k"&gt;USING&lt;/span&gt; &lt;span class="n"&gt;GIN&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;to_tsvector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'english'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;posts&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;to_tsvector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'english'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;@@&lt;/span&gt; &lt;span class="n"&gt;to_tsquery&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'database &amp;amp; scaling'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 Useful for search features (like Google inside your DB).&lt;/p&gt;




&lt;h2&gt;
  
  
  4. &lt;strong&gt;GiST Index (Generalized Search Tree – PostgreSQL)&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;More flexible than B-Tree.&lt;/li&gt;
&lt;li&gt;Supports &lt;strong&gt;geospatial queries&lt;/strong&gt;, ranges, similarity search.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example (find locations near a point):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;idx_locations_gist&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;locations&lt;/span&gt; &lt;span class="k"&gt;USING&lt;/span&gt; &lt;span class="n"&gt;GiST&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;geom&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;locations&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;ST_DWithin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;geom&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ST_MakePoint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;77&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;5946&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;9716&lt;/span&gt;&lt;span class="p"&gt;)::&lt;/span&gt;&lt;span class="n"&gt;geography&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 Finds all locations within 5km of given coordinates (great for maps).&lt;/p&gt;




&lt;h2&gt;
  
  
  5. &lt;strong&gt;BRIN Index (Block Range Index – PostgreSQL)&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Very lightweight.&lt;/li&gt;
&lt;li&gt;Instead of indexing every row, it stores min/max per block of rows.&lt;/li&gt;
&lt;li&gt;Great for &lt;strong&gt;sequential / time-series data&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;idx_logs_date_brin&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;logs&lt;/span&gt; &lt;span class="k"&gt;USING&lt;/span&gt; &lt;span class="n"&gt;BRIN&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;log_date&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 Efficient for queries like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;logs&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;log_date&lt;/span&gt; &lt;span class="k"&gt;BETWEEN&lt;/span&gt; &lt;span class="s1"&gt;'2025-01-01'&lt;/span&gt; &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="s1"&gt;'2025-01-31'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 Works best when data is &lt;strong&gt;naturally ordered&lt;/strong&gt; (like timestamps).&lt;/p&gt;




&lt;h2&gt;
  
  
  6. &lt;strong&gt;Covering Index (a.k.a. Index with INCLUDE columns)&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Stores extra columns in the index itself.&lt;/li&gt;
&lt;li&gt;Avoids going back to the table (called “index-only scan”).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Postgres:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;idx_orders_customer_date&lt;/span&gt;
&lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;INCLUDE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;order_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;total_amount&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;order_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;total_amount&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;customer_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;123&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 DB serves query &lt;strong&gt;only from index&lt;/strong&gt;, no table lookup needed.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. &lt;strong&gt;Partial / Filtered Index&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Index only rows that meet a condition.&lt;/li&gt;
&lt;li&gt;Saves space &amp;amp; improves performance when you query subsets often.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Postgres:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;idx_active_users&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'active'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 Queries on active users become lightning fast, without indexing inactive ones.&lt;/p&gt;




&lt;h2&gt;
  
  
  8. &lt;strong&gt;Expression Index&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Index on a function or expression.&lt;/li&gt;
&lt;li&gt;Great when queries always apply transformations.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Postgres:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;idx_lower_email&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;LOWER&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="k"&gt;LOWER&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'abc@gmail.com'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 Uses index instead of scanning all rows.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔹 How to Know Which Index to Use?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Exact match lookup&lt;/strong&gt; → Hash index (Postgres) or B-Tree.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Range queries (&amp;gt;, &amp;lt;, BETWEEN)&lt;/strong&gt; → B-Tree.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Text search / JSONB search&lt;/strong&gt; → GIN.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Geospatial / similarity&lt;/strong&gt; → GiST.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Time-series / ordered data&lt;/strong&gt; → BRIN.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Only certain rows&lt;/strong&gt; → Partial index.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Always lowercase/transform&lt;/strong&gt; → Expression index.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔹 Important Notes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Indexes &lt;strong&gt;speed up reads but slow down writes&lt;/strong&gt; (inserts/updates/deletes need to update indexes).&lt;/li&gt;
&lt;li&gt;Too many indexes = slower writes + more storage.&lt;/li&gt;
&lt;li&gt;Always use &lt;code&gt;EXPLAIN&lt;/code&gt; or &lt;code&gt;EXPLAIN ANALYZE&lt;/code&gt; to see if your query uses the index.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;✅ &lt;strong&gt;Summary:&lt;/strong&gt;&lt;br&gt;
Indexes are like shortcuts — different types exist for different problems.&lt;br&gt;
Mastering them = 80% of database optimization as a database engineer.&lt;/p&gt;

</description>
      <category>database</category>
      <category>webdev</category>
      <category>backend</category>
      <category>programming</category>
    </item>
    <item>
      <title>Sharding in Databases: How Queries Identify the Right Shard</title>
      <dc:creator>Ahmed Raza Idrisi</dc:creator>
      <pubDate>Fri, 19 Sep 2025 12:12:21 +0000</pubDate>
      <link>https://forem.com/ahmedraza_fyntune/sharding-in-databases-how-queries-identify-the-right-shard-446</link>
      <guid>https://forem.com/ahmedraza_fyntune/sharding-in-databases-how-queries-identify-the-right-shard-446</guid>
      <description>&lt;h2&gt;
  
  
  🔹 What is &lt;strong&gt;Sharding&lt;/strong&gt; in Databases?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Sharding&lt;/strong&gt; is a database &lt;strong&gt;partitioning technique&lt;/strong&gt; where data is split across multiple databases or servers (called &lt;strong&gt;shards&lt;/strong&gt;) to improve scalability and performance.&lt;/p&gt;

&lt;p&gt;Each shard contains a portion of the data (not a full copy). For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Suppose you have a &lt;strong&gt;users table&lt;/strong&gt; with 100 million rows.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Instead of storing all in one DB, you could split:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Shard 1&lt;/strong&gt; → users with IDs 1–25M&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shard 2&lt;/strong&gt; → users with IDs 25M–50M&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shard 3&lt;/strong&gt; → users with IDs 50M–75M&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shard 4&lt;/strong&gt; → users with IDs 75M–100M&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Now each shard only handles a subset, so queries and writes become faster.&lt;/p&gt;

&lt;p&gt;👉 Sharding is commonly used in &lt;strong&gt;very large-scale systems&lt;/strong&gt; (e.g., Facebook, Twitter, YouTube) where one DB server cannot handle all the load.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔹 Similar Concepts in Databases
&lt;/h2&gt;

&lt;p&gt;Sharding is just one of many scaling/distribution techniques. Let’s compare:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Replication&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Copies of the &lt;strong&gt;same database&lt;/strong&gt; are kept across multiple servers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Master → Replica(s)&lt;/strong&gt; model.&lt;/li&gt;
&lt;li&gt;Used for &lt;strong&gt;read scaling&lt;/strong&gt; and &lt;strong&gt;high availability&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Example: MySQL Replication, PostgreSQL Streaming Replication.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Difference from sharding: Replicas have &lt;strong&gt;full copies&lt;/strong&gt;, while shards have &lt;strong&gt;partial data&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. &lt;strong&gt;Partitioning&lt;/strong&gt; (within a single DB)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Data is divided into smaller, manageable &lt;strong&gt;partitions&lt;/strong&gt; inside one database server.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Types:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Horizontal Partitioning&lt;/strong&gt; → rows are split (like sharding, but within one server).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vertical Partitioning&lt;/strong&gt; → columns are split (e.g., frequently accessed columns in one table, large JSON/blob in another).&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Example: MySQL Partitioning, PostgreSQL Table Partitioning.&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;👉 Sharding is basically &lt;strong&gt;horizontal partitioning across multiple servers&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. &lt;strong&gt;Federation / Database Clustering&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Splitting data across &lt;strong&gt;different databases&lt;/strong&gt; logically (like sharding, but sometimes done at the application level).&lt;/li&gt;
&lt;li&gt;Example: SQL Server Federation, Citus for PostgreSQL.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  4. &lt;strong&gt;Connection Pooling&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Not data distribution, but an important concept: reuses DB connections to improve performance under high load.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  5. &lt;strong&gt;Caching&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Store frequently accessed data in &lt;strong&gt;Redis, Memcached&lt;/strong&gt;, etc.&lt;/li&gt;
&lt;li&gt;Helps reduce load on DB (often combined with sharding).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔹 In &lt;strong&gt;MySQL vs PostgreSQL&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;MySQL&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Supports &lt;strong&gt;replication&lt;/strong&gt;, &lt;strong&gt;partitioning&lt;/strong&gt;, and can be sharded via middleware like &lt;strong&gt;Vitess&lt;/strong&gt; (used by YouTube).&lt;/li&gt;
&lt;li&gt;MySQL Cluster (NDB) also provides automatic sharding.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;PostgreSQL&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Native &lt;strong&gt;table partitioning&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Built-in replication.&lt;/li&gt;
&lt;li&gt;Can use extensions like &lt;strong&gt;Citus&lt;/strong&gt; (for distributed PostgreSQL with sharding).&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  this is the tricky part of &lt;strong&gt;sharding&lt;/strong&gt; — how the system decides &lt;strong&gt;which shard to query&lt;/strong&gt;.
&lt;/h2&gt;

&lt;p&gt;There’s no magic — the database (or middleware, or your app) needs a &lt;strong&gt;shard key&lt;/strong&gt; (a rule to determine where a piece of data lives).&lt;/p&gt;




&lt;h2&gt;
  
  
  🔹 How Queries Find the Right Shard
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Shard Key&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;A special column (like &lt;code&gt;user_id&lt;/code&gt;, &lt;code&gt;customer_id&lt;/code&gt;, &lt;code&gt;order_id&lt;/code&gt;, etc.) is chosen.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Example: If &lt;code&gt;user_id = 12345&lt;/code&gt;, then the system applies a rule like:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; shard_number = user_id % 4
&lt;/code&gt;&lt;/pre&gt;


&lt;ul&gt;
&lt;li&gt;If result = 1 → go to Shard 1&lt;/li&gt;
&lt;li&gt;If result = 2 → go to Shard 2, etc.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;This is called &lt;strong&gt;hash-based sharding&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;




&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Shard Mapping (Lookup Table)&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Sometimes, a &lt;strong&gt;mapping table&lt;/strong&gt; (or config service) stores which shard holds which data.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; user_id_range   -&amp;gt; shard
 1 - 25M         -&amp;gt; shard1.db.com
 25M - 50M       -&amp;gt; shard2.db.com
 50M - 75M       -&amp;gt; shard3.db.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When a query comes, the app looks up the mapping table first.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Middleware / Proxy&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Tools like &lt;strong&gt;Vitess (MySQL)&lt;/strong&gt;, &lt;strong&gt;Citus (Postgres)&lt;/strong&gt;, or custom middleware sit between the app and DB.&lt;/li&gt;
&lt;li&gt;They intercept queries, check the shard key, and route to the right shard.&lt;/li&gt;
&lt;li&gt;To your app, it looks like one database.&lt;/li&gt;
&lt;/ul&gt;




&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Broadcast Queries (last resort)&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;If a query &lt;strong&gt;doesn’t include the shard key&lt;/strong&gt; (e.g., “find all users with email = &lt;a href="//mailto:xyz@gmail.com"&gt;xyz@gmail.com&lt;/a&gt;”), the system may need to &lt;strong&gt;query all shards&lt;/strong&gt; and combine results.&lt;/li&gt;
&lt;li&gt;This is &lt;strong&gt;slow&lt;/strong&gt;, which is why choosing the right shard key is critical.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔹 Example: Shard Query Flow
&lt;/h2&gt;

&lt;p&gt;Say you’re storing &lt;strong&gt;users&lt;/strong&gt; across 4 shards:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Shard Rule:&lt;/strong&gt; &lt;code&gt;user_id % 4&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;User with &lt;code&gt;user_id = 1017&lt;/code&gt; logs in.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;user_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1017&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Flow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;App sees &lt;code&gt;user_id = 1017&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Computes → &lt;code&gt;1017 % 4 = 1&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Query goes to &lt;strong&gt;Shard 1&lt;/strong&gt; only.&lt;/li&gt;
&lt;li&gt;Result returned.&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;✅ &lt;strong&gt;Summary:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Queries find the right shard using &lt;strong&gt;shard keys&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Routing is done by either:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;App logic&lt;/li&gt;
&lt;li&gt;Middleware/proxy&lt;/li&gt;
&lt;li&gt;Lookup table&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;If no shard key → either &lt;strong&gt;broadcast query&lt;/strong&gt; or &lt;strong&gt;centralized index&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;Quick Recap:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Replication&lt;/strong&gt; → copies of same data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sharding&lt;/strong&gt; → split data into subsets across servers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Partitioning&lt;/strong&gt; → split data inside a single DB.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clustering / Federation&lt;/strong&gt; → multiple databases acting as one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Caching&lt;/strong&gt; → reduce DB load.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>database</category>
      <category>webdev</category>
      <category>backend</category>
      <category>programming</category>
    </item>
    <item>
      <title>Understanding Reverse Proxy, Jump Servers, Application Servers, and Database Servers</title>
      <dc:creator>Ahmed Raza Idrisi</dc:creator>
      <pubDate>Wed, 17 Sep 2025 13:56:43 +0000</pubDate>
      <link>https://forem.com/ahmedraza_fyntune/understanding-reverse-proxy-jump-servers-application-servers-and-database-servers-5cm9</link>
      <guid>https://forem.com/ahmedraza_fyntune/understanding-reverse-proxy-jump-servers-application-servers-and-database-servers-5cm9</guid>
      <description>&lt;h2&gt;
  
  
  🔹 Reverse Proxy
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;reverse proxy&lt;/strong&gt; is a server that sits &lt;strong&gt;between the client (browser) and your application servers&lt;/strong&gt;.&lt;br&gt;
Instead of clients hitting your Laravel/PHP application directly, they talk to the reverse proxy, which then forwards (proxies) the request to the right backend server.&lt;/p&gt;
&lt;h3&gt;
  
  
  Example:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You configure ** Nginx ** or ** HAProxy ** as a reverse proxy.&lt;/li&gt;
&lt;li&gt;Requests from users go first to Nginx → Nginx decides where to forward the request → Laravel app (PHP-FPM).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Why it’s required:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Load balancing&lt;/strong&gt; – distribute traffic among multiple Laravel servers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security&lt;/strong&gt; – hide your actual app servers’ IPs from the public.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SSL termination&lt;/strong&gt; – proxy handles HTTPS (SSL) and forwards plain HTTP to app server.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Caching / Rate Limiting&lt;/strong&gt; – can cache responses or block abuse before reaching Laravel.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;👉 In PHP/Laravel context:&lt;br&gt;
Your Laravel app runs on &lt;strong&gt;PHP-FPM&lt;/strong&gt; (or Apache). Instead of exposing it directly, you put &lt;strong&gt;Nginx as reverse proxy&lt;/strong&gt;.&lt;br&gt;
User → Nginx (reverse proxy) → Laravel (application server).&lt;/p&gt;


&lt;h2&gt;
  
  
  🔹 Jump Server (or Bastion Host)
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;jump server&lt;/strong&gt; is a &lt;strong&gt;secure intermediate server&lt;/strong&gt; used by administrators/devs to connect to internal servers (like app servers or DB servers) that are not exposed to the internet.&lt;/p&gt;
&lt;h3&gt;
  
  
  Why it’s required:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Security&lt;/strong&gt; – only one exposed entry point (the jump server), rest of servers are private.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audit &amp;amp; Logging&lt;/strong&gt; – all admin SSH connections go through the jump server (easy to monitor).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Network segmentation&lt;/strong&gt; – app and DB servers stay in private subnet.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;👉 In PHP/Laravel context:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You don’t directly SSH into the Laravel application server or database server.&lt;/li&gt;
&lt;li&gt;You SSH into the &lt;strong&gt;jump server&lt;/strong&gt; first → then from there, connect to internal servers.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  🔹 Application Server
&lt;/h2&gt;

&lt;p&gt;This is the server that &lt;strong&gt;runs your business logic / application code&lt;/strong&gt;.&lt;br&gt;
For Laravel:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Runs &lt;strong&gt;PHP-FPM&lt;/strong&gt; or Apache/Nginx + PHP.&lt;/li&gt;
&lt;li&gt;Executes Laravel code (routes, controllers, services).&lt;/li&gt;
&lt;li&gt;Talks to database server for data.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;AWS EC2 or DigitalOcean droplet running Laravel app.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  🔹 Database Server
&lt;/h2&gt;

&lt;p&gt;This is the server that &lt;strong&gt;stores and manages your data&lt;/strong&gt;.&lt;br&gt;
For Laravel:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MySQL / PostgreSQL / MongoDB, etc.&lt;/li&gt;
&lt;li&gt;Application server connects to DB server over the private network.&lt;/li&gt;
&lt;li&gt;DB server usually is &lt;strong&gt;not exposed to the internet&lt;/strong&gt;, only accessible by application servers.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  🔹 Putting It All Together (Laravel Deployment Architecture)
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[ Client Browser ]
        |
        v
 [ Reverse Proxy (Nginx/HAProxy/Cloudflare) ]
        |
        v
 [ Application Server (Laravel + PHP-FPM) ]
        |
        v
 [ Database Server (MySQL/Postgres) ]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;And for &lt;strong&gt;Admin/Dev access&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[ Developer Laptop ]
        |
        v
 [ Jump Server (Bastion Host) ]
        |
        v
 [ Application Server / Database Server ]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;✅ &lt;strong&gt;In short:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Reverse Proxy&lt;/strong&gt; → handles traffic, security, scaling.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Jump Server&lt;/strong&gt; → secure entry point for admins.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Application Server&lt;/strong&gt; → runs Laravel/PHP code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database Server&lt;/strong&gt; → stores data for the Laravel app.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>backend</category>
      <category>programming</category>
      <category>devops</category>
    </item>
    <item>
      <title>php bottlenecks and performance</title>
      <dc:creator>Ahmed Raza Idrisi</dc:creator>
      <pubDate>Mon, 15 Sep 2025 19:05:46 +0000</pubDate>
      <link>https://forem.com/ahmedraza_fyntune/php-bottlenecks-and-performance-3aoj</link>
      <guid>https://forem.com/ahmedraza_fyntune/php-bottlenecks-and-performance-3aoj</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;PHP Performance Bottlenecks + Concepts&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🔹 Common PHP Performance Bottlenecks
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Loops&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Heavy nested loops (&lt;code&gt;for&lt;/code&gt; inside &lt;code&gt;foreach&lt;/code&gt;) slow execution.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;$i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;100000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="c1"&gt;// expensive operation here&lt;/span&gt;
 &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ Solution: Minimize work inside loops, break early if possible, use built-in functions (&lt;code&gt;array_map&lt;/code&gt;, &lt;code&gt;array_filter&lt;/code&gt;) when efficient.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Excessive Database Queries (N+1 problem)&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt; &lt;span class="nv"&gt;$users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
 &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$users&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;posts&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nb"&gt;count&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// runs query every time ❌&lt;/span&gt;
 &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ Solution: Use &lt;strong&gt;eager loading&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="nv"&gt;$users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;with&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'posts'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;I/O Bottlenecks&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;File read/write in large loops&lt;/li&gt;
&lt;li&gt;Slow external API calls
 ✅ Solution: Caching (Redis, Memcached), batch I/O, async workers (queues).&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🔹 Opcode Caches (Opcache)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;PHP is an interpreted language. Normally:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Every request = parse → compile → execute.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;Opcache&lt;/strong&gt; stores compiled bytecode in memory → saves compilation time.&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;✅ Enable in &lt;code&gt;php.ini&lt;/code&gt;:&lt;br&gt;&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;  &lt;span class="py"&gt;opcache.enable&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;
  &lt;span class="py"&gt;opcache.memory_consumption&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;128&lt;/span&gt;
  &lt;span class="py"&gt;opcache.max_accelerated_files&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;10000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Benefit: Faster response, less CPU load.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🔹 Password Hashing Best Practices
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Never store plain text or MD5/SHA1 (too weak).&lt;/li&gt;
&lt;li&gt;Use PHP’s built-in:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;  &lt;span class="nv"&gt;$hash&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;password_hash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"mypassword"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;PASSWORD_DEFAULT&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// bcrypt/argon2&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;password_verify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"mypassword"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$hash&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Password correct!"&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;ul&gt;
&lt;li&gt;✅ &lt;code&gt;password_hash&lt;/code&gt; automatically salts and uses strong algorithms.&lt;/li&gt;
&lt;li&gt;✅ &lt;code&gt;password_verify&lt;/code&gt; safely compares.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Hands-On Benchmarking&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;📌 Example: Compare &lt;code&gt;for&lt;/code&gt; loop vs &lt;code&gt;foreach&lt;/code&gt; for arrays.&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="nv"&gt;$array&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1000000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Benchmark foreach&lt;/span&gt;
&lt;span class="nv"&gt;$start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;microtime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$sum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$array&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nv"&gt;$num&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$sum&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nv"&gt;$num&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Foreach: "&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;microtime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nv"&gt;$start&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s2"&gt;" seconds&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Benchmark for&lt;/span&gt;
&lt;span class="nv"&gt;$start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;microtime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$sum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;$i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nb"&gt;count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$array&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$sum&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nv"&gt;$array&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"For: "&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;microtime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nv"&gt;$start&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s2"&gt;" seconds&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 You’ll see that &lt;code&gt;foreach&lt;/code&gt; is generally faster for arrays.&lt;br&gt;
👉 &lt;code&gt;for&lt;/code&gt; with &lt;code&gt;count($array)&lt;/code&gt; inside loop is slow → store count in variable instead.&lt;/p&gt;



&lt;p&gt;📌 Example: Password Hashing&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="nv"&gt;$password&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"supersecret"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Hashing&lt;/span&gt;
&lt;span class="nv"&gt;$hash&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;password_hash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$password&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;PASSWORD_DEFAULT&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Hash: &lt;/span&gt;&lt;span class="nv"&gt;$hash&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Verify&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;password_verify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"supersecret"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$hash&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Login success!&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Invalid password&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&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;h2&gt;
  
  
  &lt;strong&gt;Interview Prep Review&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Common PHP Interview Questions (from Week 1 topics)
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;What’s new in PHP 8?&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;JIT, Match expressions, Attributes, Nullsafe operator, Named arguments, Constructor property promotion.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Explain the difference between &lt;code&gt;==&lt;/code&gt; and &lt;code&gt;===&lt;/code&gt;.&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;==&lt;/code&gt; compares values (type juggling).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;===&lt;/code&gt; compares value and type (strict).&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;How does &lt;code&gt;password_hash&lt;/code&gt; differ from &lt;code&gt;md5&lt;/code&gt; or &lt;code&gt;sha1&lt;/code&gt;?&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;password_hash&lt;/code&gt; is adaptive, salted, secure.&lt;/li&gt;
&lt;li&gt;MD5/SHA1 are fast → vulnerable to brute force.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;What is a PHP Trait?&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Mechanism for code reuse, allows grouping methods to include in multiple classes without inheritance.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;What are Generators (&lt;code&gt;yield&lt;/code&gt;)?&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Functions that return values one at a time without storing the whole dataset in memory → efficient for large data.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Explain SRP (Single Responsibility Principle).&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;A class should have only one reason to change. Helps with maintainability.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;What’s the difference between &lt;code&gt;git merge&lt;/code&gt; and &lt;code&gt;git rebase&lt;/code&gt;?&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Merge: keeps history with branches.&lt;/li&gt;
&lt;li&gt;Rebase: rewrites history, keeps linear commit log.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;✅ By the end of this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You’ll &lt;strong&gt;spot bottlenecks&lt;/strong&gt; in PHP.&lt;/li&gt;
&lt;li&gt;You’ll &lt;strong&gt;benchmark performance&lt;/strong&gt; with &lt;code&gt;microtime(true)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;You’ll be confident answering &lt;strong&gt;interview-style questions aloud&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>laravel</category>
      <category>webdev</category>
      <category>programming</category>
      <category>php</category>
    </item>
    <item>
      <title>Caching in Laravel &amp; PHP</title>
      <dc:creator>Ahmed Raza Idrisi</dc:creator>
      <pubDate>Fri, 05 Sep 2025 14:01:30 +0000</pubDate>
      <link>https://forem.com/ahmedraza_fyntune/caching-in-laravel-php-e3g</link>
      <guid>https://forem.com/ahmedraza_fyntune/caching-in-laravel-php-e3g</guid>
      <description>&lt;p&gt;Great question 👍 Let’s cover &lt;strong&gt;caching in PHP&lt;/strong&gt; (raw) and then how Laravel makes it &lt;strong&gt;much easier and powerful&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 1. What is Caching?
&lt;/h2&gt;

&lt;p&gt;Caching means &lt;strong&gt;storing data temporarily&lt;/strong&gt; so you don’t need to &lt;strong&gt;recalculate or refetch&lt;/strong&gt; it every time.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Speeds up performance 🚀&lt;/li&gt;
&lt;li&gt;Reduces database/API load&lt;/li&gt;
&lt;li&gt;Stores in &lt;strong&gt;memory (Redis/Memcached)&lt;/strong&gt; or &lt;strong&gt;files&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🐘 2. Caching in Plain PHP
&lt;/h2&gt;

&lt;p&gt;In raw PHP, you don’t have a built-in cache system like Laravel, but you can implement simple ones.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example 1: File-based Cache
&lt;/h3&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="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;getCache&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;__DIR__&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s2"&gt;"/cache/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$key&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.txt"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;file_exists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nb"&gt;filemtime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// valid cache for 60 sec&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;file_get_contents&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$file&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;setCache&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;__DIR__&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s2"&gt;"/cache/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$key&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.txt"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nb"&gt;file_put_contents&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Example: Caching API result&lt;/span&gt;
&lt;span class="nv"&gt;$data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getCache&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"users"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Fetching fresh data...&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;$data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;json_encode&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s2"&gt;"Ahmed"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Ali"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Sara"&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="nf"&gt;setCache&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"users"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Using cache...&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ First time → fetches fresh data&lt;br&gt;
✅ Next times (within 60 sec) → returns cache&lt;/p&gt;


&lt;h3&gt;
  
  
  Example 2: Memory Caching with APCu (if installed)
&lt;/h3&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;apcu_store&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Ahmed'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// store 60 sec&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nb"&gt;apcu_fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Ahmed&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🎯 3. Caching in Laravel (Much Easier!)
&lt;/h2&gt;

&lt;p&gt;Laravel comes with a &lt;strong&gt;powerful cache system&lt;/strong&gt; out of the box.&lt;br&gt;
Supported drivers: &lt;code&gt;file&lt;/code&gt;, &lt;code&gt;database&lt;/code&gt;, &lt;code&gt;array&lt;/code&gt;, &lt;code&gt;redis&lt;/code&gt;, &lt;code&gt;memcached&lt;/code&gt;.&lt;br&gt;
Default in &lt;code&gt;.env&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CACHE_DRIVER=file
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔹 Basic Cache Usage
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Illuminate\Support\Facades\Cache&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Store&lt;/span&gt;
&lt;span class="nc"&gt;Cache&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Ahmed'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 60 seconds&lt;/span&gt;

&lt;span class="c1"&gt;// Retrieve&lt;/span&gt;
&lt;span class="nv"&gt;$name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Cache&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Ahmed&lt;/span&gt;

&lt;span class="c1"&gt;// Retrieve with default&lt;/span&gt;
&lt;span class="nv"&gt;$name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Cache&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'username'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Guest'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Check&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Cache&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;has&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Cache exists!"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Delete&lt;/span&gt;
&lt;span class="nc"&gt;Cache&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;forget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔹 Remember Pattern
&lt;/h2&gt;

&lt;p&gt;Very common in Laravel:&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="nv"&gt;$users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Cache&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;remember&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'users'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;DB&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'users'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get&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;➡️ First time → runs the DB query, caches it for 60 sec&lt;br&gt;
➡️ Next time → pulls from cache directly&lt;/p&gt;


&lt;h2&gt;
  
  
  🔹 Forever Cache
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nc"&gt;Cache&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;forever&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'site_settings'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'theme'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'dark'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Remove it:&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="nc"&gt;Cache&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;forget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'site_settings'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ⚡ 4. Real-World Example: API Caching
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;getWeather&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Cache&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;remember&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'weather_data'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;600&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Http&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'https://api.weatherapi.com/v1/current.json?key=API_KEY&amp;amp;q=London'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&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;✅ Saves API response for 10 minutes.&lt;br&gt;
✅ Avoids calling external API every time.&lt;/p&gt;


&lt;h2&gt;
  
  
  🔔 5. Best Practices
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;strong&gt;Redis&lt;/strong&gt; for high-performance caching in production.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;remember&lt;/code&gt; or &lt;code&gt;rememberForever&lt;/code&gt; instead of manually managing put/get.&lt;/li&gt;
&lt;li&gt;Clear cache safely:
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  php artisan cache:clear
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;For &lt;strong&gt;config caching&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  php artisan config:cache
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;p&gt;✅ &lt;strong&gt;In short&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In &lt;strong&gt;PHP&lt;/strong&gt;, you can use files or APCu for caching.&lt;/li&gt;
&lt;li&gt;In &lt;strong&gt;Laravel&lt;/strong&gt;, use &lt;code&gt;Cache&lt;/code&gt; facade → simple and powerful (DB, Redis, Memcached, File).&lt;/li&gt;
&lt;li&gt;Perfect for speeding up &lt;strong&gt;DB queries, API calls, or expensive calculations&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;Perfect 👌 Redis is one of the &lt;strong&gt;fastest ways to do caching&lt;/strong&gt; in Laravel (and plain PHP too). Let’s break it down with &lt;strong&gt;easy examples&lt;/strong&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  🔥 1. What is Redis?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;An &lt;strong&gt;in-memory data store&lt;/strong&gt; (everything is in RAM → super fast ⚡).&lt;/li&gt;
&lt;li&gt;Supports &lt;strong&gt;strings, lists, sets, hashes&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Used for &lt;strong&gt;caching, sessions, queues, pub/sub messaging&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  🐘 2. Redis in Plain PHP
&lt;/h2&gt;

&lt;p&gt;To use Redis in PHP, you install the &lt;strong&gt;phpredis&lt;/strong&gt; extension or use &lt;strong&gt;Predis (PHP client)&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  Example (Predis):
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'vendor/autoload.php'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nv"&gt;$redis&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Predis\Client&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// Store in cache&lt;/span&gt;
&lt;span class="nv"&gt;$redis&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Ahmed"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// store for 60 sec&lt;/span&gt;

&lt;span class="c1"&gt;// Get from cache&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$redis&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Ahmed&lt;/span&gt;

&lt;span class="c1"&gt;// Delete&lt;/span&gt;
&lt;span class="nv"&gt;$redis&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;del&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;✅ Works just like a key-value store.&lt;br&gt;
✅ But Laravel makes it even easier.&lt;/p&gt;


&lt;h2&gt;
  
  
  🎯 3. Redis in Laravel
&lt;/h2&gt;
&lt;h2&gt;
  
  
  🔹 Step 1: Install Redis
&lt;/h2&gt;

&lt;p&gt;Make sure Redis is installed on your system and running:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;redis-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Install PHP extension (if needed):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;composer require predis/predis
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔹 Step 2: Configure in &lt;code&gt;.env&lt;/code&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CACHE_DRIVER=redis
QUEUE_CONNECTION=redis
SESSION_DRIVER=redis
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔹 Step 3: Use Redis via Cache Facade
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Illuminate\Support\Facades\Cache&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Store data&lt;/span&gt;
&lt;span class="nc"&gt;Cache&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'username'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Ahmed'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 60 sec&lt;/span&gt;

&lt;span class="c1"&gt;// Get data&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nc"&gt;Cache&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'username'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Ahmed&lt;/span&gt;

&lt;span class="c1"&gt;// Remember (common use case)&lt;/span&gt;
&lt;span class="nv"&gt;$users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Cache&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;remember&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'users'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;DB&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'users'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Forget&lt;/span&gt;
&lt;span class="nc"&gt;Cache&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;forget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'username'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Now instead of storing in files, Laravel stores in &lt;strong&gt;Redis memory&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  📊 4. Example: Cache Heavy Query with Redis
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nc"&gt;Route&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/top-users'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Cache&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;remember&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'top_users'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;600&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;DB&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'users'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;orderBy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'points'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'desc'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$users&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;➡️ First call → hits DB, stores in Redis.&lt;br&gt;
➡️ Next calls (10 min) → served instantly from Redis.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔔 5. Example: Cache API Response with Redis
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;getWeather&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Cache&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;remember&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'weather_london'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;900&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Http&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'https://api.weatherapi.com/v1/current.json?key=API_KEY&amp;amp;q=London'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&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;✅ The &lt;strong&gt;API response&lt;/strong&gt; is cached in Redis for 15 min.&lt;br&gt;
✅ No need to re-hit the external API.&lt;/p&gt;




&lt;h2&gt;
  
  
  🛠️ 6. Using Redis Facade Directly (Low-level)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Illuminate\Support\Facades\Redis&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Store&lt;/span&gt;
&lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'site_name'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'My Laravel App'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Get&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'site_name'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Increment counter&lt;/span&gt;
&lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;incr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'visits'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Lists&lt;/span&gt;
&lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;rpush&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'queue'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'task1'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;rpush&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'queue'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'task2'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;lpop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'queue'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// task1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ✅ In Summary
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Plain PHP&lt;/strong&gt; → use &lt;code&gt;Predis&lt;/code&gt; or &lt;code&gt;phpredis&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Laravel&lt;/strong&gt; → just set &lt;code&gt;CACHE_DRIVER=redis&lt;/code&gt; and use &lt;code&gt;Cache&lt;/code&gt; or &lt;code&gt;Redis&lt;/code&gt; facade.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Best for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Heavy DB queries&lt;/li&gt;
&lt;li&gt;API results&lt;/li&gt;
&lt;li&gt;Session &amp;amp; authentication data&lt;/li&gt;
&lt;li&gt;Queues&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




</description>
      <category>webdev</category>
      <category>programming</category>
      <category>php</category>
      <category>laravel</category>
    </item>
    <item>
      <title>PHP GC for FIles</title>
      <dc:creator>Ahmed Raza Idrisi</dc:creator>
      <pubDate>Fri, 05 Sep 2025 13:35:22 +0000</pubDate>
      <link>https://forem.com/ahmedraza_fyntune/php-gc-for-files-371m</link>
      <guid>https://forem.com/ahmedraza_fyntune/php-gc-for-files-371m</guid>
      <description>&lt;p&gt;Let’s go &lt;strong&gt;step by step&lt;/strong&gt; and see how &lt;strong&gt;PHP Garbage Collection &amp;amp; Memory Management&lt;/strong&gt; behave when using &lt;strong&gt;classes, methods, and heavy tasks&lt;/strong&gt; like &lt;strong&gt;PDF/Excel generation&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🏗️ 1. Classes &amp;amp; Methods
&lt;/h2&gt;

&lt;p&gt;When you use classes and objects in PHP:&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="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nv"&gt;$name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__construct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;createUser&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Ahmed"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;// &amp;lt;- $user goes out of scope here, memory freed&lt;/span&gt;

&lt;span class="nf"&gt;createUser&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="cp"&gt;?&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ After the function ends, &lt;code&gt;$user&lt;/code&gt; is destroyed and memory is released.&lt;br&gt;
❌ But if there’s a &lt;strong&gt;circular reference&lt;/strong&gt; inside objects, GC kicks in.&lt;/p&gt;


&lt;h2&gt;
  
  
  🌀 2. Circular References in Classes
&lt;/h2&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="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;A&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nv"&gt;$ref&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;B&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nv"&gt;$ref&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nv"&gt;$a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;A&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nv"&gt;$b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;B&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nv"&gt;$a&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;ref&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$b&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;ref&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$a&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// &amp;lt;- circular reference&lt;/span&gt;

&lt;span class="k"&gt;unset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$b&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// memory NOT immediately freed&lt;/span&gt;
&lt;span class="nb"&gt;gc_collect_cycles&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// manually free cycles&lt;/span&gt;
&lt;span class="cp"&gt;?&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;➡️ Without GC, long-running scripts (like workers) would slowly eat up RAM.&lt;/p&gt;


&lt;h2&gt;
  
  
  📄 3. PDF Generation Example (Memory Heavy)
&lt;/h2&gt;

&lt;p&gt;Suppose you’re using &lt;strong&gt;dompdf&lt;/strong&gt; or &lt;strong&gt;TCPDF&lt;/strong&gt; in Laravel/PHP.&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="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Dompdf\Dompdf&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;generatePDF&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$dompdf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Dompdf&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nv"&gt;$dompdf&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;loadHtml&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;h1&amp;gt;Hello &lt;/span&gt;&lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/h1&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$dompdf&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nv"&gt;$pdf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$dompdf&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;output&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="nb"&gt;file_put_contents&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"output.pdf"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$pdf&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Free memory explicitly&lt;/span&gt;
    &lt;span class="k"&gt;unset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$dompdf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$pdf&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nb"&gt;gc_collect_cycles&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// cleanup&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;generatePDF&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Ahmed"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="cp"&gt;?&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;⚠️ &lt;strong&gt;Problem&lt;/strong&gt;: If you generate thousands of PDFs in a queue job &lt;strong&gt;without cleanup&lt;/strong&gt;, memory keeps rising.&lt;br&gt;
✅ &lt;strong&gt;Solution&lt;/strong&gt;: &lt;code&gt;unset()&lt;/code&gt; variables, call &lt;code&gt;gc_collect_cycles()&lt;/code&gt; occasionally.&lt;/p&gt;


&lt;h2&gt;
  
  
  📊 4. Excel Generation Example (Maatwebsite / PhpSpreadsheet)
&lt;/h2&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="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;PhpOffice\PhpSpreadsheet\Spreadsheet&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;PhpOffice\PhpSpreadsheet\Writer\Xlsx&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;generateExcel&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$spreadsheet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Spreadsheet&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nv"&gt;$sheet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$spreadsheet&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getActiveSheet&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nv"&gt;$sheet&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setCellValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'A1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Hello Ahmed'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nv"&gt;$writer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Xlsx&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$spreadsheet&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$writer&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'output.xlsx'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Free memory&lt;/span&gt;
    &lt;span class="nv"&gt;$spreadsheet&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;disconnectWorksheets&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;unset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$spreadsheet&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$writer&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nb"&gt;gc_collect_cycles&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;generateExcel&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="cp"&gt;?&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;⚠️ If you create 100,000+ rows without cleaning up, memory will spike (hundreds of MBs).&lt;br&gt;
✅ Best practice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;strong&gt;chunked writes&lt;/strong&gt; (write in batches instead of loading everything in memory).&lt;/li&gt;
&lt;li&gt;Always &lt;code&gt;unset()&lt;/code&gt; objects and call &lt;code&gt;gc_collect_cycles()&lt;/code&gt; in long-running scripts.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  🚀 5. Real-World Tips (Laravel Jobs / Workers)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;For &lt;strong&gt;short web requests&lt;/strong&gt;: memory is freed at the end of the request anyway.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;For &lt;strong&gt;long-running jobs&lt;/strong&gt; (queues, daemons, APIs that loop over big datasets):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Always &lt;code&gt;unset()&lt;/code&gt; large objects after use.&lt;/li&gt;
&lt;li&gt;Call &lt;code&gt;gc_collect_cycles()&lt;/code&gt; every few iterations.&lt;/li&gt;
&lt;li&gt;For Excel, prefer &lt;code&gt;-&amp;gt;store()&lt;/code&gt; with &lt;strong&gt;queue exports&lt;/strong&gt; (Maatwebsite handles memory better).&lt;/li&gt;
&lt;li&gt;For PDF, generate and store in chunks instead of bulk in one go.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;Let’s clear the confusion — &lt;strong&gt;why do we need to &lt;code&gt;unset()&lt;/code&gt; and call &lt;code&gt;gc_collect_cycles()&lt;/code&gt; in PDF (or Excel) generation, even though variables go out of scope?&lt;/strong&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  🧠 1. Normal Case – Variables Go Out of Scope
&lt;/h2&gt;

&lt;p&gt;In a &lt;strong&gt;short script&lt;/strong&gt; or a &lt;strong&gt;web request&lt;/strong&gt;, PHP automatically:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Destroys variables when they go out of scope&lt;/li&gt;
&lt;li&gt;Frees memory when the request ends&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example:&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="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;test&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"hello"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// allocated&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;// &amp;lt;- function ends, $a destroyed, memory freed&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;➡️ Nothing special needed.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧾 2. Why PDF/Excel is Different
&lt;/h2&gt;

&lt;p&gt;Libraries like &lt;strong&gt;Dompdf&lt;/strong&gt;, &lt;strong&gt;TCPDF&lt;/strong&gt;, &lt;strong&gt;PhpSpreadsheet&lt;/strong&gt; are &lt;strong&gt;heavy&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;They create &lt;strong&gt;big objects in memory&lt;/strong&gt; (fonts, images, large buffers, XML tree for Excel, etc.)&lt;/li&gt;
&lt;li&gt;Some of these objects reference each other (&lt;strong&gt;circular references&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;PHP’s normal “out of scope” cleanup can’t immediately free all memory because &lt;strong&gt;circular references stay alive until GC runs&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So, if you’re generating &lt;strong&gt;1 PDF&lt;/strong&gt; in a request, it doesn’t matter — memory is freed at request end.&lt;br&gt;
But if you’re generating &lt;strong&gt;100 PDFs in a loop (long-running worker)&lt;/strong&gt;, memory keeps growing until GC decides to run.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔄 3. Example: PDF Without Explicit Cleanup
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Dompdf\Dompdf&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;$i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$dompdf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Dompdf&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nv"&gt;$dompdf&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;loadHtml&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;h1&amp;gt;PDF &lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/h1&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$dompdf&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nb"&gt;file_put_contents&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"pdf_&lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="s2"&gt;.pdf"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$dompdf&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;output&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

    &lt;span class="c1"&gt;// no unset or GC&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;⚠️ Problem: Memory grows with each loop because internal buffers &amp;amp; objects remain in circular references.&lt;br&gt;
Eventually → script &lt;strong&gt;crashes with Out of Memory error&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ 4. With Explicit Cleanup
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Dompdf\Dompdf&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;$i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$dompdf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Dompdf&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nv"&gt;$dompdf&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;loadHtml&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;h1&amp;gt;PDF &lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/h1&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$dompdf&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nb"&gt;file_put_contents&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"pdf_&lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="s2"&gt;.pdf"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$dompdf&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;output&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

    &lt;span class="c1"&gt;// Cleanup&lt;/span&gt;
    &lt;span class="k"&gt;unset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$dompdf&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nb"&gt;gc_collect_cycles&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// force GC to break cycles&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✔️ Memory stays stable, script runs fine.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚡ 5. Key Difference
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Short script/web request&lt;/strong&gt; → memory is freed when request ends (no worries).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Long-running jobs&lt;/strong&gt; (queue workers, daemons, batch processing) → memory &lt;strong&gt;accumulates&lt;/strong&gt; unless you explicitly free heavy objects.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📝 Rule of Thumb
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;For &lt;strong&gt;normal requests&lt;/strong&gt;: don’t bother, PHP cleans up.&lt;/li&gt;
&lt;li&gt;For &lt;strong&gt;batch jobs / loops / workers&lt;/strong&gt;: always &lt;code&gt;unset()&lt;/code&gt; heavy objects and occasionally call &lt;code&gt;gc_collect_cycles()&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;👉 That’s why for &lt;strong&gt;PDF/Excel generation in bulk&lt;/strong&gt;, we explicitly free memory — not because PHP won’t free it at all, but because &lt;strong&gt;waiting until the script ends is too late&lt;/strong&gt; for long-running processes.&lt;/p&gt;




&lt;p&gt;✅ &lt;strong&gt;In summary:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Classes &amp;amp; methods free memory normally.&lt;/li&gt;
&lt;li&gt;Garbage Collection is important when objects reference each other (circular refs).&lt;/li&gt;
&lt;li&gt;For &lt;strong&gt;PDF/Excel generation&lt;/strong&gt;, explicitly free memory (&lt;code&gt;unset&lt;/code&gt;, &lt;code&gt;disconnectWorksheets&lt;/code&gt;, &lt;code&gt;gc_collect_cycles&lt;/code&gt;) to prevent leaks.&lt;/li&gt;
&lt;li&gt;In &lt;strong&gt;queues/long-running jobs&lt;/strong&gt;, this is critical to avoid servers crashing from memory bloat.&lt;/li&gt;
&lt;/ul&gt;




</description>
      <category>webdev</category>
      <category>programming</category>
      <category>php</category>
      <category>laravel</category>
    </item>
  </channel>
</rss>
