PHP拓展是扩展PHP核心功能的重要组件,很多业务场景都需要依赖特定的拓展来实现对应能力,比如处理图片的GD拓展、连接Redis的Redis拓展等。安装PHP拓展的方式有多种,其中pecl是PHP官方提供的拓展管理工具,能够自动下载、编译、安装拓展,是很多开发者的首选方式。

PHP拓展的常规安装方式
1. 使用系统包管理器安装
如果是通过系统包管理器安装的PHP,比如Ubuntu的apt、CentOS的yum,可以直接通过包管理器安装对应的拓展包,这种方式不需要手动编译,兼容性也比较好。
以Ubuntu系统为例,安装Redis拓展的命令如下:
# 更新包列表 sudo apt update # 安装PHP Redis拓展,假设PHP版本是8.1,对应包名是php8.1-redis sudo apt install php8.1-redis # 重启PHP服务让拓展生效,fpm模式用下面的命令 sudo systemctl restart php8.1-fpm
2. 使用pecl工具安装
pecl是PHP Extension Community Library的缩写,是PHP官方的拓展仓库管理工具,适合安装一些包管理器里没有的拓展,或者需要指定版本的拓展。
首先确认pecl已经安装,一般PHP安装时会自带pecl,如果没有可以通过下面的命令安装:
# 安装pecl,不同系统命令不同,Ubuntu示例 sudo apt install php-pear
使用pecl安装拓展的基本命令是pecl install 拓展名,比如安装Redis拓展:
# 安装Redis拓展 sudo pecl install redis
安装完成后,需要在php.ini配置文件中添加拓展的加载配置,然后重启PHP服务即可。
pecl安装拓展提示权限不够的原因
使用pecl安装拓展时出现权限不够的报错,通常有以下几种原因:
- 当前执行pecl命令的用户没有写入PHP拓展目录的权限,pecl安装拓展时需要将编译好的拓展文件放到PHP的拓展目录中,默认目录一般是
/usr/lib/php/20210902这类路径,普通用户没有写入权限。 - 没有使用sudo执行命令,即使当前用户是管理员,直接执行pecl install命令也不会获取root权限,导致无法写入系统目录。
- PHP的拓展目录权限被修改过,原本的目录权限被设置为仅root可写,即使使用sudo也可能因为目录权限配置异常导致报错。
- pecl自身的缓存目录或者临时目录权限不足,编译过程中需要写入临时文件,如果临时目录权限不够也会触发权限报错。
pecl安装拓展权限不够的解决方法
1. 使用sudo执行pecl命令
最直接的解决方式是在pecl命令前加上sudo,获取root权限来执行安装操作,这样就能正常写入系统级的拓展目录。
# 使用sudo执行pecl安装命令 sudo pecl install redis
如果执行后还是提示权限不够,可以检查PHP的拓展目录权限,使用下面的命令查看拓展目录路径:
# 查看PHP拓展目录 php -i | grep extension_dir
2. 修改拓展目录权限
如果确认是拓展目录权限问题,可以临时修改拓展目录的权限,让当前用户有写入权限,安装完成后再改回原来的权限。
# 假设拓展目录是/usr/lib/php/20210902,修改目录权限为当前用户可写 sudo chmod 777 /usr/lib/php/20210902 # 执行安装命令,不需要sudo pecl install redis # 安装完成后恢复目录权限 sudo chmod 755 /usr/lib/php/20210902
3. 指定拓展安装目录到用户有权限的路径
如果不想修改系统目录权限,也可以在pecl安装时指定拓展的安装目录到用户自己的目录,比如/home/user/php_ext,之后在php.ini中指定这个目录加载拓展即可。
首先创建自定义拓展目录:
mkdir -p /home/user/php_ext
然后安装时指定安装路径:
# 指定拓展安装目录 pecl install --install-dir=/home/user/php_ext redis
之后在php.ini中添加如下配置:
# 指定拓展目录 extension_dir=/home/user/php_ext # 加载redis拓展 extension=redis.so
4. 清理pecl缓存和临时文件
如果是pecl的缓存或者临时目录权限问题,可以先清理pecl的缓存,再重新执行安装命令。
# 清理pecl缓存 sudo pecl clear-cache # 重新执行安装命令 sudo pecl install redis
安装完成后的验证方法
拓展安装完成后,需要验证是否安装成功,可以通过下面的命令查看已安装的拓展列表:
# 查看所有已加载的PHP拓展 php -m | grep redis
如果输出redis,说明拓展已经成功安装并加载。也可以创建一个PHP测试文件,输出phpinfo()信息,在页面中搜索对应的拓展名称,确认拓展已经生效。
<?php // 输出phpinfo信息,查看拓展是否加载 phpinfo(); ?>
常见问题补充
如果pecl安装时提示找不到对应的拓展,可以先搜索pecl仓库中是否有该拓展:
# 搜索pecl仓库中的拓展 pecl search redis
如果拓展名称正确但还是找不到,可能是pecl的频道配置有问题,可以更新pecl的频道列表:
# 更新pecl频道 sudo pecl channel-update pecl.php.net
另外,部分拓展安装需要依赖系统的一些开发库,比如安装GD拓展需要libpng、libjpeg等开发库,如果安装时提示缺少依赖,先通过系统包管理器安装对应的开发库即可。