如何在linux里安装php的扩展

本文章只面对同一个服务器只有一个PHP版本的环境。

编写约定

1.本文的“PHP”指的是PHP解释器,而不是PHP代码。

为什么不介绍windows系统下扩展的安装

因为官方自带的PHP包包括了一堆常用的扩展dll,不需要特别介绍。

事前

首先,你得确定你的PHP是通过什么安装的。如果是通过包管理软件安装的,则也用相同的包管理软件安装扩展,这种情况不建议通过编译源码的方式来安装扩展(因为这不适合升级你的PHP)。如果是通过编译源码安装的PHP,则只能用编译的安装方法来安装扩展。

Do

包管理软件安装

包管理软件大同小异,包的命名都有一定的规律,区别只是安装命令的差别(yum是yum install,apt是apt-get install)。注意:在安装扩展的时候要注意包的名称不要搞错依赖,导致多安装了一个PHP。

扩展包的名称一般是:<你之前安装的PHP的包名>-<扩展名>,比如:php5-tidy、php-gd。。。

源码编译安装

需要准备的东西

这种安装方法需要准备以下东西:

  1. 要安装的扩展的源代码
  2. 编译器(一般是gcc)
  3. 你也要搞清楚phpize命令的位置,如果你把php的bin目录都放入了环境变量里,那么你应该可以直接使用phpize命令的
  4. 其它在PHP手册的安装章节里提到的注意事项,比如扩展依赖的库(这种情况你得先安装依赖库)

开始编译

首先先把源代码压缩包里的东西解压出来,然后cd进解压出来的目录里。然后直接执行phpize命令,这个命令会根据当前安装到你系统的PHP的API来生成一个configure脚本。之后在当前目录运行./configure。如果你看到类似成功的字眼,就直接执行make命令来编译源码。编译完成后你可以选择直接执行make install也可以在执行安装命令前执行测试命令make test。执行完make install后,编译出来的so文件就会自动放到它应该放的地方。

加载扩展

到这里你应该安装完扩展了,现在只需要加载扩展的so文件就可以在PHP里使用这个扩展。编辑php.ini,

extension=<扩展名>.so

 

注意事项

最主要的还是用心去做这件事,遇到不会的英文就去翻译。

PHP7.2已经发布

PHP7.2.0的稳定版本已于2017-11-30发布。官方下载地址:http://php.net/downloads.php#v7.2.0

个人镜像
文件名下载链接文件大小sha256
php-7.2.0.tar.gz下载17,849Kb801876abd52e0dc58a44701344252035fd50702d8f510cda7fdb317ab79897bc
php-7.2.0-nts-Win32-VC15-x86.zip下载22.64MBf5c1317e557ec814377a18af3ad325a59da8a9d127660ab1a03562b14824f686
php-7.2.0-Win32-VC15-x86.zip下载22.7MB28bd43ba9148549f8b70b28ae33415b3103e3b3cbaabcd4619fdac47a1739f7f
php-7.2.0-nts-Win32-VC15-x64.zip下载24.28MB85a325601d0442dcefbd02fd859f3c6cc1580349857c2d21c8be58cd1e4d8f23
php-7.2.0-Win32-VC15-x64.zip下载24.41MB275c58e86e0490146684e4f731917484306a3f269dc6f6f55f31aabb808743d0

从低版本升级

windows系统

Win系统升级十分简单,下载官方已经编译好的二进制包,解压,更改环境变量之类的配置就可以用了。

linux系统

用apt、yum等包管理器安装的php无需多言。

编译安装的PHP,这个新版本的编译方式和上几个版本是一样的。如果你保留了上次你已经编译的php源代码,你可以把原来文件夹下的config.nice复制到新版本的源码包里,然后执行这个脚本。这个脚本可以执行你上次编译老版本时configure的命令,免去手动打选项的时间。configure后可直接make,make test,还有make install。注意,这次升级,必须重新编译php.ini里已经加载的扩展,否则PHP会出错。以前安装的扩展,新版本会忽视。

不向后兼容的修改

下面列出了PHP7.1升级到PHP7.2需要注意的事项。

尝试计数不可数的数据类型时会报错

当尝试向count函数(包括count函数的别名函数sizeof)传入不可数类型时,会抛出E_WARNING级别的错误。

<?php

var_dump(
    count(1), // 整型不可数
    count('abc'), // 字串符不可数
    count(new stdclass), // 没有实现Countable接口的对象是不可计数的
    count([1,2]) // 数组是可以计数的
);

以上例子会输出:

Warning: count(): Parameter must be an array or an object that implements Countable in %s on line %d

Warning: count(): Parameter must be an array or an object that implements Countable in %s on line %d

Warning: count(): Parameter must be an array or an object that implements Countable in %s on line %d
int(1)
int(1)
int(1)
int(2)

简而言之,从PHP7.2开始,向count函数传入非数组或者没有实现Countable接口的对象时,PHP会报Warning级别的错误。

弃用的功能

each()函数已被弃用