Switch to fixed getcomposer.org links Add composer fallback
Setup PHP in GitHub Actions
Setup PHP with required extensions, php.ini configuration, code-coverage support and various tools like composer in GitHub Actions. This action gives you a cross platform interface to setup the PHP environment you need to test your application. Refer to Usage section and examples to see how to use this.
Contents
- PHP Support
- GitHub-Hosted Runner Support
- PHP Extension Support
- Tools Support
- Coverage Support
- Usage
- License
- Contributions
- Support This project
- Dependencies
- Further Reading
🎉 PHP Support
| PHP Version | Stability | Release Support |
|---|---|---|
| 5.6 | Stable |
End of life |
| 7.0 | Stable |
End of life |
| 7.1 | Stable |
End of life |
| 7.2 | Stable |
Security fixes only |
| 7.3 | Stable |
Active |
| 7.4 | Stable |
Active |
| 8.0 | Nightly |
In development |
Note: Specifying 8.0 in php-version input installs a nightly build of PHP 8.0.0-dev with PHP JIT, Union Types v2 and other new features. See nightly build setup for more information.
☁️ GitHub-Hosted Runner Support
| Virtual environment | YAML workflow label | Pre-installed PHP |
|---|---|---|
| Ubuntu 16.04 | ubuntu-16.04 |
PHP 5.6 to PHP 7.4 |
| Ubuntu 18.04 | ubuntu-latest or ubuntu-18.04 |
PHP 7.1 to PHP 7.4 |
| Ubuntu 20.04 | ubuntu-20.04 |
PHP 7.4 |
| Windows Server 2019 | windows-latest or windows-2019 |
PHP 7.4 |
| macOS 10.15 Catalina | macos-latest or macos-10.15 |
PHP 7.4 |
➕ PHP Extension Support
- On
ubuntuby default extensions which are available as a package can be installed. If the extension is not available as a package but it is onPECL, it can be installed by specifyingpeclin the tools input. - On
windowsextensions which havewindowsbinary onPECLcan be installed. - On
macOSextensions which are onPECLcan be installed. - Extensions which are installed along with PHP if specified are enabled.
- Extensions on
PECLwhich do not have a latest stable version, their pre-release versions can be installed by suffixing the extension with its state i.ealpha,beta,develorsnapshotseparated by a-likemsgpack-beta. - Extensions which cannot be installed gracefully leave an error message in the logs, the action is not interrupted.
🔧 Tools Support
These tools can be setup globally using the tools input.
codeception, composer, composer-prefetcher, cs2pr, deployer, pecl, phinx, phive, phpcbf, phpcpd, php-config, php-cs-fixer, phpcs, phpize, phpmd, phpstan, phpunit, prestissimo, psalm, symfony
uses: shivammathur/setup-php@v1
with:
php-version: '7.4'
tools: php-cs-fixer, phpunit
To setup a particular version of a tool, specify it in the form tool:version.
Latest stable version of composer is setup by default and accepts v1, v2, snapshot and preview as versions.
uses: shivammathur/setup-php@v1
with:
php-version: '7.4'
tools: composer:v2
Version for other tools should be in semver format and a valid release of the tool.
uses: shivammathur/setup-php@v1
with:
php-version: '7.4'
tools: php-cs-fixer:2.16.2, phpunit:8.5.1
Tools which cannot be installed gracefully leave an error message in the logs, the action is not interrupted.
📶 Coverage Support
Xdebug
Specify coverage: xdebug to use Xdebug.
Runs on all PHP versions supported.
uses: shivammathur/setup-php@v1
with:
php-version: '7.4'
coverage: xdebug
PCOV
Specify coverage: pcov to use PCOV and disable Xdebug.
It is much faster than Xdebug.
PCOV needs PHP >= 7.1.
If your source code directory is other than src, lib or, app, specify pcov.directory using the ini-values input.
uses: shivammathur/setup-php@v1
with:
php-version: '7.4'
ini-values: pcov.directory=api #optional, see above for usage.
coverage: pcov
Disable Coverage
Specify coverage: none to disable both Xdebug and PCOV.
Consider disabling the coverage using this PHP action for these reasons.
- You are not generating coverage reports while testing.
- It will remove
Xdebug, which will have a positive impact on PHP performance. - You are using
phpdbgfor running your tests.
uses: shivammathur/setup-php@v1
with:
php-version: '7.4'
coverage: none
📝 Usage
Inputs supported by this GitHub Action.
- php-version
required - extensions
optional - ini-values
optional - coverage
optional - tools
optional
See action.yml and usage below for more info.
Basic Setup
Setup a particular PHP version.
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Setup PHP
uses: shivammathur/setup-php@v1
with:
php-version: '7.4'
extensions: mbstring, intl #optional, setup extensions
ini-values: post_max_size=256M, short_open_tag=On #optional, setup php.ini configuration
coverage: xdebug #optional, setup coverage driver
tools: php-cs-fixer, phpunit #optional, setup tools globally
Matrix Setup
Setup multiple PHP versions on multiple operating systems.
jobs:
run:
runs-on: ${{ matrix.operating-system }}
strategy:
matrix:
operating-system: [ubuntu-latest, windows-latest, macos-latest]
php-versions: ['5.6', '7.0', '7.1', '7.2', '7.3', '7.4']
name: PHP ${{ matrix.php-versions }} Test on ${{ matrix.operating-system }}
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Setup PHP
uses: shivammathur/setup-php@v1
with:
php-version: ${{ matrix.php-versions }}
extensions: mbstring, intl #optional, setup extensions
ini-values: post_max_size=256M, short_open_tag=On #optional, setup php.ini configuration
coverage: xdebug #optional, setup coverage driver
tools: php-cs-fixer, phpunit #optional, setup tools globally
Nightly Build Setup
Setup a nightly build of
PHP 8.0.0-devfrom the master branch of PHP.
PECLis installed by default with this version onUbuntuandmacOS.- Some extensions might not support this version currently.
- Refer to this RFC for configuring
PHP JITon this version. - Refer to this list of RFCs implemented in this version.
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Setup PHP
uses: shivammathur/setup-php@v1
with:
php-version: '8.0'
extensions: mbstring #optional, setup extensions
ini-values: opcache.jit_buffer_size=256M, opcache.jit=1235, pcre.jit=1 #optional, setup php.ini configuration
coverage: pcov #optional, setup PCOV, Xdebug does not support this version yet.
tools: php-cs-fixer, phpunit #optional, setup tools globally
Thread Safe Setup
NTSversions are setup by default.- On
ubuntuandmacOSonly NTS versions are supported. - On
windowsbothTSandNTSversions are supported.
jobs:
run:
runs-on: windows-latest
name: Setup PHP TS on Windows
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Setup PHP
uses: shivammathur/setup-php@v1
with:
php-version: '7.4'
env:
phpts: ts # specify ts or nts
Cache Dependencies
You can persist composer's internal cache directory using the action/cache GitHub Action. Dependencies cached are loaded directly instead of downloading them while installation. The files cached are available across check-runs and will reduce the workflow execution time.
Note: Please do not cache vendor directory using action/cache as that will have side-effects.
- name: Get composer cache directory
id: composercache
run: echo "::set-output name=dir::$(composer config cache-files-dir)"
- name: Cache dependencies
uses: actions/cache@v2
with:
path: ${{ steps.composercache.outputs.dir }}
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
restore-keys: ${{ runner.os }}-composer-
- name: Install Dependencies
run: composer install --prefer-dist
In the above example, if you support a range of composer dependencies and do not commit composer.lock, you can use the hash of composer.json as the key for your cache.
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }}
Composer GitHub OAuth
If you have a number of workflows which setup multiple tools or have many composer dependencies, you might hit the GitHub's rate limit for composer. To avoid that you can add a OAuth token to the composer's config by setting COMPOSER_TOKEN environment variable. You can use GITHUB_TOKEN secret for this purpose.
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: '7.4'
env:
COMPOSER_TOKEN: ${{ secrets.GITHUB_TOKEN }}
Problem Matchers
PHPUnit
You can setup problem matchers for your PHPUnit output by adding this step after the setup-php step. This will scan the logs for failing tests and surface that information prominently in the GitHub Actions UI by creating annotations and log file decorations.
- name: Setup Problem Matchers for PHPUnit
run: echo "::add-matcher::${{ runner.tool_cache }}/phpunit.json"
Other Tools
For tools that support checkstyle reporting like phpstan, psalm, php-cs-fixer and phpcs you can use cs2pr to annotate your code.
For examples refer to cs2pr documentation.
Here is an example with
phpstan.
- name: Setup PHP
uses: shivammathur/setup-php@v1
with:
php-version: '7.4'
tools: cs2pr, phpstan
- name: PHPStan
run: phpstan analyse src --error-format=checkstyle | cs2pr
Examples
Examples for setting up this GitHub Action with different PHP Frameworks/Packages.
| Framework/Package | Runs on | Workflow |
|---|---|---|
CakePHP with MySQL and Redis |
ubuntu |
cakephp-mysql.yml |
CakePHP with PostgreSQL and Redis |
ubuntu |
cakephp-postgres.yml |
| CakePHP without services | macOS, ubuntu and windows |
cakephp.yml |
| CodeIgniter | macOS, ubuntu and windows |
codeigniter.yml |
Laravel with MySQL and Redis |
ubuntu |
laravel-mysql.yml |
Laravel with PostgreSQL and Redis |
ubuntu |
laravel-postgres.yml |
| Laravel without services | macOS, ubuntu and windows |
laravel.yml |
Lumen with MySQL and Redis |
ubuntu |
lumen-mysql.yml |
Lumen with PostgreSQL and Redis |
ubuntu |
lumen-postgres.yml |
| Lumen without services | macOS, ubuntu and windows |
lumen.yml |
Phalcon with MySQL |
ubuntu |
phalcon-mysql.yml |
Phalcon with PostgreSQL |
ubuntu |
phalcon-postgres.yml |
| Roots/bedrock | ubuntu |
bedrock.yml |
| Roots/sage | ubuntu |
sage.yml |
| Slim Framework | macOS, ubuntu and windows |
slim-framework.yml |
Symfony with MySQL |
ubuntu |
symfony-mysql.yml |
Symfony with PostgreSQL |
ubuntu |
symfony-postgres.yml |
| Symfony without services | macOS, ubuntu and windows |
symfony.yml |
Yii2 Starter Kit with MySQL |
ubuntu |
yii2-mysql.yml |
Yii2 Starter Kit with PostgreSQL |
ubuntu |
yii2-postgres.yml |
| Zend Framework | macOS, ubuntu and windows |
zend-framework.yml |
📜 License
- The scripts and documentation in this project are released under the MIT License.
- This project has multiple dependencies. Their licenses can be found in their respective repositories.
- The logo for
setup-phpis a derivative work of php.net logo and is licensed under the CC BY-SA 4.0 License.
👍 Contributions
Contributions are welcome! See Contributor's Guide. If you face any issues while using this or want to suggest a feature/improvement, create an issue here.
💖 Support This Project
If this action helped you.
- Sponsor the project by subscribing on Patreon or by contributing using Paypal. This project is also available as part of the Tidelift Subscription to support delivering enterprise-level maintenance.
- Please star the project and dependencies. If you blog, please share your experience of using this action with the community.
🔖 Dependencies
- Node.js dependencies
- mlocati/powershell-phpmanager
- ppa:ondrej/php
- shivammathur/homebrew-php
- shivammathur/homebrew-extensions
- shivammathur/php-builder