MacOS自带的php如何安装扩展若干问题解决办法

php / 116人浏览 / 0人评论

由于把macOS的系统回退到了10.15,系统重做了,最近在给php安装扩展的时候遇到了一系列问题,例如phpize无法执行,macOS默认的扩展无法安装,找不到php.ini的目录等等,经过一系列操作终于搞定,顺便做个记录,我们只说问题和解决方案。

1.如何在macOS终端模式下,直接执行php脚本?

#检查PHP信息
#不需要任何浏览器,在Linux/MacOS 终端中也可以获得相同的结果。在L命令行中执行 /var/www/html/phpinfo.php ,如:
# php -f /var/www/html/phpinfo.php
#由于输出结果太大,我们可以通过管道将上述输出结果输送给 less 命令,这样就可以一次输出一屏了,命令如下:

# php -f /var/www/html/infophp.php | less

2.在终端模式下直接使用phpinfo()调试工具,不通过读取文件获取信息,只需执行如下命令:

#这里,‘-r‘ 选项会让PHP代码在Linux终端中不带 < 和 > 标记直接执行

# php -r 'phpinfo();'

3.macOS如何修改的php.ini?

MacOS中没有默认的php.ini文件,但是有对应的模版文件php.ini.default,位于:

/etc/php.ini.deault

#默认是没有php.ini的,可以复制一份并重命名为php.ini
sudo cp /etc/php.ini.default /etc/php.ini

4.MacOS安装扩展时,phpize执行报错,默认phpize在/usr/bin/phpize,直接执行会报“php.h: No such file or directory”


/usr/bin/phpize 
grep: /usr/include/php/main/php.h: No such file or directory
grep: /usr/include/php/Zend/zend_modules.h: No such file or directory
grep: /usr/include/php/Zend/zend_extensions.h: No such file or directory
Configuring for:
PHP Api Version:        
Zend Module Api No:     
Zend Extension Api No:

解决方案: A)打开命令行终端,运行以下命令,打印macOS sdk路径:

xcrun --show-sdk-path
#若执行成功则输出:
/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk
#如果执行失败,则需要安装xcode-select,然后继续打印sdk路径:
xcode-select --install

B)在当前用户下面创建文件夹php-home,复制程序phpize和php-config到 php-home目录。

mkdir ~/php-home/
cp /usr/bin/phpize ~/php-home/
cp /usr/bin/php-config ~/php-home/

查看当前用户PHP版本:

grep version= ~/php-home/php-config
#若执行成功则输出:
version="7.3.29"

C)分别下载phpize(通用)和php-config(分版本)的MaxOS通用补丁

phpize补丁内容:

--- /usr/bin/phpize 2019-09-11 02:46:18.000000000 +0200
+++ ./phpize    2019-12-26 23:10:32.000000000 +0100
@@ -1,11 +1,12 @@
 #!/bin/sh

 # Variable declaration
+XCODE_SDK_ROOT=$(/usr/bin/xcrun --show-sdk-path)
 prefix='/usr'
 datarootdir='/usr/php'
 exec_prefix="`eval echo ${prefix}`"
 phpdir="`eval echo ${exec_prefix}/lib/php`/build"
-includedir="`eval echo ${prefix}/include`/php"
+includedir="`eval echo ${XCODE_SDK_ROOT}${prefix}/include`/php"
 builddir="`pwd`"
 SED="/usr/bin/sed"

phpize通用补丁下载

php7.3.9版本php-config补丁下载

php7.3.11版本php-config补丁下载

php7.3.11版本php-config补丁内容如下:

--- /usr/bin/php-config 2019-09-11 02:48:43.000000000 +0200
+++ ./php-config    2019-12-26 23:10:19.000000000 +0100
@@ -1,12 +1,14 @@
 #! /bin/sh

+XCODE_SDK_ROOT=$(/usr/bin/xcrun --show-sdk-path)
+
 SED="/usr/bin/sed"
 prefix="/usr"
 datarootdir="/usr/php"
 exec_prefix="${prefix}"
 version="7.3.9"
 vernum="70309"
