<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>PHP OSS for Azure Blog</title>
        <link>https://php-oss-for-azure.github.io/blog</link>
        <description>PHP OSS for Azure Blog</description>
        <lastBuildDate>Tue, 30 Jun 2026 15:40:24 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[What to Use After microsoft/azure-storage-file]]></title>
            <link>https://php-oss-for-azure.github.io/blog/azure-file-share-after-microsoft-azure-storage-file</link>
            <guid>https://php-oss-for-azure.github.io/blog/azure-file-share-after-microsoft-azure-storage-file</guid>
            <pubDate>Tue, 30 Jun 2026 15:40:24 GMT</pubDate>
            <description><![CDATA[How to choose between azure-oss/storage-file-share and a mounted Azure File Share.]]></description>
            <content:encoded><![CDATA[<p>The honest answer to "What should I use after <code>microsoft/azure-storage-file</code>?" is not a tidy one-liner.</p>
<p>Sometimes the right answer is <code>azure-oss/storage-file-share</code>.</p>
<p>Sometimes the right answer is not a PHP SDK at all.</p>
<p>And that honesty is exactly what good migration advice should sound like here.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="blob-and-queue-are-replacements-file-share-is-a-choice">Blob and Queue are replacements. File Share is a choice.<a href="https://php-oss-for-azure.github.io/blog/azure-file-share-after-microsoft-azure-storage-file#blob-and-queue-are-replacements-file-share-is-a-choice" class="hash-link" aria-label="Direct link to Blob and Queue are replacements. File Share is a choice." title="Direct link to Blob and Queue are replacements. File Share is a choice." translate="no">​</a></h2>
<p>With Blob and Queue, the story is fairly direct: old package out, new package in.</p>
<p>Azure Files is different because a lot of applications do not actually want a service SDK. They want a normal filesystem they can mount, read, write, and move through familiar I/O operations.</p>
<p>That means the first migration question is not "Which package replaces this package?"</p>
<p>It is "What problem is the app really solving?"</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="choose-azure-ossstorage-file-share-when-you-need-azure-files-semantics">Choose <code>azure-oss/storage-file-share</code> when you need Azure Files semantics<a href="https://php-oss-for-azure.github.io/blog/azure-file-share-after-microsoft-azure-storage-file#choose-azure-ossstorage-file-share-when-you-need-azure-files-semantics" class="hash-link" aria-label="Direct link to choose-azure-ossstorage-file-share-when-you-need-azure-files-semantics" title="Direct link to choose-azure-ossstorage-file-share-when-you-need-azure-files-semantics" translate="no">​</a></h2>
<p>The package is a strong fit when your app needs Azure-aware service behavior, especially around:</p>
<ul>
<li class="">share access</li>
<li class="">directory and file client navigation</li>
<li class="">SAS generation</li>
<li class="">Azure Files-specific access patterns</li>
</ul>
<p>If that is your use case, the package gives you a modern baseline and a much healthier long-term direction than staying on the retired Microsoft SDK.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="choose-a-mounted-share-when-you-really-want-a-filesystem">Choose a mounted share when you really want a filesystem<a href="https://php-oss-for-azure.github.io/blog/azure-file-share-after-microsoft-azure-storage-file#choose-a-mounted-share-when-you-really-want-a-filesystem" class="hash-link" aria-label="Direct link to Choose a mounted share when you really want a filesystem" title="Direct link to Choose a mounted share when you really want a filesystem" translate="no">​</a></h2>
<p>If your application mostly wants to:</p>
<ul>
<li class="">open and write files like local storage</li>
<li class="">move paths around</li>
<li class="">let existing file APIs do the work</li>
<li class="">treat Azure Files as infrastructure rather than business logic</li>
</ul>
<p>then an SMB or NFS mount is often the more natural design.</p>
<p>That may feel less exciting than a library migration. It is often more correct.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-this-kind-of-guidance-matters">Why this kind of guidance matters<a href="https://php-oss-for-azure.github.io/blog/azure-file-share-after-microsoft-azure-storage-file#why-this-kind-of-guidance-matters" class="hash-link" aria-label="Direct link to Why this kind of guidance matters" title="Direct link to Why this kind of guidance matters" translate="no">​</a></h2>
<p>Teams remember when documentation helps them avoid the wrong abstraction.</p>
<p>If you oversell File Share as a drop-in SDK replacement for every legacy workload, people will discover the gaps the hard way. If you help them choose the right path up front, they are far more likely to trust the rest of the ecosystem.</p>
<p>That trust is worth more than a smoother headline.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="where-to-go-next">Where to go next<a href="https://php-oss-for-azure.github.io/blog/azure-file-share-after-microsoft-azure-storage-file#where-to-go-next" class="hash-link" aria-label="Direct link to Where to go next" title="Direct link to Where to go next" translate="no">​</a></h2>
<p>If you are evaluating the SDK path seriously, start with <a class="" href="https://php-oss-for-azure.github.io/storage-file-share/migrate-from-microsoft-azure-storage-file">Migrate from microsoft/azure-storage-file</a>.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[The Modern Laravel Blob Stack After matthewbdaly/laravel-azure-storage]]></title>
            <link>https://php-oss-for-azure.github.io/blog/laravel-azure-blob-storage-after-matthewbdaly-laravel-azure-storage</link>
            <guid>https://php-oss-for-azure.github.io/blog/laravel-azure-blob-storage-after-matthewbdaly-laravel-azure-storage</guid>
            <pubDate>Tue, 30 Jun 2026 15:40:24 GMT</pubDate>
            <description><![CDATA[What Laravel teams should use for Azure Blob Storage now, and why the upgrade is bigger than a disk config rename.]]></description>
            <content:encoded><![CDATA[<p>If your Laravel app still uses <code>matthewbdaly/laravel-azure-storage</code>, the replacement package is <code>azure-oss/storage-blob-laravel</code>.</p>
<p>That is the practical answer.</p>
<p>The more interesting answer is why the move feels bigger than a disk-driver swap.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="your-old-disk-is-sitting-on-an-old-stack">Your old disk is sitting on an old stack<a href="https://php-oss-for-azure.github.io/blog/laravel-azure-blob-storage-after-matthewbdaly-laravel-azure-storage#your-old-disk-is-sitting-on-an-old-stack" class="hash-link" aria-label="Direct link to Your old disk is sitting on an old stack" title="Direct link to Your old disk is sitting on an old stack" translate="no">​</a></h2>
<p>The package may look like a thin Laravel integration, but underneath it sits a chain of legacy dependencies:</p>
<ul>
<li class="">the old Laravel driver</li>
<li class="">the old League Flysystem Azure adapter</li>
<li class="">the old Microsoft Blob SDK</li>
</ul>
<p>So when teams say, "The filesystem config still works, why touch it?", they are only looking at the top layer.</p>
<p><code>azure-oss/storage-blob-laravel</code> replaces that entire stack with a maintained Blob SDK, a maintained Flysystem adapter, and a Laravel driver designed to fit today’s framework expectations.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="this-is-where-the-upgrade-gets-interesting">This is where the upgrade gets interesting<a href="https://php-oss-for-azure.github.io/blog/laravel-azure-blob-storage-after-matthewbdaly-laravel-azure-storage#this-is-where-the-upgrade-gets-interesting" class="hash-link" aria-label="Direct link to This is where the upgrade gets interesting" title="Direct link to This is where the upgrade gets interesting" translate="no">​</a></h2>
<p>Laravel teams usually care about three things more than package history.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-cleaner-config">1. Cleaner config<a href="https://php-oss-for-azure.github.io/blog/laravel-azure-blob-storage-after-matthewbdaly-laravel-azure-storage#1-cleaner-config" class="hash-link" aria-label="Direct link to 1. Cleaner config" title="Direct link to 1. Cleaner config" translate="no">​</a></h3>
<p>The new driver is easier to read at a glance.</p>
<p>Instead of old field names and compatibility baggage, you get config that spells out its intent:</p>
<ul>
<li class=""><code>connection_string</code></li>
<li class=""><code>account_name</code></li>
<li class=""><code>account_key</code></li>
<li class=""><code>temporary_url</code></li>
<li class=""><code>is_public_container</code></li>
</ul>
<p>That sounds cosmetic until you have to audit production config across four environments and three teammates.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-a-real-modern-auth-story">2. A real modern auth story<a href="https://php-oss-for-azure.github.io/blog/laravel-azure-blob-storage-after-matthewbdaly-laravel-azure-storage#2-a-real-modern-auth-story" class="hash-link" aria-label="Direct link to 2. A real modern auth story" title="Direct link to 2. A real modern auth story" translate="no">​</a></h3>
<p>This is the part that changes architecture conversations.</p>
<p>The new package supports:</p>
<ul>
<li class=""><code>client_secret</code></li>
<li class=""><code>client_certificate</code></li>
<li class=""><code>workload_identity</code></li>
<li class=""><code>managed_identity</code></li>
</ul>
<p>If your Laravel app runs on Azure, that means you are no longer trapped in the world where long-lived storage secrets feel like the only practical option.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-url-behavior-you-can-reason-about">3. URL behavior you can reason about<a href="https://php-oss-for-azure.github.io/blog/laravel-azure-blob-storage-after-matthewbdaly-laravel-azure-storage#3-url-behavior-you-can-reason-about" class="hash-link" aria-label="Direct link to 3. URL behavior you can reason about" title="Direct link to 3. URL behavior you can reason about" translate="no">​</a></h3>
<p>Blob disks always get judged on URLs.</p>
<p>Not in demos, but in the awkward cases:</p>
<ul>
<li class="">public container links</li>
<li class="">signed temporary URLs</li>
<li class="">custom origins</li>
<li class="">Azure Front Door in front of storage</li>
</ul>
<p>This package gives those concerns a cleaner home instead of leaving them as half-documented quirks.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-best-rollout-is-usually-the-boring-one">The best rollout is usually the boring one<a href="https://php-oss-for-azure.github.io/blog/laravel-azure-blob-storage-after-matthewbdaly-laravel-azure-storage#the-best-rollout-is-usually-the-boring-one" class="hash-link" aria-label="Direct link to The best rollout is usually the boring one" title="Direct link to The best rollout is usually the boring one" translate="no">​</a></h2>
<p>Start with a connection string. Keep the disk name stable. Prove uploads, downloads, <code>Storage::url()</code>, and <code>Storage::temporaryUrl()</code> still behave the way your app expects.</p>
<p>Then, once the migration is quiet in production, decide whether you want to modernize authentication.</p>
<p>That pacing matters. A good migration is not the one with the biggest ambition. It is the one your team can safely ship.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="where-to-go-next">Where to go next<a href="https://php-oss-for-azure.github.io/blog/laravel-azure-blob-storage-after-matthewbdaly-laravel-azure-storage#where-to-go-next" class="hash-link" aria-label="Direct link to Where to go next" title="Direct link to Where to go next" translate="no">​</a></h2>
<p>For the exact config mapping and rollout checklist, read <a class="" href="https://php-oss-for-azure.github.io/storage-blob-laravel/migrate-from-matthewbdaly-laravel-azure-storage">Migrate from matthewbdaly/laravel-azure-storage</a>.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Leaving league/flysystem-azure-blob-storage Behind]]></title>
            <link>https://php-oss-for-azure.github.io/blog/migrating-from-league-flysystem-azure-blob-storage</link>
            <guid>https://php-oss-for-azure.github.io/blog/migrating-from-league-flysystem-azure-blob-storage</guid>
            <pubDate>Tue, 30 Jun 2026 15:40:24 GMT</pubDate>
            <description><![CDATA[Why this Flysystem migration is usually straightforward and still worth doing.]]></description>
            <content:encoded><![CDATA[<p><code>league/flysystem-azure-blob-storage</code> is one of those packages that still gets the benefit of a great name.</p>
<p>It sounds official. It sounds familiar. It sounds like the obvious thing to install.</p>
<p>The problem is that it is abandoned, and more importantly, it keeps your Flysystem layer tied to the legacy Microsoft Blob SDK.</p>
<p>That is why the modern move is not just "replace one adapter with another." It is really about getting your storage abstraction off old foundations and onto <code>azure-oss/storage-blob-flysystem</code>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="this-is-the-least-dramatic-migration-in-the-set">This is the least dramatic migration in the set<a href="https://php-oss-for-azure.github.io/blog/migrating-from-league-flysystem-azure-blob-storage#this-is-the-least-dramatic-migration-in-the-set" class="hash-link" aria-label="Direct link to This is the least dramatic migration in the set" title="Direct link to This is the least dramatic migration in the set" translate="no">​</a></h2>
<p>That is good news.</p>
<p>If you already use Flysystem v3, this change is usually more like swapping the engine than rebuilding the car:</p>
<ul>
<li class="">the Flysystem mental model stays the same</li>
<li class="">your app still talks to a <code>Filesystem</code></li>
<li class="">the big change is how the Azure adapter is created</li>
</ul>
<p>So while the package name change matters, the real upgrade happens one layer down.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-improves-under-the-hood">What improves under the hood<a href="https://php-oss-for-azure.github.io/blog/migrating-from-league-flysystem-azure-blob-storage#what-improves-under-the-hood" class="hash-link" aria-label="Direct link to What improves under the hood" title="Direct link to What improves under the hood" translate="no">​</a></h2>
<p>The old adapter is built on <code>microsoft/azure-storage-blob</code>.</p>
<p>The new one is built on <code>azure-oss/storage-blob</code>, which means the adapter now inherits a storage stack that is actively aligned with the rest of this ecosystem:</p>
<ul>
<li class="">current Blob clients</li>
<li class="">modern SAS support</li>
<li class="">better docs for public URLs and temporary URLs</li>
<li class="">easier handoff between direct SDK code and Flysystem-backed code</li>
</ul>
<p>That matters any time your project stops being "just a filesystem disk" and starts needing storage-specific behavior.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-one-code-change-to-understand">The one code change to understand<a href="https://php-oss-for-azure.github.io/blog/migrating-from-league-flysystem-azure-blob-storage#the-one-code-change-to-understand" class="hash-link" aria-label="Direct link to The one code change to understand" title="Direct link to The one code change to understand" translate="no">​</a></h2>
<p>The old adapter starts with a <code>BlobRestProxy</code> and a container name.</p>
<p>The new adapter starts with a <code>BlobContainerClient</code>.</p>
<p>That is a healthier boundary. It means the adapter receives exactly the scope it needs, no more and no less. Once you see that, the migration becomes much easier to reason about.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="when-this-migration-is-almost-boring">When this migration is almost boring<a href="https://php-oss-for-azure.github.io/blog/migrating-from-league-flysystem-azure-blob-storage#when-this-migration-is-almost-boring" class="hash-link" aria-label="Direct link to When this migration is almost boring" title="Direct link to When this migration is almost boring" translate="no">​</a></h2>
<p>That is the sweet spot:</p>
<ul>
<li class="">you already construct the adapter in one place</li>
<li class="">you already use Flysystem v3</li>
<li class="">your app does not depend on odd adapter-specific behavior</li>
<li class="">your biggest concern is URL generation and upload behavior</li>
</ul>
<p>In that scenario, this is often a tidy refactor with a good payoff.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-it-is-still-worth-doing">Why it is still worth doing<a href="https://php-oss-for-azure.github.io/blog/migrating-from-league-flysystem-azure-blob-storage#why-it-is-still-worth-doing" class="hash-link" aria-label="Direct link to Why it is still worth doing" title="Direct link to Why it is still worth doing" translate="no">​</a></h2>
<p>Because abandoned infrastructure code has a way of becoming "fine" right up until the moment it is not.</p>
<p>If your Blob adapter is the bridge between application code and storage, it is a good place to remove uncertainty. Moving to <code>azure-oss/storage-blob-flysystem</code> gives you a maintained adapter on top of a maintained SDK, and that is a much better place to keep building from.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="where-to-go-next">Where to go next<a href="https://php-oss-for-azure.github.io/blog/migrating-from-league-flysystem-azure-blob-storage#where-to-go-next" class="hash-link" aria-label="Direct link to Where to go next" title="Direct link to Where to go next" translate="no">​</a></h2>
<p>For the concrete namespace, constructor, and URL behavior changes, start with <a class="" href="https://php-oss-for-azure.github.io/storage-blob-flysystem/migrate-from-league-flysystem-azure-blob-storage">Migrate from league/flysystem-azure-blob-storage</a>.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[A Modern Azure Queue Driver for Laravel]]></title>
            <link>https://php-oss-for-azure.github.io/blog/modern-azure-queue-for-laravel</link>
            <guid>https://php-oss-for-azure.github.io/blog/modern-azure-queue-for-laravel</guid>
            <pubDate>Tue, 30 Jun 2026 15:40:24 GMT</pubDate>
            <description><![CDATA[Why Laravel teams should move from squigg/azure-queue-laravel to azure-oss/storage-queue-laravel.]]></description>
            <content:encoded><![CDATA[<p>Queue migrations are deceptive.</p>
<p>At first glance, moving from <code>squigg/azure-queue-laravel</code> to <code>azure-oss/storage-queue-laravel</code> looks like a simple config refresh. Rename a few fields, change the driver, move on.</p>
<p>That is partly true. It is also how teams end up underestimating the one thing that matters most in queue code: behavior.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-package-swap-matters-because-operations-matter">The package swap matters because operations matter<a href="https://php-oss-for-azure.github.io/blog/modern-azure-queue-for-laravel#the-package-swap-matters-because-operations-matter" class="hash-link" aria-label="Direct link to The package swap matters because operations matter" title="Direct link to The package swap matters because operations matter" translate="no">​</a></h2>
<p>The old package is tied to the legacy Microsoft Queue SDK.</p>
<p>The new package puts Laravel on top of <code>azure-oss/storage-queue</code>, which gives the queue layer a maintained base and a config model that looks more like something you would actually want to support in 2026.</p>
<p>That includes:</p>
<ul>
<li class="">native connection string support</li>
<li class="">explicit shared-key config</li>
<li class="">SAS-bearing connection strings</li>
<li class="">custom endpoints for local and emulator-style setups</li>
</ul>
<p>None of that is glamorous. All of it reduces friction.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-real-migration-question-is-this">The real migration question is this<a href="https://php-oss-for-azure.github.io/blog/modern-azure-queue-for-laravel#the-real-migration-question-is-this" class="hash-link" aria-label="Direct link to The real migration question is this" title="Direct link to The real migration question is this" translate="no">​</a></h2>
<p>Will your workers behave the same way after the upgrade?</p>
<p>That is the heart of it.</p>
<p>Queue code is rarely judged by how elegant the config file looks. It is judged by whether jobs reappear too early, whether failed work is retried the way you expect, and whether local and cloud environments behave close enough to trust.</p>
<p>That is why the move to <code>azure-oss/storage-queue-laravel</code> is worth doing, but also why it should be treated like an application behavior change, not just dependency cleanup.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-gets-better">What gets better<a href="https://php-oss-for-azure.github.io/blog/modern-azure-queue-for-laravel#what-gets-better" class="hash-link" aria-label="Direct link to What gets better" title="Direct link to What gets better" translate="no">​</a></h2>
<ul>
<li class="">config names that read clearly</li>
<li class="">queue options like <code>retry_after</code>, <code>time_to_live</code>, and <code>after_commit</code></li>
<li class="">a cleaner path for teams that already store Azure connection strings</li>
<li class="">one maintained queue stack from Laravel down to the SDK</li>
</ul>
<p>That is the sort of foundation you want before your job volume goes up, not after.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="migrate-it-like-production-infrastructure">Migrate it like production infrastructure<a href="https://php-oss-for-azure.github.io/blog/modern-azure-queue-for-laravel#migrate-it-like-production-infrastructure" class="hash-link" aria-label="Direct link to Migrate it like production infrastructure" title="Direct link to Migrate it like production infrastructure" translate="no">​</a></h2>
<p>If you make this switch, test the boring things hard:</p>
<ul>
<li class="">long-running jobs</li>
<li class="">retries</li>
<li class="">delayed jobs</li>
<li class="">local development against custom endpoints or Azurite-style setups</li>
</ul>
<p>The docs can help with the rename work. Your staging environment should validate the timing work.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="where-to-go-next">Where to go next<a href="https://php-oss-for-azure.github.io/blog/modern-azure-queue-for-laravel#where-to-go-next" class="hash-link" aria-label="Direct link to Where to go next" title="Direct link to Where to go next" translate="no">​</a></h2>
<p>For the exact field mapping and worker-focused checklist, go to <a class="" href="https://php-oss-for-azure.github.io/storage-queue-laravel/migrate-from-squigg-azure-queue-laravel">Migrate from squigg/azure-queue-laravel</a>.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[What to Use After microsoft/azure-storage-blob]]></title>
            <link>https://php-oss-for-azure.github.io/blog/what-to-use-after-microsoft-azure-storage-blob</link>
            <guid>https://php-oss-for-azure.github.io/blog/what-to-use-after-microsoft-azure-storage-blob</guid>
            <pubDate>Tue, 30 Jun 2026 15:40:24 GMT</pubDate>
            <description><![CDATA[The practical replacement for the retired Microsoft Azure Blob SDK in modern PHP projects.]]></description>
            <content:encoded><![CDATA[<p>Search for Azure Blob Storage in PHP and you still fall into a small time warp.</p>
<p>The old <code>microsoft/azure-storage-blob</code> package still has years of examples, Stack Overflow answers, and copy-pasted snippets working in its favor. But if the real question is, "What should we build on today?", the answer is much cleaner:</p>
<p>Use <code>azure-oss/storage-blob</code>.</p>
<p>Not because it is newer for the sake of being newer. Because it is the package that actually matches how modern PHP teams work now: current PHP, clearer clients, current docs, and a path into the rest of the <code>azure-oss</code> ecosystem if your app grows beyond a few direct Blob calls.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-old-package-usually-breaks-trust-in-slow-motion">The old package usually breaks trust in slow motion<a href="https://php-oss-for-azure.github.io/blog/what-to-use-after-microsoft-azure-storage-blob#the-old-package-usually-breaks-trust-in-slow-motion" class="hash-link" aria-label="Direct link to The old package usually breaks trust in slow motion" title="Direct link to The old package usually breaks trust in slow motion" translate="no">​</a></h2>
<p>Teams rarely wake up and schedule "The Great Blob Migration."</p>
<p>What usually happens is quieter:</p>
<ul>
<li class="">a PHP upgrade is overdue</li>
<li class="">a new feature needs signed URLs or tags</li>
<li class="">a teammate wants Laravel or Flysystem integration</li>
<li class="">someone tries to standardize auth across Azure services</li>
</ul>
<p>That is when the age of the old package starts to matter. It is not one dramatic failure. It is friction everywhere around the edges.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-azure-ossstorage-blob-is-the-right-replacement">Why <code>azure-oss/storage-blob</code> is the right replacement<a href="https://php-oss-for-azure.github.io/blog/what-to-use-after-microsoft-azure-storage-blob#why-azure-ossstorage-blob-is-the-right-replacement" class="hash-link" aria-label="Direct link to why-azure-ossstorage-blob-is-the-right-replacement" title="Direct link to why-azure-ossstorage-blob-is-the-right-replacement" translate="no">​</a></h2>
<p>It gives you a better center of gravity for the codebase:</p>
<ul>
<li class=""><code>BlobServiceClient</code> for account-level work</li>
<li class=""><code>BlobContainerClient</code> for container-scoped work</li>
<li class=""><code>BlobClient</code> for the blob you actually care about</li>
</ul>
<p>That client model sounds small, but it changes the feel of the code. Instead of passing container and blob names through every method call, your code starts to model the storage structure directly.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-short-comparison">The short comparison<a href="https://php-oss-for-azure.github.io/blog/what-to-use-after-microsoft-azure-storage-blob#the-short-comparison" class="hash-link" aria-label="Direct link to The short comparison" title="Direct link to The short comparison" translate="no">​</a></h2>
<table><thead><tr><th>Question</th><th>Legacy package</th><th>Modern package</th></tr></thead><tbody><tr><td>What do I install?</td><td><code>microsoft/azure-storage-blob</code></td><td><code>azure-oss/storage-blob</code></td></tr><tr><td>What does the API revolve around?</td><td><code>BlobRestProxy</code></td><td>Service, container, and blob clients</td></tr><tr><td>Can I keep using a connection string first?</td><td>Yes</td><td>Yes</td></tr><tr><td>Can I modernize auth later?</td><td>Limited story</td><td>Yes, through <code>azure-oss/identity</code></td></tr><tr><td>Does it line up with Flysystem and Laravel?</td><td>Not really</td><td>Yes</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-best-part-of-this-migration-is-not-glamorous">The best part of this migration is not glamorous<a href="https://php-oss-for-azure.github.io/blog/what-to-use-after-microsoft-azure-storage-blob#the-best-part-of-this-migration-is-not-glamorous" class="hash-link" aria-label="Direct link to The best part of this migration is not glamorous" title="Direct link to The best part of this migration is not glamorous" translate="no">​</a></h2>
<p>The payoff is not a flashy demo.</p>
<p>It is that six months later you have one Blob stack instead of a museum exhibit:</p>
<ul>
<li class="">direct SDK usage on a maintained package</li>
<li class="">Flysystem support on the same foundation</li>
<li class="">Laravel integrations that are not built on a deprecated core</li>
<li class="">docs that describe the package you are actually using</li>
</ul>
<p>That is the kind of migration that keeps paying rent.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="who-should-move-first">Who should move first<a href="https://php-oss-for-azure.github.io/blog/what-to-use-after-microsoft-azure-storage-blob#who-should-move-first" class="hash-link" aria-label="Direct link to Who should move first" title="Direct link to Who should move first" translate="no">​</a></h2>
<p>You are a strong candidate for an easy first pass if:</p>
<ul>
<li class="">your app already runs on PHP 8.2+</li>
<li class="">you still authenticate with a connection string</li>
<li class="">your Blob usage is mostly uploads, downloads, deletes, listing, and signed URLs</li>
<li class="">you want to keep the first migration boring and safe</li>
</ul>
<p>That last point matters. You do not need to adopt Microsoft Entra ID, redesign your filesystem abstraction, and rewrite every storage call in one sprint. You can move the package first and modernize the rest in phases.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="where-to-go-next">Where to go next<a href="https://php-oss-for-azure.github.io/blog/what-to-use-after-microsoft-azure-storage-blob#where-to-go-next" class="hash-link" aria-label="Direct link to Where to go next" title="Direct link to Where to go next" translate="no">​</a></h2>
<p>If you want the actual code-and-config path, read <a class="" href="https://php-oss-for-azure.github.io/storage-blob/migrate-from-microsoft-azure-storage-blob">Migrate from microsoft/azure-storage-blob</a>.</p>]]></content:encoded>
        </item>
    </channel>
</rss>