Anybody who programs in PHP can be a contributing member of the community that develops and deploys it; the task of deploying PHP, documentation and associated websites is a never-ending one. With every release or release candidate comes a wave of work, which takes a lot of organization and co-ordination.
You don't need any special access to download, build, debug and begin submitting PHP or PECL code, tests or documentation. Once you've followed this guide and had several contributions accepted, commit privileges are often quickly granted.
PHP welcomes pull requests to add tests, fix bugs and to implement RFCs. Please be sure to include tests as appropriate!
If you are fixing a bug, then please submit your PR against the lowest actively
supported branch of PHP that the bug affects (only green branches on
the supported version page are
supported). For example, at the time of writing, the lowest supported version is
PHP 8.0, which corresponds to the PHP-8.0
branch in Git. Please also make sure
you add a link to the PR in the bug on the bug tracker
or the old bug tracker.
Pull requests implementing RFCs should be submitted against master
.
Pull requests should never be submitted against PHP-x.y.z
branches, as these
are only used for release management.
If your pull request exhibits conflicts with the base branch, please resolve
them by using git rebase
instead of git merge
.
Fork the official PHP repository and send a pull request. A notification will be sent to the pull request mailing list. Sending a note to PHP Internals list (internals@lists.php.net) may help getting more feedback and quicker turnaround. You can also add pull requests to bug reports and old bug reports.
Read Git access page for help on using Git to get and build PHP source code. We recommend to look at our workflow and our FAQ.
Bugs can be filed on GitHub Issues. If this is the first time you've filed a bug, we suggest reading the guide to reporting a bug.
Where possible, please include a self-contained reproduction case!
Feature requests are generally submitted in the form of Requests for Comments (RFC), ideally accompanied by pull requests. You can find the extremely large list of RFCs that have been previously considered on the PHP Wiki.
To create an RFC, discuss it with the extension maintainer, and discuss it on the development mailing list internals@lists.php.net. RFC Wiki accounts can be requested on https://wiki.php.net/start?do=register. PHP extension maintainers can be found in the EXTENSIONS file in the PHP source code repository. Mailing list subscription is explained on the mailing lists page.
You may also want to read The Mysterious PHP RFC Process for additional notes on the best way to approach submitting an RFC.
There are a number of technical resources on php-src. Unfortunately, they are scattered across different websites, and often outdated. Nonetheless, they can provide a good starting point for learning about the fundamentals of the code base.
We love getting new tests! PHP is a huge project and improving test coverage is a huge win for every PHP user.
Our QA site includes a page detailing how to write test cases.
Submitting test scripts helps us to understand what functionality has changed. It is important for the stability and maintainability of PHP that tests are comprehensive.
Failure conditions of zend_parse_parameters
, ZEND_PARSE_PARAMETERS()
and
similar functions should not be tested. These parameter parsing APIs are already
extensively tested, and additional tests only complicate future modifications.
For newly created tests, a --CREDITS--
section should no longer be included,
as test authorship is already accurately tracked by Git. If multiple authors
should be credited, the Co-authored-by
tag in the commit message may be used.
Editing the manual is done by checking out the XML sources using Git and editing and building it per the instructions on the documentation site.
If you are having trouble contributing to PHP, or just want to talk to a human about what you're working on, you can contact us via the internals mailing list, or the documentation mailing list for documentation issues.
Although not a formal channel, you can also find a number of core developers on the #php.pecl channel on EFnet. Similarly, many documentation writers can be found on #php.doc. Windows development IRC channel is available at #winphp-dev on FreeNode.
PHP source code also includes several files generated during development and several parts where maintenance is happening upstream in their respective locations.
<php-src>/
โโ .git/ # Git configuration and source directory
โโ TSRM/ # Thread Safe Resource Manager
โโ Zend/ # Zend Engine
โโ asm/ # Bundled from src/asm in https://github.com/boostorg/context
โโ zend_vm_execute.h # Generated by `Zend/zend_vm_gen.php`
โโ zend_vm_opcodes.c # Generated by `Zend/zend_vm_gen.php`
โโ zend_vm_opcodes.h # Generated by `Zend/zend_vm_gen.php`
โโ ...
โโ build/ # *nix build system files
โโ ax_*.m4 # https://github.com/autoconf-archive/autoconf-archive
โโ config.guess # https://git.savannah.gnu.org/cgit/config.git
โโ config.sub # https://git.savannah.gnu.org/cgit/config.git
โโ libtool.m4 # https://git.savannah.gnu.org/cgit/libtool.git
โโ ltmain.sh # https://git.savannah.gnu.org/cgit/libtool.git
โโ pkg.m4 # https://gitlab.freedesktop.org/pkg-config/pkg-config
โโ shtool # https://www.gnu.org/software/shtool/
โโ ...
โโ docs/ # PHP internals and repository documentation
โโ ext/ # PHP core extensions
โโ bcmath/
โโ libbcmath/ # Forked and maintained in php-src
โโ ...
โโ curl/
โโ sync-constants.php # The curl symbols checker
โโ ...
โโ date/
โโ lib/ # Bundled datetime library https://github.com/derickr/timelib
โโ parse_date.c # Generated by re2c 0.15.3
โโ parse_iso_intervals.c # Generated by re2c 0.15.3
โโ ...
โโ ...
โโ ffi/
โโ ffi_parser.c # Generated by https://github.com/dstogov/llk
โโ ...
โโ fileinfo/
โโ libmagic/ # Modified libmagic https://github.com/file/file
โโ data_file.c # Generated by `ext/fileinfo/create_data_file.php`
โโ libmagic.patch # Modifications patch from upstream libmagic
โโ magicdata.patch # Modifications patch from upstream libmagic
โโ ...
โโ gd/
โโ libgd/ # Bundled and modified GD library https://github.com/libgd/libgd
โโ ...
โโ mbstring/
โโ libmbfl/ # Forked and maintained in php-src
โโ unicode_data.h # Generated by `ext/mbstring/ucgendat/ucgendat.php`
โโ ...
โโ opcache/
โโ jit/
โโ ir/ # Bundled part of IR framework https://github.com/dstogov/ir
โโ pcre/
โโ pcre2lib/ # https://www.pcre.org/
โโ ...
โโ skeleton/ # Skeleton for developing new extensions with `ext/ext_skel.php`
โโ ...
โโ standard/
โโ html_tables/
โโ mappings/ # https://www.unicode.org/Public/MAPPINGS/
โโ ...
โโ credits_ext.h # Generated by `scripts/dev/credits`
โโ credits_sapi.h # Generated by `scripts/dev/credits`
โโ html_tables.h # Generated by `ext/standard/html_tables/html_table_gen.php`
โโ ...
โโ tokenizer/
โโ tokenizer_data.c # Generated by `ext/tokenizer/tokenizer_data_gen.sh`
โโ ...
โโ zend_test # For testing internal APIs. Not needed for regular builds.
โโ ...
โโ zip/ # Bundled https://github.com/pierrejoye/php_zip
โโ ...
โโ ...
โโ main/ # Binding that ties extensions, SAPIs, and engine together
โโ streams/ # Streams layer subsystem
โโ php_version.h # Generated by release managers using `configure`
โโ ...
โโ pear/ # PEAR installation
โโ sapi/ # PHP SAPI modules
โโ cli/
โโ mime_type_map.h # Generated by `sapi/cli/generate_mime_type_map.php`
โโ ...
โโ ...
โโ scripts/ # php-config, phpize and internal development scripts
โโ tests/ # Core features tests
โโ win32/ # Windows build system files
โโ cp_enc_map.c # Generated by `win32/cp_enc_map_gen.exe`
โโ ...
โโ ...
For information on PHP internal C functions see References about Maintaining and Extending PHP. Various external resources can be found on the web. A standard printed reference is the book "Extending and Embedding PHP" by Sara Golemon.
If you are fixing broken functionality in a PECL extension then create a bug or identify an existing bug at bugs.php.net. A bug can be used to track the change progress and prevent your changes getting lost in the PHP mail archives. Some PECL extensions have their own bug tracker locations and different contributing procedures.
If your change is large then create a Request for Comments (RFC), discuss it with the extension maintainer, and discuss it on the development mailing list pecl-dev@lists.php.net depending on the extension. PECL mailing list subscription is explained on the PECL support page.
Update any open bugs and add a link to the source of your change. Send the patch or pointer to the bug to pecl-dev@lists.php.net. Also CC the extension maintainer. Explain what has been changed by your patch. Test scripts should be included.
diff
and before testing./* */
style comments, not //
.make test
.make test
to check your change doesn't break other features.--enable-debug
which will show some kinds of memory errors
and check the PHP and web server error logs after running your PHP tests.--enable-zts
to check your change compiles and operates
correctly in a thread-safe PHP.If your change is easy to review and obviously has no side-effects, it might be committed relatively quickly.
Because PHP is a volunteer-driven effort, more complex changes will require patience on your side. If you do not receive feedback in a few days, consider bumping. Before doing this think about these questions:
Your name will likely be included in the Git commit log. If your change affects end users, a brief description and your name might be added to the NEWS file.
This section refers to contributors that have Git push access and make commit changes themselves. We'll assume you're basically familiar with Git, but feel free to post your questions on the mailing list. Please have a look at the more detailed information on Git.
PHP is developed through the efforts of a large number of people. Collaboration is a Good Thing(tm), and Git lets us do this. Thus, following some basic rules with regard to Git usage will:
Having said that, here are the organizational rules:
Respect other people working on the project.
Discuss any significant changes on the list before committing and get confirmation from the release manager for the given branch.
Look at EXTENSIONS file to see who is the primary maintainer of the code you want to contribute to.
If you "strongly disagree" about something another person did, don't start fighting publicly - take it up in private email.
If you don't know how to do something, ask first!
Test your changes before committing them. We mean it. Really. To do so use
make test
.
For development use the --enable-debug
switch to avoid memory leaks and the
--enable-zts
switch to ensure your code handles TSRM correctly and doesn't
break for those who need that.
Currently, we have the following branches in use:
Branch | |
---|---|
master | Active development branch for PHP 8.5, which is open for backwards incompatible changes and major internal API changes. |
PHP-8.4 | Is used to release the PHP 8.4.x series. This is a current stable version and is open for bugfixes only. |
PHP-8.3 | Is used to release the PHP 8.3.x series. This is a current stable version and is open for bugfixes only. |
PHP-8.2 | Is used to release the PHP 8.2.x series. This is a current stable version and is open for bugfixes only. |
PHP-8.1 | Is used to release the PHP 8.1.x series. This is an old stable version and is open for security fixes only. |
PHP-8.0 | This branch is closed. |
PHP-7.4 | This branch is closed. |
PHP-7.3 | This branch is closed. |
PHP-7.2 | This branch is closed. |
PHP-7.1 | This branch is closed. |
PHP-7.0 | This branch is closed. |
PHP-5.6 | This branch is closed. |
PHP-5.5 | This branch is closed. |
PHP-5.4 | This branch is closed. |
PHP-5.3 | This branch is closed. |
PHP-5.2 | This branch is closed. |
PHP-5.1 | This branch is closed. |
PHP-4.4 | This branch is closed. |
PHP-X.Y.Z | These branches are used for the release managers for tagging the releases, hence they are closed to the general public. |
The next few rules are more of a technical nature:
All non-security bugfix changes should first go to the lowest bugfix branch (i.e. 8.0) and then get merged up to all other branches. All security fixes should go to the lowest security fixes branch (i.e 7.4). If a change is not needed for later branches (i.e. fixes for features which were dropped from later branches) an empty merge should be done.
All news updates intended for public viewing, such as new features, bug fixes, improvements, etc., should go into the NEWS file of any stable release version with the given change. In other words, news about a bug fix which went into PHP-5.4, PHP-5.5 and master should be noted in both PHP-5.4/NEWS and PHP-5.5/NEWS but not master, which is not a public released version yet.
Do not commit multiple files and dump all messages in one commit. If you modified several unrelated files, commit each group separately and provide a nice commit message for each one. See example below.
Do write your commit message in such a way that it makes sense even without the corresponding diff. One should be able to look at it, and immediately know what was modified. Definitely include the function name in the message as shown below.
In your commit messages, keep each line shorter than 80 characters. And try to align your lines vertically, if they wrap. It looks bad otherwise.
If you modified a function that is callable from PHP, prepend PHP to the function name as shown below.
The format of the commit messages is pretty simple.
<max 79 characters short description>\n
\n
<long description, 79 chars per line>
\n
An Example from the git project (commit 2b34e486bc):
pack-objects: Fix compilation with NO_PTHREDS
It looks like commit 99fb6e04 (pack-objects: convert to use parse_options(),
2012-02-01) moved the #ifdef NO_PTHREDS around but hasn't noticed that the
'arg' variable no longer is available.
If you fix some bugs, you should note the bug ID numbers in your commit message.
Bug ID should be prefixed by #
.
Example:
Fixed bug #14016 (pgsql notice handler double free crash bug.)
When you change the NEWS file for a bug fix, then please keep the bugs sorted in decreasing order under the fixed version.
New source code files should include the following header block:
/*
+----------------------------------------------------------------------+
| Copyright (c) The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 3.01 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
| available through the world-wide-web at the following url: |
| https://www.php.net/license/3_01.txt |
| If you did not receive a copy of the PHP license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@php.net so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Author: |
+----------------------------------------------------------------------+
*/
Thank you for contributing to PHP!