我该如何在PHP MAMP中启用进程控制扩展(PCNTL)?

30

我正在使用 MAMP ,并且需要在当前的 MAMP 安装中开启 -pcntl 功能。

我该如何操作呢?

6个回答

59

有一种方法可以将PCNTL编译为扩展,并将其链接到现有的PHP构建中,但这需要一些深入的了解。

我正在使用 Mac OS X v10.6 (Snow Leopard) (64 bit)、MAMP和PHP版本5.3.6进行以下操作。如果你的PHP版本不同,请记得在以下行中更改。

请注意,make是必须的,而它在Mac OS X上默认未安装。你需要通过Mac开发人员工具来安装它。

首先,下载与你在MAMP中使用的PHP版本相匹配的PHP源代码的tar文件(例如,我的版本是5.3.6),你可以在Unsupported Historical Releases找到它。然后解压并转到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

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

cd php-5.3.6/ext/pcntl
/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

如果您看到了这个,那么它已经起作用了!如果出现任何问题,您可以从MAMP PHP扩展目录中删除pcntl.so文件,并删除INI设置,然后再次尝试。


8
如果在运行make后遇到了error: ‘PHP_FE_END’ undeclared here (not in a function),请将pcntl.c文件中所有出现的PHP_FE_END替换为{NULL,NULL,NULL} - Matthew
1
有什么线索吗?我得到了“Zend/zend_signal.h不存在”的错误。当我检查时,它确实存在。 - TeaCupApp
7
如果你的系统上有多个 php 版本(如在 Lion 中),则在 ./configure 步骤时可能需要指定 php-config 的位置。这将类似于:./configure --with-php-config=/Applications/MAMP/bin/php/php5.4.10/bin/php-config - jverdi
能否通过命令行使PHP可用?我是通过MAMP安装的php,但在执行此操作后,该模块仍不存在。然而,它确实对Apache正在使用的那个模块可用。 - kyle
1
@kyle MAMP的PHP和CLI PHP使用不同的INI文件,因此请确保两者都启用了该扩展。 - Jon Cairns
显示剩余3条评论

5
如果您的Mac上安装了 Homebrew(可执行文件 brew ),则应该能够执行以下操作:
brew install php53-pcntl

虽然我不是MAMP方面的专家。

brew install php53-pcntl
brew info php53-pcntl

输出:

Warning: php53-pcntl-5.3.25 already installed

php53-pcntl: stable 5.3.25
http://php.net/manual/en/book.pcntl.php
/usr/local/Cellar/php53-pcntl/5.3.23 (3 files, 32K)
  Built from source
/usr/local/Cellar/php53-pcntl/5.3.25 (3 files, 32K) *
  Built from source
https://github.com/josegonzalez/homebrew-php/commits/master/Formula/php53-pcntl.rb
==> Dependencies
Build: autoconf
Required: php53
==> Options
--without-config-file
    Do not add ext-pcntl.ini to /usr/local/etc/php/5.3/conf.d
--without-homebrew-php
    Ignore homebrew PHP and use default instead
==> Caveats
To finish installing pcntl for PHP 5.3:
  * /usr/local/etc/php/5.3/conf.d/ext-pcntl.ini was created,
    do not forget to remove it upon extension removal.
  * Restart your webserver.
  * Write a PHP page that calls "phpinfo();"
  * Load it in a browser and look for the info on the pcntl module.
  * If you see it, you have been successful!

没有这样的brew公式存在。 - Bob Gregor
2
是的,它确实可以。在你给负评之前,你需要更好地进行研究。 - Ian Lewis
这取决于安装的 PHP BREW 版本 - 它似乎与 MAMP 不兼容 - 这也是最初的问题。 - Bob Gregor
除了php56-pcntl目前有点问题,brew无法安装它之外,它在我的MAMP版本(带有php 5.6.1)上运行良好。 - Mario Dian
2
这适用于MAMP。首先安装phpXX-pcntl,然后将pcntl.so复制到正确的文件夹中(检查brew的输出以获取正确的路径): cp /usr/local/Cellar/php71-pcntl/7.1.8_15/pcntl.so /Applications/MAMP/bin/php/php7.1.1/lib/php/extensions/no-debug-non-zts-20160303/ - Michiel

3

