Компилируем PHP 7.3 с pthreads под ubuntu 18

Многопоточность в php можно использовать, установив расширение pthreads. Для этого понадобится php с zts. Разберемся как настроить многопоточные вычисления в php на ubuntu 18.

Для версий ubuntu 14 и 16 можно установить php с ZTS (Zend Thread Safety) нужной версии из ppa репозитория ondrej/php-zts следующим способом:

sudo add-apt-repository ppa:ondrej/php-zts
sudo apt-get update
sudo apt-get install php7.3-zts

Однако, для ubuntu 18 сделать этого не выйдет. Будет следующая ошибка:

E: The repository ‘http://ppa.launchpad.net/ondrej/php-zts/ubuntu bionic Release’ does not have a Release file.
N: Updating from such a repository can’t be done securely, and is therefore disabled by default.

Поэтому выхода нет, придется собирать php из исходников с опцией —enable-maintainer-zts.

Для начала нужно обновить индекс пакетов и установить необходимые:

sudo apt update && \
sudo apt install -y libzip-dev bison autoconf build-essential pkg-config git-core \
libltdl-dev libbz2-dev libxml2-dev libxslt1-dev libssl-dev libicu-dev \
libpspell-dev libenchant-dev libmcrypt-dev libpng-dev libjpeg8-dev \
libfreetype6-dev libmysqlclient-dev libreadline-dev libcurl4-openssl-dev

Затем скачать исходники php из официального репозитория:

wget https://github.com/php/php-src/archive/php-7.3.4.tar.gz
tar --extract --gzip --file php-7.3.4.tar.gz

Готовимся к компиляции:

cd php-src-php-7.3.4
./buildconf --force
CONFIGURE_STRING="--prefix=/etc/zts-php/7.3 --with-bz2 --with-zlib --enable-zip --disable-cgi \
   --enable-soap --enable-intl --with-openssl --with-readline --with-curl \
   --enable-ftp --enable-mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd \
   --enable-sockets --enable-pcntl --with-pspell --with-enchant --with-gettext \
   --with-gd --enable-exif --with-jpeg-dir --with-png-dir --with-freetype-dir --with-xsl \
   --enable-bcmath --enable-mbstring --enable-calendar --enable-simplexml --enable-json \
   --enable-hash --enable-session --enable-xml --enable-wddx --enable-opcache \
   --with-pcre-regex --with-config-file-path=/etc/zts-php/7.3/cli \
   --with-config-file-scan-dir=/etc/zts-php/7.3/etc --enable-cli --enable-maintainer-zts \
   --with-tsrm-pthreads --enable-debug --enable-fpm \
   --with-fpm-user=www-data --with-fpm-group=www-data"
 
./configure $CONFIGURE_STRING

Компилируем php с поддержкой ZTS:

make && sudo make install

Сделаем ссылку на собранный php:

sudo ln -s /etc/zts-php/7.3/bin/php /usr/bin/zts-php

Проверяем, что все собралось как надо:

zts-php -v

Должна вывести что-то подобное:

PHP 7.3.4 (cli) (built: Jul 9 2019 18:37:40) ( ZTS DEBUG )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.4, Copyright (c) 1998-2018 Zend Technologies
with Zend OPcache v7.3.4, Copyright (c) 1999-2018, by Zend Technologies

Теперь добавим Pthreads.

Делаем нужные утилиты исполняемыми:

sudo chmod o+x /etc/zts-php/7.3/bin/phpize
sudo chmod o+x /etc/zts-php/7.3/bin/php-config

Дальше нужно выкачать исходный код Pthreads из репозитория:

git clone https://github.com/krakjoe/pthreads.git

Собираем и устанавливаем расширение в собранный php с zts:

cd pthreads
/etc/zts-php/7.3/bin/phpize
./configure \
--prefix='/etc/zts-php/7.3' \
--with-libdir='/lib/x86_64-linux-gnu' \
--enable-pthreads=shared \
--with-php-config='/etc/zts-php/7.3/bin/php-config'
make && sudo make install
cd php-src-php-7.3.4
sudo mkdir -p /etc/zts-php/7.3/cli/
sudo cp php.ini-production /etc/zts-php/7.3/cli/php.ini
echo "extension=pthreads.so" | sudo tee -a /etc/zts-php/7.3/cli/php.ini
echo "zend_extension=opcache.so" | sudo tee -a /etc/zts-php/7.3/cli/php.ini

Проверяем что все работает. Для этого можно запустить следующий код:

<?php
 
class Task extends Threaded
{
    private $value;
 
    public function __construct(int $i)
    {
        $this->value = $i;
    }
 
    public function run()
    {
        $s=0;
 
        for ($i=0; $i<10000; $i++)
        {
            $s++;
        }
 
        echo "Task: {$this->value}\n";
    }
}
 
# Создаем пул из 4 потоков
$pool = new Pool(4);
 
for ($i = 0; $i < 15000; ++$i) 
{
    $pool->submit(new Task($i));
}
 
while ($pool->collect());
 
$pool->shutdown();

Запускаем скрипт. Если он выполняется без ошибок и выводит в консоль неупорядоченные числа от 0 до 14999, значит все сделано правильно. Можно дальше экспериментировать с многопоточностью в php.

Запись опубликована в рубрике PHP & MySQL с метками , , . Добавьте в закладки постоянную ссылку.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre lang="" line="" escaped="" cssfile="">