← Blog · Guides

PIE 1.5 breaks unattended PHP extension installs in CI: the ignored flag and the --select fix

November 2, 2026

If your CI installs PHP extensions with PIE, the PHP Foundation's extension installer, check the install command before you move from the 1.4 line to 1.5. The flag that let an unattended project install pick extension packages on its own, --allow-non-interactive-project-install, no longer does anything in 1.5. A pipeline that relied on it now stops with exit code 1. Laravel News wrote the change up on 2 November 2026 ("PIE 1.5 Changes PHP Extension Installs in CI", Yannick Lyn Fatt); the release itself, PIE 1.5.0, is dated 16 September 2026 on GitHub, and the 1.4 line is still being maintained alongside it (1.4.12 and 1.5.5 were both tagged on 30 October).

We read the PIE source for both versions and ran both against the same test project, so what follows is what the tools did, not a paraphrase of release notes.

What the old flag did, and what it does now

In PIE 1.4.12, running pie install inside a project directory checks the project's composer.json for required extensions such as ext-redis. Without a terminal it refuses to continue unless you pass the old flag. Its exact message is: "Aborting! You are not running in interactive mode, and --allow-non-interactive-project-install was not specified."

In PIE 1.5.5 the option is still accepted, so the command line does not error on it, but the source describes it as "Deprecated and ignored. Will emit a warning if used." The warning PIE prints is: "The --allow-non-interactive-project-install is now deprecated and has no effect." What replaces it is an explicit choice, one per missing extension, with the new --select option. PIE's own help text describes it as: "Select a PIE package for a given extension name, e.g. `--select=foo=myvendor/foo` to resolve the `ext-foo` extension to `myvendor/foo` PIE package."

The important detail is in SelectPackageForExtension.php: when PIE is not running interactively and you have not supplied a selection for a missing extension, it stops with a "selection required" error. It does that even when exactly one package provides the extension. In 1.5 there is no automatic pick in unattended mode at all.

What we measured

Test project: PHP 8.3.36 in the official php:8.3-cli image, a composer.json that requires ext-redis and, under require-dev, ext-xdebug. Neither extension installed. All runs without a terminal, as in CI.

  • PIE 1.4.12, no flag: exit 1, "Aborting! You are not running in interactive mode…".
  • PIE 1.4.12 with --allow-non-interactive-project-install: exit 1. It installed Xdebug on its own, because one package provides ext-xdebug. It did not install Redis: "Multiple packages were found for ext-redis: phpredis/phpredis, pie-extensions/redis". So the old flag was already only a partial answer; it worked for extensions with a single provider.
  • PIE 1.5.5 with the old flag: exit 1, the deprecation warning, and then, for each missing extension, "No package selections were made for ext-redis; you MUST specify a package selection in non-interactive mode", followed by the exact parameter to add: --select=redis=phpredis/phpredis (and --select=xdebug=xdebug/xdebug for the dev requirement).
  • PIE 1.5.5 with --no-interaction --no-dev --select=redis=phpredis/phpredis: exit 0. It installed phpredis 6.3.0, reported it "enabled and loaded", and did not touch Xdebug.

So the pipeline that breaks is precisely the one that used to pass: a project whose missing extensions each had a single provider, installed unattended with the old flag. On 1.5 the same command fails. The useful part is that 1.5 tells you, in the failure output, the --select line it wants.

The command to use in CI

# PIE 1.5: one --select per missing extension that needs a package choice
pie install --no-interaction --no-dev \
  --select=redis=phpredis/phpredis

The left side of each mapping is the extension name without the ext- prefix; the right side is the PIE package. Laravel News puts it the same way: "The mapping uses the extension name without ext- on the left and its package name on the right." Add one --select for every extension the project requires that is not already loaded. A plain pie install phpredis/phpredis outside project mode already names its package and is not affected.

--no-dev keeps require-dev extensions such as Xdebug out of a production build. Per Laravel News, it "does not remove extensions already installed in PHP, and it does not replace composer install --no-dev for your application's PHP packages." Our run matched the first half: Xdebug was simply not considered.

Two other 1.5 additions are useful in the same pipeline. pie check-build-tools checks for the compilers and tools an extension build needs before you start one; in our container it listed each tool and ended "All build tools are installed." And 1.5 can install several extensions in one command and adds pie upgrade for extensions it installed earlier.

If you are not ready to change the command

The 1.4 line is still receiving releases, so pinning the PIE version your CI downloads is a legitimate stopgap. Note what the measurement above says about it, though: on 1.4 the old flag already failed for any extension with more than one provider, and Redis is one of those. Moving to explicit --select mappings is the fix that works on both questions at once: it is what 1.5 requires, and it removes the guess about which package provides an extension.

If you run Laravel on DeployBase, our Laravel deployment guide covers Redis for queues and caching from the application side.

Sources: Laravel News, "PIE 1.5 Changes PHP Extension Installs in CI", Yannick Lyn Fatt, published 2 November 2026; php/pie on GitHub: release 1.5.0 (16 September 2026), releases 1.5.5 and 1.4.12 (30 October 2026), pull requests #633 (package selection), #710 (--no-dev) and #673 (build tools check), and the 1.5.5 and 1.4.12 source (InstallExtensionsForProjectCommand.php, CommandHelper.php, SelectPackageForExtension.php). All read 3 November 2026. Test runs by DeployBase on 3 November 2026 in php:8.3-cli (PHP 8.3.36) with PIE 1.4.12 and 1.5.5.