如何在PHP中启用pcntl(同时使用像Symfony 2这样的框架)


How to enable pcntl in PHP (while using a framework like Symfony 2)

考虑:

cd c:'xampp'htdocs'login
php app/console server:start

此命令需要 pcntl 扩展才能运行。

这是我尝试在我的Symfony 2环境中启动Web服务器时遇到的错误...

我通过使用以下命令找到了修复程序:

php app/console server:run

但是为什么server:start在我的桌面上不起作用?

我的目标是:

  1. 启动 Web 服务器

  2. 使用PHP的内置Web服务器运行Symfony应用程序就像执行server:start命令一样简单:

    php app/console server:start
    

在 Windows 上

您无法在 Windows 上安装 pcntl 扩展。根据 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 上

摘自如何在 PHP MAMP 中启用进程控制扩展 (PCNTL( 的答案?!

有一种方法可以将PCNTL编译为扩展并将其链接到现有的PHP构建中,但它有点深入。

我在Mac OS X v10.6(Snow Leopard((64位(上使用MAMP和PHP版本5.3.6执行以下操作。请记住在以下行中更改PHP版本号,如果您的版本号不同!

请注意,make必需的,默认情况下不会在 Mac OS X 上安装。您需要通过Mac开发人员工具安装它,http://developer.apple.com/unix/。

首先,下载与您在 MAMP 中使用的版本匹配的 PHP 源代码的 tar(例如,我的版本是 5.3.6(,您可以在不支持的历史版本中执行此操作。Untar 和 cd to php-[version]/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

然后,您需要在 pcntl 目录中运行phpize,该目录是 MAMP 附带的二进制文件:

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

这将创建一堆准备编译扩展所需的文件。

我们现在需要添加一些标志来告诉它编译具有双 32 位和 64 位架构的库,因为 MAMP PHP 就是以这种方式构建的。如果不这样做,编译的共享对象将不起作用。

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

然后,我们可以运行./configuremake来构建我们的共享对象:

./configure
make

这会将一个名为 pcntl.so 的文件放在模块目录中。将此文件复制到 MAMP 的 PHP 扩展目录:

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

最后,编辑 PHP INI 文件以包含扩展名:

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 中安装 PCNTL 扩展?
  • 在简单测试中使用 proc_open(( 而不是 pcntl_fork((

对于 Unix 操作系统:

  • http://www.crimulus.com/2010/07/30/howto-enable-pcntl-in-ubuntu-php-installations/

对于 Mac:

  • 如何在 PHP MAMP 中启用进程控制扩展 (PCNTL(?
  • 安装适用于 PHP 的 PCNTL 模块而无需重新编译

其他信息:

  • [DX] 如果服务器:启动缺少 pcntl #12153,则显示一条消息

GitHub 上的 php-extension-library 有几个 pcntl.so 文件,您可以轻松下载这些文件,并添加到您的扩展和.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

对于 Docker

你可以像这样使用 docker-php-extension-installer:

# Dockerfile
ADD https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/
RUN chmod +x /usr/local/bin/install-php-extensions && '
    install-php-extensions pcntl

然后激活 php.ini 文件中的扩展名:

extension=pcntl.so

您的系统中缺少pcntl扩展。这是php-cli包的一部分,因此您只需要执行以下操作:

sudo apt-get install php-cli

有关详细信息,请查看文档。

我编写了以下脚本来在我们的 Ubuntu 系统上安装 Apache 的 pcntl 扩展,它至少适用于 Ubuntu 16.04(Xenial Xerus(,我预计也将适用于 Ubuntu 18.04(仿生海狸(,以及其他具有类似 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.04 上,pcntl_signal() 和其他一些功能都通过明确的 php.ini 指令被禁用。

目前没有在 Windows 机器中启用pcntl的选项。根据关于 pcntl 的 php 官方文档

查看有关 pcntl 的 php 官方文档