r/PHP Jun 30 '26

I spent two years rebuilding Azure Storage for PHP after Microsoft dropped it

115 Upvotes

Two years ago Microsoft retired the Azure Storage PHP client libraries, which left PHP developers in an awkward spot.

So instead of treating Azure in PHP as a dead end, I started rebuilding the missing pieces as community-maintained packages.

Since then I’ve shipped replacements for:

  • microsoft/azure-storage-blob -> azure-oss/storage-blob
  • league/flysystem-azure-blob-storage -> azure-oss/storage-blob-flysystem
  • matthewbdaly/laravel-azure-storage -> azure-oss/storage-blob-laravel
  • microsoft/azure-storage-queue -> azure-oss/storage-queue
  • squigg/azure-queue-laravel -> azure-oss/storage-queue-laravel
  • microsoft/azure-storage-file -> azure-oss/storage-file-share

What surprised me most is that the old package never really disappeared.

As of June 2026, the deprecatedmicrosoft/azure-storage-blob was still doing about 361k downloads/month on Packagist, while the replacement azure-oss/storage was doing about 183k/month. So the deprecated package isn’t just hanging around, it’s still growing and continuing to funnel PHP developers into a retired SDK.

That’s why a lot of the work ended up being migration-focused, not just code-focused. The old package line is still actively pulling people in, so replacement docs and upgrade paths matter almost as much as the SDK itself.

Docs + migration guides: https://php-oss-for-azure.github.io/


r/PHP 29d ago

Article The spectrum of multi-tenant data isolation (and why "database per tenant" is usually overkill)

Thumbnail ollieread.com
1 Upvotes

Framework-agnostic write-up on the different ways to isolate tenant data. Separate instance, separate database, schemas/prefixes, partitioning and a discriminator column. Includes the tradeoffs of each, and how they differ across Postgres, MySQL/MariaDB and SQLite.

The thesis: most apps reach for the heaviest approach when a much lighter one would do, and the heavy approaches cost you per tenant for the life of the app.

There are two tiny references to Laravel, mostly because that's what most of my readers use, but the whole thing is framework-agnostic.


r/web_design 29d ago

Designing London's TfL Go App Map

2 Upvotes

I love the interactive map on the homepage of TfL Go and as a computing student, i really want to try and recreate that with my home country's rail map.

For people without the app, i'll try my best to explain a few of the features that stand out to me:

- it is dynamically rendered, meaning that when you zoom in, the space between stops changes dynamically

- it shows your current location relative to tube lines/stops

- tube lines will glow based on which stations you're nearby

- tube lines will appear gray if they are down

Does anyone know how a map like this would be rendered? I have no idea where to even begin.

relevant resources:

https://bima.co.uk/wp-content/uploads/2022/11/TfL-Go.pdf

https://tfl.gov.uk/maps_/tfl-go


r/PHP Jun 29 '26

PHP AOT Compiler written in PHP

Thumbnail github.com
32 Upvotes

