Я создал как 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
для обеих сборников также поможет.