Как загрузить расширение pthreads в CLI?

Я создал как php, так и Apache из источника на MAC OSX 10.11.

У меня возникли проблемы с загрузкой расширения pthreads в CLI. Я неправильно понял, как его загрузить, и теперь я действительно не понимаю, что мне делать.

Вот что я сделал до сих пор.

Я настроил php со следующей командой:

'./configure' '--prefix=/Users/username/Terminal/WebServer' '--with-apxs2=/Users/username/Terminal/WebServer/bin/apxs' '--enable-maintainer-zts' '--enable-pthreads=shared' '--enable-debug' '--with-tsrm-pthreads' '--with-config-file-path=/Users/username/Terminal/WebServer/ini' '--enable-cli' 

Загруженные модули Apache:

 Compiled in modules: core.c mod_so.c http_core.c worker.c 

Итак, в каталоге / Users / username / Terminal / WebServer / ini я создал файл php-cli.ini и добавил extension=pthreads.so , затем я запустил команду php -m , следующим будет вывод:

 [PHP Modules] Core ctype date dom fileinfo filter hash iconv json libxml pcre PDO pdo_sqlite Phar posix <strong>pthreads</strong> Reflection session SimpleXML SPL sqlite3 standard tokenizer xml xmlreader xmlwriter [Zend Modules] 

Я перезапустил Apache и открыл файл index.php котором есть phpinfo() .
Известная информация

Configuration File (php.ini) Path => /Users/username/Terminal/WebServer/ini
Loaded Configuration File => /Users/username/Terminal/WebServer/ini/php.ini
Scan this dir for additional .ini files => (none)
Additional .ini files parsed => (none)
Thread Safety => Enabled

phpinfo() не включает информацию о модуле pthreads, и я не знаю, нужно ли это делать или нет.
в этот момент я открываю файл test.php, который включает следующий скрипт pthreads:

 <?php $thread = new class extends Thread { public function run() { echo "Hello World\n"; } }; $thread->start() && $thread->join(); ?> 

и выход через apache:

Fatal error: Class 'Thread' not found in /Users/username/Sites/test.php on line 1

Когда я запускаю следующую команду в терминале
$ php /Users/username/Sites/test.php

Результат: Hello World

Итак, вопрос в том, как правильно загрузить расширение pthreads в CLI?

У вас уже есть желаемый результат, но, похоже, не знаете, почему …

Ключевыми частями вашей конфигурации являются:

configure параметры

Если PHP создается с помощью Apache DSO SAPI, вы должны использовать --enable-pthreads=shared , это приводит к тому, что процесс сборки создает DSO (общий объект, dll в окнах) из библиотеки pthreads, вместо статической привязки pthreads к Apache DSO.

Конфигурация php.ini

Из руководства по PHP:

Если существует php-SAPI.ini (где SAPI используется SAPI, то есть, например, php-cli.ini или php-apache.ini), он используется вместо php.ini. Имя SAPI можно определить с помощью php_sapi_name ().

Создав pthreads shared (pthreads.so), мы можем просто создать php-cli.ini по тому же пути, что и php.ini и добавить extension=pthreads.so к нему.


Однако у вас есть работы, но это не идеально. Вы не хотите, чтобы Apache использовал интерпретатор PHP, который имеет накладные расходы на ZTS.

В идеале вы захотите дважды создать и установить PHP:

Первый сбор

configure --with-apxs=... --disable-pthreads --prefix=/system/prefix --with-config-file-path=/system/prefix/etc

Замените /system/prefix/ с помощью чувствительного системного префикса, например, /usr/

Когда вы создадите эту сборку, вы создадите идеальную установку для Apache, которая включает в себя не-потоковый безопасный PHP-файл в /system/prefix/bin/php со всеми связанными сценариями ( pecl , phpize , php-config и т. Д.), in /system/prefix/bin .

Вторая сборка

Перед этой сборкой вам нужно make clean (если вы используете деблокирующий архив) или vcsclean (если вы используете локальный репозиторий git).

configure --enable-maintainer-zts --enable-pthreads=static --prefix=/special/prefix --with-config-file-path=/special/prefix/etc

Замените /special/prefix/ с помощью специального специального префикса, например /opt/ , не используйте тот же префикс, что и первая сборка …

Когда вы make install первая установка не затрагивается, вместо нее создается новая установка без поддержки Apache, но с поддержкой pthreads, встроенных статически в двоичный файл (без конфигурации).

Бинарный файл будет в /special/prefix/bin/php со всеми связанными сценариями в /special/prefix/bin .

Электромонтажные сборки вместе

Если для обеих сборщиков требуются те же расширения PECL, за исключением pthreads, вы можете использовать один и тот же --with-config-file-scan-dir для обеих сборщиков.

Если вы действительно смелы, вы можете использовать один и тот же ключ --with-config-file-path , но это может иметь нежелательные результаты.

Редактирование include_path для обеих сборников также поможет.