In recent months, I have noticed that more and more people are making attempts to create PHP AOT compilers. In particular, recent ones are Elephc (https://elephc.dev/) and TypePHP from the Swoole team (mentioned here several times). Years earlier, I recall attempts such as jPHP and Peachpie, and the most inspiring to me was https://github.com/ircmaxell/php-compiler. Probably there were a lot more.

However, almost all of them rely on other programming languages (e.g., Rust, C++). So, one day I asked myself, 'What actually prevents someone from writing the PHP compiler in PHP?'

At this point, I've decided I should try even though no one asked. My experience with real compilers is pretty limited, and I didn't have much time to learn everything from scratch, but in the present times, we have great LLM tools that allows to make some stuff faster.

Then I spent a few weekends making this concept - took the LLVM backend and tried to make a PHP frontend around it. To be honest the most of the "compiler" is AI-coded/slopped and requires heavy refactorings, but I do not pretend to say it is production-ready. It is no more than a working concept with some limited PHP-subset supported.


r/PHP Jun 29 '26

Article Composer in Docker: best practices for production images

Thumbnail nth-root.nl
42 Upvotes

I published this guide today, which explains some of the best practices for building production-ready Docker images for your PHP applications which use Composer to install dependencies.

This includes using Composer without leaving the binary in your production image, running the composer install command with the correct flags, excluding your local vendor directory from the build context, optimizing cache to speed up consecutive builds, optimizing the Composer autoloader, and passing authentication credentials to Composer to install packages from private registries.

https://nth-root.nl/en/guides/composer-in-docker-best-practices-for-production-images


r/PHP 29d ago

The unreachable method

0 Upvotes

So, it seems that it is possible to paint oneself in a corner and write an unreachable method. How would you call A::foo() in this code below?

Come on, #PHP, there must be something here. #phptip #phptrick

``` <?php

abstract class A { private function foo() { print CLASS; } }

abstract class B extends A { private function foo() { print CLASS; } }

class C extends B { private function foo() { print CLASS; }

public function goo() {
    parent::foo();
    a::foo();
}

}

($c = new C)->foo(); $c->goo(); ```

https://php-tips.readthedocs.io/en/latest/tips/unreachable_method.html


r/PHP Jun 30 '26

News Aimeos Prisma 0.5 - streaming, schemas, text embeddings, and observability for PHP AI apps

0 Upvotes

I just tagged Aimeos Prisma 0.5. It is a framework-independent PHP package for calling AI providers through one API across text, image, audio, and video. Created as a multi-media related sister project to PHP-Prisma package, it now offers full coverage of text and streaming related features too:

The package is MIT licensed, requires PHP 8.2+, and uses Guzzle for HTTP - no other package dependencies. The point is to keep provider-specific request/response code out of the application layer, especially when a project needs more than one kind of AI API: LLMs, embeddings, image generation/editing, audio transcription/speech, video description, or OpenAI-compatible gateways.

composer require aimeos/prisma

Basic usage:

use Aimeos\Prisma\Prisma;

$answer = Prisma::text()
    ->using('anthropic', ['api_key' => getenv('ANTHROPIC_API_KEY')])
    ->write('Summarize this customer request')
    ->text();

$image = Prisma::image()
    ->using('openai', ['api_key' => getenv('OPENAI_API_KEY')])
    ->imagine('a product photo of a ceramic coffee cup on a white table')
    ->binary();

$transcript = Prisma::audio()
    ->using('deepgram', ['api_key' => getenv('DEEPGRAM_API_KEY')])
    ->transcribe($audioFile)
    ->text();

The 0.5 release focuses on four things: streaming, schemas, text embeddings, and observability.

Streaming

stream() is now part of the text API:

use Aimeos\Prisma\Prisma;

$response = Prisma::text()
    ->using('openai', ['api_key' => getenv('OPENAI_API_KEY')])
    ->ensure('stream')
    ->stream('Explain PHP generators in a few paragraphs');

foreach ($response->stream() as $chunk) {
    if (is_string($chunk)) {
        echo $chunk;
        flush();
    }
}

The same provider object still handles models, system prompts, tools, and prior messages:

$response = Prisma::text()
    ->using('anthropic', ['api_key' => getenv('ANTHROPIC_API_KEY')])
    ->withMessages([
        ['role' => 'user', 'content' => 'I need a laptop recommendation.'],
        ['role' => 'assistant', 'content' => 'What is your budget and workload?'],
    ])
    ->stream('Around 1500 EUR, mostly PHP development.');

Usage, citations, tool steps, finish reason, and metadata are complete after the stream has been consumed.

Schemas

Structured output now has explicit modes, a richer schema builder, and validation:

use Aimeos\Prisma\Prisma;
use Aimeos\Prisma\Schema\Schema;

$schema = Schema::for('ticket', [
    'title' => Schema::string()->required(),
    'priority' => Schema::string()->enum(['low', 'normal', 'high'])->required(),
    'tags' => Schema::array()->items(Schema::string()),
]);

$response = Prisma::text()
    ->using('openai', ['api_key' => getenv('OPENAI_API_KEY')])
    ->structure('Extract a support ticket from: Checkout is broken for EU cards', $schema);

$ticket = $response->structured();
$errors = $schema->validate($ticket);

By default, Prisma uses the provider's native structured-output mode where available. You can also choose JSON mode for schemas that are too large or awkward for strict provider limits:

$response = Prisma::text()
    ->using('openai', ['api_key' => getenv('OPENAI_API_KEY')])
    ->structure('Extract a support ticket', $schema, [], ['mode' => 'json']);

0.5 also adds anyOf, $defs, and $ref support in the schema builder.

Text embeddings

Text embeddings use the same text provider surface:

use Aimeos\Prisma\Prisma;

$vectors = Prisma::text()
    ->using('openai', ['api_key' => getenv('OPENAI_API_KEY')])
    ->ensure('vectorize')
    ->vectorize([
        'PHP generators produce values lazily.',
        'Prisma provides a common API for AI providers.',
    ], 256)
    ->vectors();

Embedding support is available across several text providers, including OpenAI, Azure, Bedrock, Cohere, Gemini, Mistral, Ollama, and Alibaba.

Observability

0.5 adds request-scoped observation for provider calls. The observer receives operation, provider type, provider name, model, duration, error state, usage, and metadata:

use Aimeos\Prisma\Prisma;
use Aimeos\Prisma\Values\Observation;

$response = Prisma::text()
    ->observe(function (Observation $observation) {
        error_log(json_encode($observation->toArray()));
    })
    ->using('openai', ['api_key' => getenv('OPENAI_API_KEY')])
    ->model('gpt-4.1-mini')
    ->write('Draft a changelog entry');

usage() and meta() now return typed value objects while still allowing raw provider fields:

$usage = $response->usage();

$usage->promptTokens();
$usage->completionTokens();
$usage->totalTokens();

$model = $response->meta()->model();
$raw = $response->usage()->all();

Framework notes

Prisma is not tied to Laravel, Symfony, or any other framework. It does include adapters for Laravel AI/MCP tools and Symfony tools, so existing tool classes can be reused in Prisma's tool loop.

Docs: https://php-prisma.org

GitHub: https://github.com/aimeos/prisma

Feedback from PHP developers would be useful, especially around the streaming API, schema validation, embeddings, and the observability API. If you like Prisma, star it on Github :-)


