Global state is convenient.
That is why it survives.
A static singleton is easy to reach.
A global helper saves a few lines.
A shared container gives you access to almost anything.
Global state is convenient.
That is why it survives.
A static singleton is easy to reach.
A global helper saves a few lines.
A shared container gives you access to almost anything.
A lot of systems say they have observability because they have logs.
They do not.
Logs are useful, sometimes essential, but they are only one part of understanding what a system is actually doing.
A system can produce thousands of log lines every minute and still be nearly impossible to diagnose when something goes wrong.
A framework is supposed to help you build faster.
Routing, dependency injection, database access, queues, validation, authentication, caching, testing support—good frameworks remove huge amounts of repetitive work.
But there is another question I think framework design should take seriously:
What happens when the application eventually needs to move beyond the framework?
That might sound strange.
They are built to solve the immediate problem.
Ship the product.
Get users.
Add features.
Then, somewhere along the way, the application becomes important enough that replacing it is no longer simple.
You can have clear business boundaries, independent modules, explicit contracts, good tests, background workers, queues, caching, horizontal scaling and strong deployment automation without splitting the application into separate services.
So at what point should one of those modules actually become a microservice?
EvolvePHP 2.0.0-alpha.1 is officially out.
Until now, most of what I have written about EvolvePHP has focused on architecture: modular applications, execution isolation, long-running PHP, modernization, Bridge, service lifetimes and designing software for change.
With this release, those ideas are no longer only plans.
There is now a tagged, testable EvolvePHP 2 Alpha.
Start with a monolith.
Grow.
Split into services.
Become “modern.”
I think that framing is backwards.
Microservices are not the goal.
Boot the application once.
Keep the process alive.
Handle many requests or jobs.
Avoid repeating expensive initialization.
That can absolutely improve performance.
A request comes in.
PHP starts.
The application runs.
A response goes out.
The process ends.
That model shaped a lot of how PHP applications were designed.
Migrating a legacy PHP application to a modern framework can look deceptively simple from the outside.
You have an old application.
You choose Laravel, Symfony, or another modern framework.
You move the routes, controllers, models, and views.
Done.
Except that is rarely what really happens.
The difficult part of framework migration is not translating syntax.
You may find an old framework, unsupported PHP version, direct SQL everywhere, global state, fragile authentication, outdated packages, and years of business logic spread across controllers, cron jobs, helpers, templates and database procedures.
At that point, the usual instinct is:
“We need to move this to something modern.”
But that still leaves the hardest question unanswered:
How do we modernize without breaking the business that already depends on it?
Newer PHP version.
Supported dependencies.
Better architecture.
Cleaner code.
Improved security.
Easier deployment.
All of that sounds good.
But modernization is not free.
Every improvement comes with cost, risk, and disruption.
Legacy PHP applications are everywhere.
Some are ten or fifteen years old. Some are running on unsupported PHP versions. Some use frameworks that are no longer maintained. Others were built without a framework at all.
And many of them are still doing real work every day.
That creates an uncomfortable situation.
The application needs to change, but changing it may be risky.
“Secure by default” sounds reassuring.
It is also something almost every serious framework wants to say.
Use parameterized queries. Set sensible cookie defaults. Escape output. Protect forms from CSRF. Make unsafe configuration harder.
All of that matters.