为了方便我的生活,我做了一个脚本,源自其他帖子。我用它来向 MAMP 添加扩展 pcntl、sysvmsg、sysvshm、sysvsem 等。要使用它,cd 到扩展目录或将目录作为参数传递给脚本。例如:./addExtension.sh php-5.3.6/ext/pcntl

#!/bin/bash
DIR=$1
MAMP_PHP=$2
if [ -z "$DIR" ]
then
  DIR=`pwd`
fi

if [ -z "$MAMP_PHP" ]
then
  MAMP_PHP='/Applications/MAMP/bin/php/php5.3.6'
fi

EXTENSION=${DIR##*/}

echo Extension: $EXTENSION

cd $DIR

eval "${MAMP_PHP}/bin/phpize"


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

./configure
make

cp modules/${EXTENSION}.so "${MAMP_PHP}/lib/php/extensions/no-debug-non-zts-20090626/"

PHP_INI_PATH="${MAMP_PHP}/conf/php.ini"
sed -e "/extension=${EXTENSION}.so/ d" $PHP_INI_PATH > TMP
mv TMP $PHP_INI_PATH
echo "extension=${EXTENSION}.so" >> $PHP_INI_PATH

eval "${MAMP_PHP}/bin/php --ri ${EXTENSION}"

2
我找到了一些略有不同的指示,适用于 Mac OS X v10.10(Yosemite)和使用 PHP 5.6.2 的 MAMP。
指示在这里找到: 如何在 OS X 10 MAMP 中使 Artisan Tinker 工作
wget http://museum.php.net/php5/php-5.6.2.tar.gz
tar -xzvf php-5.6.2.tar.gz
mv php-5.6.2 php
mkdir -p /Applications/MAMP/bin/php/php5.6.2/include
mv php /Applications/MAMP/bin/php/php5.6.2/include

cd /Applications/MAMP/bin/php/php5.6.2/include/php
./configure

MACOSX_DEPLOYMENT_TARGET=10.10
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

cd ext/pcntl
phpize
./configure
make
cp modules/pcntl.so /Applications/MAMP/bin/php/php5.6.2/lib/php/extensions/no-debug-non-zts-20131226

2
我使用MacPorts解决了这个问题。
我运行了以下命令:
sudo port install php5-pcntl

1
请在您的回答中提供更多解释。 - Sulthan Allaudeen

0
  1. Unsupported Historical Releases下载PHP实现

  2. tar -xzvf php-7.3.8.tar.gz(我们将命名输出文件夹为PhpSrcFolder

  3. 确保您的MAMP bin目录在您的路径中→ echo $PATH。您需要它所拥有的额外工具才能执行此操作。(如果您已经在$PATH中拥有mamp的bin,请跳至步骤5。)

  4. 您可以按照以下方式将MAMP的bin添加到您的路径中,首先从~/.profile中提取MAMP使用的PHP版本(PS:MAMP在后者中添加了php别名),然后根据使用的版本将MAMP bin添加到PATH中。

    export PHP_VERSION=`grep "alias php" ~/.profile | cut -d"/" -f6 | cut -c4-`
    \# 指向您的php.ini文件夹以使用相同的php设置
    export PHPRC="/Library/Application Support/appsolute/MAMP PRO/conf/"
    export PATH=/Applications/MAMP/bin/php/php$PHP_VERSION/bin:$PATH
    
    ### PS:关闭并重新打开终端
    
  5. PhpSrcFolder/ext/pcntl复制到/Applications/MAMP/bin/php/php7.3.8/include/php/ext/pcntl

  6. 进入/Applications/MAMP/bin/php/php7.3.8/include/php/ext/pcntl,然后运行phpize命令。请注意,您还需要安装Xcode和相关工具。

  7. 然后,您应该能够运行./configure && make && make install。这将在/Applications/MAMP/bin/php/php7.3.8/include/php/ext/pcntl/modules/pcntl.so中构建扩展名,将其复制并粘贴到/Applications/MAMP/bin/php/php7.3.8/lib/php/extensions/no-debug-non-zts-20180731/pcntl.so

  8. 现在,编辑php.ini并像其他任何扩展一样启用模块。通过运行which php获取加载的php.ini路径,对我来说是:/Library/Application Support/appsolute/MAMP PRO/conf/php7.3.8.ini,并重新检查它是否具有pcntl扩展:

    [pcntl]
    
    extension=pcntl.so
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接