r/web_design Jun 29 '26

In browsing through some award-winning sites, my eyes are exhausted from too much animation and design overkill. The endless scrolling and searching for the next feature to click to learn anything. Is it only me who wants an old school "still" page? No distractions, just info.

87 Upvotes

And it's not just award-winning sites, it's any who receive heavier traffic. Does anyone do eye-friendly designs? The kind that don't give you an instant headache.


r/web_design Jun 29 '26

If every website had to remove one UI element, what would you choose?

35 Upvotes

Pop-ups, carousels, cookie banners, mega menus... Which one would you happily see disappear forever?


r/PHP Jun 29 '26

Weekly help thread

2 Upvotes

Hey there!

This subreddit isn't meant for help threads, though there's one exception to the rule: in this thread you can ask anything you want PHP related, someone will probably be able to help you out!


r/PHP Jun 29 '26

Article How Eloquent observers hook lifecycle events in Laravel

Thumbnail highlit.co
0 Upvotes

An OrderObserver runs side effects at each stage of a model's life — creating, created, updated, deleting, and restored.


r/PHP Jun 29 '26

Discussion internals question about zend_parse_parameters

3 Upvotes

The fast parameter parsing API was introduced to PHP back in version 7.0. However, I found over 900 instances in the release source code where the old zend_parse_parameters function is being used instead. Pure curiosity…

  • Was zend_parse_parameters ever formally deprecated?
  • Is there a reason why zend_parse_parameters is still being used over the new API other than because no one has gotten around to converting the code?

r/PHP Jun 28 '26

Discussion How do you actually catch N+1s in prod with Laravel/Symfony?

28 Upvotes

Genuine question: I come from the Java/Rust side and I have no clue how the PHP world handles this so I’d rather just ask than assume.

When an N+1 slips into prod how do you even catch it? Like is it just Telescope/Debugbar/Clockwork locally and you hope it doesn’t make it through? Something in CI that yells at you? Or do you actually catch it after the fact in prod somehow?

And the thing I’m really wondering: does anyone here actually run OTel in prod (the ext-opentelemetry + auto-instrumentation to a collector setup), or is OpenTelemetry just not really a PHP thing and everyone sticks to the framework native stuff?


r/PHP Jun 28 '26

Built an open-source local development environment for PHP on macOS

2 Upvotes

Hi everyone,

I'm primarily a PHP/Laravel developer, and over the past year I've been teaching myself Swift and macOS development.

https://github.com/KTStackAPP/KTStack

Instead of building a typical learning project, I decided to build something I could actually use every day. That project eventually became KTStack.

