PHP 5.5.9. That is the minimum for Laravel 5.1, which came out this week, the first Laravel with LTS: two years of bug fixes, three of security fixes. Two weeks ago I wrote the same about Symfony 2.7. Two frameworks arriving at the same idea in one summer is no coincidence. PHP applications got old enough to have a lifecycle.

Draw the ladder for your project once. OS at the bottom. Then the PHP version the OS ships, or the one you build. Then the framework. Then the packages on top. Every rung has its own end-of-life, and the rungs are coupled. If production sits on some old distro with 5.4, the 5.1 upgrade is suddenly an ops project. And above you, half the packages will require 5.1 in their next major, so staying behind slowly cuts you off from fixes.

The failure mode I keep seeing is the frozen stack. Nobody upgrades anything for three years because it works. Then one security issue, or one library you badly need, and the whole ladder must move at once. I watched such a project. Six weeks, everything changed at the same time, and when the regressions came, everything was a suspect.

I was not only watching. The freeze was partly my decision: “it works, why touch it”, said in a planning meeting two years earlier.

The alternative is boring and cheap. Upgrade something small every month or two. One minor version, one package major, one PHP point release. Each step is small enough to test and small enough to revert. You never get the giant migration because you never let the distance accumulate.

Framework version used to be a line in composer.json. Now it is part of the architecture, with a calendar attached.