Как включить pcntl в php (при использовании структуры, такой как Symfony2)

c:\xampp\htdocs\login>php app/console server:start

Для выполнения этой команды требуется расширение pcntl.

Это ошибка, которую я получаю, когда пытаюсь запустить веб-сервер в моей среде symfony2.

Я нашел исправление, используя команду:

$ php app/console server:run

Но кто-то знает, почему server:start не работает на моем рабочем столе? Спасибо заранее.

Моя цель:

Запуск веб-сервера

Запуск приложения Symfony с использованием встроенного веб-сервера PHP так же просто, как выполнение команды server:start:

$ php app/console server:start

Ответ 1

В Windows

Вы не можете установить расширение pcntl в Windows. В соответствии с документацией PHP:

Примечание. Это расширение недоступно на платформах Windows.

Попробуйте использовать Vagrant или обычную виртуальную машину с дистрибутивами Linux, такими как Ubuntu, Debian или Mint.


В UNIX

Сначала введите в командной строке свою домашнюю директорию:

mkdir php
cd php
apt-get source php5
cd php5-(WHATEVER_RELEASE)/ext/pcntl
phpize
./configure
make

Затем сделайте это:

cp modules/pcntl.so /usr/lib/php5/WHEVER_YOUR_SO_FILES_ARE/
echo "extension=pcntl.so" > /etc/php5/conf.d/pcntl.ini

Закончено!


На Mac

Taken from fooobar.com/questions/198621/...!

Есть способ компилировать PCNTL как расширение и связать его с существующей сборкой PHP, но он немного углублен.

Я делаю следующее на Mac OSX Snow Leopard (64 бита), с MAMP и PHP версии 5.3.6. Не забудьте изменить номера версий PHP в следующих строках, если у вас они другие!

Обратите внимание, что требуется make, который не установлен по умолчанию в Mac OSX. Вам нужно установить это через инструменты разработчика Mac, http://developer.apple.com/unix/

Сначала загрузите tar-код исходного кода PHP, который соответствует версии, которую вы используете в MAMP (например, у меня 5.3.6), что вы можете сделать на http://www.php.net/releases/. Untar и CD для php- [версия]/ext/pcntl, например:

$ wget http://museum.php.net/php5/php-5.3.6.tar.gz
$ tar xvf php-5.3.6.tar.gz
$ cd php-5.3.6/ext/pcntl

Затем вам нужно запустить phpize в каталоге pcntl, который является двоичным файлом, который поставляется с MAMP:

pcntl$ /Applications/MAMP/bin/php/php5.3.6/bin/phpize

Это создает кучу файлов, необходимых для подготовки расширения к компиляции.

Теперь нам нужно добавить несколько флагов, чтобы он скомпилировал библиотеку с двойной 32-битной и 64-битной архитектурой, так как MAMP PHP был построен таким образом. Если вы этого не сделаете, скомпилированные общие объекты не будут работать.

pcntl$ MACOSX_DEPLOYMENT_TARGET=10.6
pcntl$ CFLAGS="-arch i386 -arch x86_64 -g -Os -pipe -no-cpp-precomp"
pcntl$ CCFLAGS="-arch i386 -arch x86_64 -g -Os -pipe"
pcntl$ CXXFLAGS="-arch i386 -arch x86_64 -g -Os -pipe"
pcntl$ LDFLAGS="-arch i386 -arch x86_64 -bind_at_load"
pcntl$ export CFLAGS CXXFLAGS LDFLAGS CCFLAGS MACOSX_DEPLOYMENT_TARGET

Затем мы можем запустить ./configure и make, чтобы построить наш общий объект:

pcntl$ ./configure
pcntl$ make

Это помещает файл с именем pcntl.so в каталог модулей. Скопируйте этот файл в каталог расширений MAMP PHP:

pcntl$ cp modules/pcntl.so /Applications/MAMP/bin/php/php5.3.6/lib/php/extensions/no-debug-non-zts-20090626/

Наконец, отредактируйте INI файл PHP, добавив в него расширение:

$ echo "extension=pcntl.so" >> /Applications/MAMP/bin/php/php5.3.6/conf/php.ini

PCNTL теперь должен быть включен. Чтобы проверить, был ли он добавлен, просто запустите:

$ /Applications/MAMP/bin/php/php5.3.6/bin/php --ri pcntl

pcntl

pcntl support => enabled

Если вы видите это, это сработало!


Полезные ресурсы

Для Windows:

Для операционных систем UNIX:

Для Mac:

Другая информация:

Ответ 2

Вам не хватает расширение pcntl в вашей системе. Это часть пакета php-cli, поэтому вам просто нужно сделать:

sudo apt-get install php-cli

Подробнее о doc для получения дополнительной информации

Ответ 3

Я написал следующий скрипт для установки расширения pcntl для Apache в наших системах Ubuntu, который работает по крайней мере на Ubuntu 16, и я ожидаю, что он также будет работать на Ubuntu 18, а также на других дистрибутивах с похожим макетом упаковки/установки PHP/Apache:

#! /bin/bash

php_ver=$(php -r 'print(join(".",array_slice(explode(".",phpversion()), 0, 2)));')
php_api_ver=$(php-config --phpapi)
pkg="php$php_ver"
mods_dir=/usr/lib/php/$php_api_ver/
php_conf_dir=/etc/php/$php_ver/apache2/conf.d
set -e
work_dir=/tmp/php-pcntl
rm -rf $work_dir
mkdir -p $work_dir
cd $work_dir
apt-get source $pkg
cd $pkg-$php_ver.*/ext/pcntl
phpize
./configure
make -j 8
sudo cp modules/pcntl.so $mods_dir
echo "extension=pcntl.so" | sudo tee $php_conf_dir/10-pcntl.ini > /dev/null
echo "pcntl extension installed, now restart Apache and make sure it really works"

Возможно, вам потребуется позаботиться о нескольких предварительных требованиях в дополнение к обычной установке Apache/PHP: apt-get install php-dev php-cli, затем отредактируйте свой /etc/apt/sources.list и убедитесь, что соответствующая строка deb-src не прокомментирована, и выполните apt-get update. Тогда вы можете просто запустить скрипт, и он должен позаботиться об установке. Если все хорошо, rm -rf /tmp/php-pcntl - я намеренно исключил этот шаг из сценария на случай, если что-то пойдет не так, и мне нужно отладить содержимое этого каталога.

Обратите внимание, что вам необходимо убедиться, что ваш php.ini не отключает интересующие вас функции с помощью disable_functions=. Например. в Ubuntu 16 pcntl_signal() и некоторые другие отключены с помощью явной директивы php.ini.

Ответ 4

php-extension-library github содержит несколько файлов pcntl.so, которые вы можете легко загрузить для своей версии PHP и добавить в свои расширения и .ini.

Например, для php версии 7.3.9:

  1. Загрузите pcntl.so из репозитория здесь или прямо здесь.
  2. Переместить файл pcntl.so в расширения (например: /Applications/MAMP/bin/php/php7.3.9/lib/php/extensions/no-debug-non-zts-xxxxxxxx)
  3. Добавьте extension=pcntl.so к вашему .ini