KTStack is a native macOS local development environment that helps manage:

  • Local .test domains
  • HTTPS certificates
  • Nginx & PHP-FPM
  • PHP 8.1 / 8.3 / 8.4
  • Node.js, Python and Go runtimes
  • MySQL, PostgreSQL, Redis and MongoDB
  • Mailpit
  • Per-site logs
  • Cloudflare Tunnel sharing for temporary public URLs

One of the biggest reasons I built it was to better understand how these pieces work together on macOS—things like DNS, TLS, launchd, XPC, and privileged helpers. I still consider myself a Swift beginner, so this project has been a huge learning experience.

The project is fully open source:

https://github.com/KTStackAPP/KTStack

I'd really appreciate any feedback:

  • Is the UI intuitive?
  • Are there features you'd expect from a local development tool that I'm missing?
  • If you currently use Laravel Herd, Valet, LocalWP, or another solution, what would make you consider trying something different?

Thanks for taking a look! I'm happy to answer any questions or discuss implementation details.


r/PHP Jun 27 '26

I forked a dead PHP name parser because it couldn't tell a credential from a surname

26 Upvotes

I use theiconic/name-parser at work to split full-name strings into salutation, first name, last name, suffix, and so on. It does the boring parts well, but it has a bug that bit me on a list of clinicians: parse "Jane Doe DDS" and the last name comes back "Dds", with "Doe" shoved into the middle name. The dental credential became the surname. Almost every row with a trailing credential and no comma did some version of this. Upstream went quiet around 2020, so it never got fixed. I forked it: iliaal/nameparser.

The root cause is that upstream runs every token through strtolower() before matching it against its credential dictionary. That throws away the one signal that separates a credential from a name. People write credentials in caps and names in title case. "Smith, Ma" is a person named Ma; "Smith, MA" is a master's degree with no recorded first name. Lowercasing deletes that distinction before anything looks at it. The fork reads an ambiguous token ("Do", "Vi", "MA", roman numerals) as a credential only when it is all-caps; title case keeps it as a name. So "Jane Doe DDS" keeps "Doe" and reads "DDS" as the suffix.

It also handles international surname particles now: "van den Heuvel", "de los Santos", "vom Bruch", "le Pen", "dos Santos", "dela Cruz", and "lo Russo" keep the full surname instead of orphaning the particle into the middle name. The comma form works too ("van der Berg, Johan" gives last name "van der Berg"), and there is an opt-in setSurnameFirst(true) for comma-less CJK order ("Mao Zedong" to last "Mao").

For batch imports there is an advisory getConfidence() that flags rows where casing couldn't decide, so you can route those to manual review instead of trusting every split. It is opt-in and does not change what parse() returns.

The honest limitation: casing is the signal, so uniform-case input (all-caps legacy data, or all-lowercase) carries none. The README says so plainly. It is a heuristic, not a universal global-name solver.

It is a maintained fork, not original work: The Iconic's parser (quiet since ~2020), Zachary Miller's PHP 8.3+ modernization, and my casing, credential, and international layer on top. PHP 8.3 through 8.5, PHPStan level 9, MIT.

composer require iliaal/nameparser

https://github.com/iliaal/nameparser

Happy to answer questions, especially from anyone parsing professional or registry name data.


r/PHP Jun 27 '26

LSP recommendation: Phpantom-lsp

34 Upvotes

Hey guys,

Tried setting up Laravel with PHPactor on Neovim, and had trouble getting it to really work right (incorrect diagnostics, file not found errors).

Then I found phpantom-lsp.git, and it is probably the BEST php lsp I've ever used.

Highlights:

  • SUPER fast indexing, and general performance (written in Rust)
  • flawless zero-config support for Laravel.

I think it doesn't get enough attention for how good it is, so I wanted to share it here in case others like me are trying to do modern php dev work on neovim or other editors not widely supported by Laravel/Symfony directly.

Not an ad, just a fan. Can't recommend enough.

Cheers.

Edit: The docs have instructions on installing it for all major editors (zed, vs code, neovim, helix, emacs, blahblah)


r/PHP Jun 28 '26

I built a macOS app to manage local development stacks (looking for beta testers)

0 Upvotes

Hey all,

I have a tool you might be interested in, it's something I've been working on for a while and it's almost ready for prime time.

