MediaWiki-Docker/Configuration recipes/Develop PHP extension

Wikimedia maintains a number of native PHP extensions written in C, this includes: Excimer, Wmerrors, LuaSandbox

Quick install

edit

Our packages should be available from apt-get in all supported PHP versions. We generally upstream to Debian stable, which MediaWiki-Docker uses, and the production version will also be packaged in apt.wikimedia.org which is pre-configured in MediaWiki containers that use the production PHP version. E.g. apt-get install php-excimer.

If you use a MediaWiki-Docker container with a PHP version different from production, then the container will have https://deb.sury.org/ pre-configured and makes packages available suitable to your PHP version, e.g. php8.1-excimer.

Compile

edit

To test changes to a C extension to PHP in the same environment as MediaWiki, largely:

  • Keep the relevant Git checkout somewhere under mediawiki/ to make it easier to interact with from the container (automatically mounted).
  • Ensure php-dev is installed.
  • Follow regular steps using make as per individual README.
you:mediawiki$ mkdir tmp/ && cd tmp/
you:mediawiki/tmp$ git clone ssh://gerrit.wikimedia.org:29418/mediawiki/php/excimer

you:mediawiki$ docker compose exec -u root mediawiki bash
root@container:mediawiki$ apt-get install php-dev

root@container:mediawiki/tmp/excimer$ phpize
root@container:mediawiki/tmp/excimer$ ./configure
root@container:mediawiki/tmp/excimer$ make
root@container:mediawiki/tmp/excimer$ make install

# Confirm:
root@container:mediawiki/tmp/excimer$ php -d 'extension=excimer.so' -i | fgrep excimer
  excimer support => enabled
  excimer version => x.x.x

# Enable for Apache and php-cli
$ echo 'extension=wikidiff2.so' > /etc/php/8.1/mods-available/wikidiff2.ini
$ ln -s /etc/php/8.1/mods-available/wikidiff2.ini /etc/php/8.1/apache2/conf.d/wikidiff2.ini
$ ln -s /etc/php/8.1/mods-available/wikidiff2.ini /etc/php/8.1/cli/conf.d/wikidiff2.ini
$ ln -s /etc/php/8.1/mods-available/wikidiff2.ini /etc/php/8.1/fpm/conf.d/wikidiff2.ini