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.6toPHP 7.4 | 
| Ubuntu 18.04 | ubuntu-latestorubuntu-18.04 | PHP 7.1toPHP 7.4 | 
| Ubuntu 20.04 | ubuntu-20.04 | PHP 7.4 | 
| Windows Server 2019 | windows-latestorwindows-2019 | PHP 7.4 | 
| macOS 10.15 Catalina | macos-latestormacos-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 on- Ubuntuand- macOS.
- 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 MySQLandRedis | ubuntu | cakephp-mysql.yml | 
| CakePHP with PostgreSQLandRedis | ubuntu | cakephp-postgres.yml | 
| CakePHP without services | macOS,ubuntuandwindows | cakephp.yml | 
| CodeIgniter | macOS,ubuntuandwindows | codeigniter.yml | 
| Laravel with MySQLandRedis | ubuntu | laravel-mysql.yml | 
| Laravel with PostgreSQLandRedis | ubuntu | laravel-postgres.yml | 
| Laravel without services | macOS,ubuntuandwindows | laravel.yml | 
| Lumen with MySQLandRedis | ubuntu | lumen-mysql.yml | 
| Lumen with PostgreSQLandRedis | ubuntu | lumen-postgres.yml | 
| Lumen without services | macOS,ubuntuandwindows | 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,ubuntuandwindows | slim-framework.yml | 
| Symfony with MySQL | ubuntu | symfony-mysql.yml | 
| Symfony with PostgreSQL | ubuntu | symfony-postgres.yml | 
| Symfony without services | macOS,ubuntuandwindows | symfony.yml | 
| Yii2 Starter Kit with MySQL | ubuntu | yii2-mysql.yml | 
| Yii2 Starter Kit with PostgreSQL | ubuntu | yii2-postgres.yml | 
| Zend Framework | macOS,ubuntuandwindows | 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
