# Contributing to PHP 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. ## Pull requests PHP welcomes pull requests to [add tests](#writing-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](http://php.net/supported-versions.php) are supported). For example, at the time of writing in early-2018, the lowest supported version is PHP 7.1, which corresponds to the `PHP-7.1` branch in Git. Please also make sure you add a link to the PR in the bug on [the bug tracker](https://bugs.php.net/). 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`. ## Filing bugs Bugs can be filed on the [PHP bug tracker](https://bugs.php.net/). If this is the first time you've filed a bug, we suggest reading the [guide to reporting a bug](https://bugs.php.net/how-to-report.php). Where possible, please include a self-contained reproduction case! ## Feature requests Feature requests are generally submitted in the form of [Requests for Comment](https://wiki.php.net/rfc/howto), ideally accompanied by [pull requests](#pull-requests). You can find the extremely large list of RFCs that have been previously considered on the [PHP Wiki](https://wiki.php.net/rfc). You may want to read [The Mysterious PHP RFC Process](https://blogs.oracle.com/opal/entry/the_mysterious_php_rfc_process) for additional notes on the best way to approach submitting an RFC. ## Writing tests We love getting new tests! PHP is a huge project and improving code coverage is a huge win for every PHP user. [Our QA site includes a page detailing how to write test cases.](http://qa.php.net/write-test.php) Please note that the section on submitting pull requests is outdated: in addition to the process listed there, you can also [submit pull requests](#pull-requests). ## Writing documentation There are two ways to contribute to the PHP manual. You can edit the manual and send patches anonymously via [the online editor](https://edit.php.net/), or you can check the XML source out from Subversion and edit that and build it [per the instructions on the documentation site](http://doc.php.net/tutorial/). Patches created that way should be sent to the [documentation mailing list](mailto:phpdoc@lists.php.net). ## Getting help 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](mailto:internals@lists.php.net), or the [documentation mailing list](mailto:phpdoc@lists.php.net) for documentation issues. Although not a formal channel, you can also find a number of core developers on the #php.pecl channel on [EFnet](http://www.efnet.org/). Similarly, many documentation writers can be found on #php.doc. ## PHP source code directory structure PHP source code also includes several files generated during development and several parts where maintenance is happening upstream in their respective locations. ```bash / ├─ .git/ # Git configuration and source directory └─ TSRM/ # Thread Safe Resource Manager └─ m4/ # https://github.com/autoconf-archive/autoconf-archive └─ ax_func_which_gethostbyname_r.m4 └─ ... └─ Zend/ # Zend Engine ├─ zend_language_scanner.c # Generated by re2c ├─ zend_language_scanner_defs.h # Generated by re2c ├─ zend_ini_scanner.c # Generated by re2c ├─ zend_ini_scanner_defs.h # Generated by re2c ├─ 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` └─ ... ├─ appveyor/ # Appveyor CI service files └─ build/ # *nix build system files ├─ ax_check_compile_flag.m4 # https://github.com/autoconf-archive/autoconf-archive ├─ ax_gcc_func_attribute.m4 # https://github.com/autoconf-archive/autoconf-archive ├─ libtool.m4 # https://git.savannah.gnu.org/cgit/libtool.git ├─ shtool # https://www.gnu.org/software/shtool/ └─ ... └─ 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 └─ ... └─ ... └─ 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 └─ ... └─ json/ ├─ json_parser.tab.c # Generated by bison ├─ json_parser.tab.h # Generated by bison ├─ json_scanner.c # Generated by re2c ├─ php_json_scanner_defs.h # Generated by re2c └─ ... └─ mbstring/ ├─ libmbfl/ # Forked and maintained in php-src ├─ oniguruma/ # Bundled https://github.com/kkos/oniguruma ├─ oniguruma.patch # Modifications patch from upstream oniguruma ├─ unicode_data.h # Generated by `ext/mbstring/ucgendat/ucgendat.php` └─ ... └─ pcre/ ├─ pcre2lib/ # https://www.pcre.org/ └─ ... └─ pdo/ ├─ pdo_sql_parser.c # Generated by re2c └─ ... └─ pdo_mysql/ ├─ php_pdo_mysql_sqlstate.h # Generated by `ext/pdo_mysql/get_error_codes.php` └─ ... └─ phar/ ├─ phar_path_check.c # Generated by re2c └─ ... └─ skeleton/ # Skeleton for developing new extensions with `ext/ext_skel.php` └─ ... └─ sqlite3/ ├─ libsqlite/ # https://www.sqlite.org mirror: https://github.com/mackyle/sqlite └─ ... └─ 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` ├─ url_scanner_ex.c # Generated by re2c ├─ var_unserializer.c # Generated by re2c └─ ... └─ tokenizer/ ├─ tokenizer_data.c # Generated by `ext/tokenizer/tokenizer_data_gen.sh` └─ ... └─ xmlrpc/ ├─ libxmlrpc/ # Forked and maintained in php-src └─ ... └─ 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` └─ ... └─ phpdbg/ ├─ phpdbg_lexer.c # Generated by re2c ├─ phpdbg_parser.c # Generated by bison ├─ phpdbg_parser.h # Generated by bison └─ ... └─ ... ├─ scripts/ # php-config, phpize and internal development scripts ├─ tests/ # Core features tests ├─ travis/ # Travis CI service files └─ win32/ # Windows build system files ├─ cp_enc_map.c # Generated by `win32/cp_enc_map_gen.exe` └─ ... ├─ config.guess # https://git.savannah.gnu.org/cgit/config.git ├─ config.sub # https://git.savannah.gnu.org/cgit/config.git ├─ ltmain.sh # https://git.savannah.gnu.org/cgit/libtool.git └─ ... ```