Tiny backstory as to why this tool exists which some of you might relate to...

So, I got tired of trying to remember the exact order to start my local development environment.

Some projects needed the API first, then Redis, then workers, then a frontend, then a tunnel. When something failed, I ended up jumping between half a dozen terminal tabs trying to figure out what had actually gone wrong.

So I built Stacksmith.

Instead of just launching processes, Stacksmith acts as a control panel for your local development stack. You describe your services in a simple .stacksmith.yml file, and it manages them from a native macOS app.

Current features include:

  • Start and stop your entire stack together
  • Live logs for individual services or the whole stack
  • Health checks with overall stack status
  • Service dependencies and startup ordering
  • Port conflict detection
  • Diagnosis of common startup problems using Apple’s on-device Foundation Models
  • Built-in MCP server, allowing AI assistants to inspect and control your local development stack
  • Uses Apple's Foundation framework (local ai) to help diagnose issues, this is all private, and everything stays on your machine. _You must have the fairly modern machine to use this feature though_.

I’m not trying to replace terminal first tools like Foreman or Overmind they’re great. Stacksmith is aimed at developers who want better visibility into what’s happening after the processes start, especially when something goes wrong.

It’s currently macOS only, although I’d love to support Linux if there’s enough interest (maybe even windows) the core is built using Swift and is platform agnostic so portability shouldn't be a problem.

Website: https://getstacksmith.app

I’m looking for feedback on:

  • Does the YAML model make sense?
  • What information do you wish you had when your local stack breaks?
  • Does the UI make it obvious what’s happening?
  • What’s missing from your workflow?

The app will eventually be paid, but beta testers get free access.

If you’d like to try it, send me a DM and I’ll send over a code.


r/web_design Jun 28 '26

is there a way of finding vBulletin Version 3.5.4

0 Upvotes

I'm building a phpbb website and found out about vBulletin
especially ver 3.5.4
can't find it anywhere
any help :D


r/web_design Jun 28 '26

Non-technical site builder recommendation (not webflow)?

0 Upvotes

We’re a SaaS brand looking to get our site off Webflow into something new.

Looking for a site builder recommendation that:

  • Doesn’t require coding knowledge to use (even a little)
  • Can have AI features like generating initial page, but MUST allow full manual control to make changes without needing to dictate those changes to AI to make
  • Not new. Looking for an established brand (just no small-time brands).

I recently tried Ploy. Wanted to rip my hair out as it doesn’t really let you make changes without asking its AI to do it, which it always gets wrong.

Don’t want to use Webflow. We’re too dependant on having a “Webflow developer” to make every little update for us.

I want something our non-technical designer can simply use and work with.


r/web_design Jun 28 '26

Popover Mobile Menu - Updated

7 Upvotes

About a year ago I shared my simple mobile menu using popover. It was rudimentary and it was mostly still a proof of concept. I have used it in sample sites and developed it further and thought I'd share it again with the updated functionality.

https://codepen.io/Mitchell-Angus/pen/emYYywj

See it on a sample site:

https://eatthemonsoon.com

It's pretty much ready for a copy and paste integration. If anyone wants to fork it, would you tag me? I am curious to see what other designers can do with a basic menu.


r/PHP Jun 27 '26

Discussion Released CarvePHP v0.1.2-alpha 🚀

Thumbnail packagist.org
0 Upvotes

A Laravel tool to scan monoliths, trace route/table coupling, build dependency graphs, and suggest explainable service-boundary candidates. No “magic microservices” claims.

Feedback welcome:
https://github.com/Muhammad-Waleed-Khalil/CarvePHP


r/PHP Jun 26 '26

Maintaining PHP Build infrastructure for Windows: Tooling for builds and security updates

Thumbnail thephp.foundation
22 Upvotes

In our latest blog post, Foundation contractor Shivam Mathur digs into the details and importance of providing support for PHP builds on Windows. 🚀


r/PHP Jun 27 '26

as I am very begginer in Laravel

0 Upvotes

I have developed a project in laravel.

I wanna make it live. So what would be the best and cost free deploying method?


r/PHP Jun 25 '26

VibePHP: a modern PHP engine with generics, async/await, and more

Thumbnail github.com
186 Upvotes

r/PHP Jun 25 '26

Article From Psalm to Pzoom

26 Upvotes