-include_dir="${prefix}/include/php"
+include_dir="${XCODE_SDK_ROOT}${prefix}/include/php"
 includes="-I$include_dir -I$include_dir/main -I$include_dir/TSRM -I$include_dir/Zend -I$include_dir/ext -I$include_dir/ext/date/lib"
 ldflags=" -L$SDKROOT/usr/lib -L$SDKROOT/usr/local/libressl/lib  -L/usr/local/lib"
 libs="-lresolv  -lcrypto -lssl -lcrypto -lexslt -ltidy -lresolv -ledit -lncurses -lpq -lpq -lldap -llber -liconv -liconv -lpng -lz -ljpeg -lcrypto -lssl -lcrypto -lbz2 -lz -lcrypto -lssl -lcrypto -lm  -lxml2 -lz -licucore -lm -lkrb5 -lcurl -lxml2 -lz -licucore -lm -lxml2 -lz -licucore -lm -lnetsnmp -lxml2 -lz -licucore -lm -lxml2 -lz -licucore -lm -lxml2 -lz -licucore -lm -lxml2 -lz -licucore -lm -lxml2 -lz -licucore -lm -lxml2 -lz -licucore -lm -lxslt -lxml2 -lz -licucore -lm "

D)给php-home文件夹中的phpize和php-config进行打补丁,新建php-home文件夹进行隔离是为了不影响默认phpize和php-config的配置,执行如下命令:

#PHP 7.3.9操作方法:
patch ~/php-home/phpize < ~/Downloads/phpize-catalina.patch
patch ~/php-home/php-config < ~/Downloads/php-config-7.3.9-catalina.patch
#PHP 7.3.11操作方法:
patch ~/php-home/phpize < ~/Downloads/phpize-catalina.patch
patch ~/php-home/php-config < ~/Downloads/php-config-7.3.11-catalina.patch

到目前为止,phpize执行报错,默认phpize在/usr/bin/phpize,直接执行会报“php.h: No such file or directory”已经解决完毕,可以找一个对应版本的扩展目录,执行一下phpize查看效果:

leeblog@leeblogMacBook-Pro mysqli % ~/php-home/phpize
Configuring for:
PHP Api Version:         20180731
Zend Module Api No:      20180731
Zend Extension Api No:   320180731

5.phpize执行报错,报“Cannot find autoconf. Please check your autoconf installation and the,$PHP_AUTOCONF environment variable. Then, rerun this script”

#如果 phpize 输出以下内容, 就代表我们需要安装autoconf
Cannot find autoconf. Please check your autoconf installation and the
$PHP_AUTOCONF environment variable. Then, rerun this script.

解决方案:

#下载autoconf
curl -OL http://ftpmirror.gnu.org/autoconf/autoconf-2.69.tar.gz
#解压包
tar xzf autoconf-2.69.tar.gz
cd autoconf-2.69

#编译安装
./configure --prefix=/usr/local
make
sudo make install

安装完autoconf后继续执行phpize,报错会消失,问题解决。

6.“sudo ln -s /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/ /usr/include” 报错

macOS默认的PHP在编译安装php扩展时,做include软连接的时候,常见的有两种错误:

A)第一种情况:operation not permitted 解决办法:

1.重启您的Mac,并在开机时长按command + R
2.进入之后,找到终端,执行代码:csrutil disable,关闭系统保护
备注:如果你后面想重新开启系统保护,执行:csrutil enable

B)第二种情况:ln: /usr/include: Read-only file system 解决方案:

#执行代码(非重启状态下解除系统的写保护):
sudo mount -uw 
#重新进行phpize
sudo phpize
#再次编译,并标明php-config的路径
./configure --with-php-config=/usr/bin/php-config
#编译、安装,执行成功后在php.ini中开启相应扩展,整个流程走完 
 sudo make && sudo make install

到目前为止,在macOS重装php环境是遇到的这一些列问题,做了一个简单总结,后续有问题会随时更新,欢迎喜欢编程的小伙伴一起来交流,共同进步,也欢迎大家多关注我的博客leeblog:blog.ruizelee.com

评论列表

还没有人发表评论

发表评论 取消回复