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