PHP 架构和安装扩展的几种方式
PHP 三大模块:
- SAPI:接受并处理请求。
- Zend Engine:PHP 的核心,负责分析 PHP 代码并转为 opcode,然后在 Zend VM 虚拟机上执行。
- PHP 功能函数及扩展层:实现各种功能,例如 curl 通信、连接 MySQL 等。
PHP 中,有以下几种方式添加扩展:
- 把扩展编译进 PHP
- 通过 或 Linux 发行版自带的 yum、apt-get 等命令安装,动态加载(Linux 下是
*.so
文件,Windows 下是*.dll
文件)
相比通过 yum install
或 apt-get
等各大 Linux 发行版自带的安装方向,源码编译安装略显复杂,但是灵活性也更高,比如要安装 PCNTL 等扩展,就只能通过源码编译安装。
注意:源码编译安装时,只会安装指定的扩展,而好多扩展是默认不安装的。对于常用的数据库驱动、OpenSSL、GD 库等都需要指定。如果安装后发现遗漏,可以重新编译,加上相应的参数可得到驱动程序(Linux 下是
*.so
文件),然后复制到 PHP 的扩展目录(一般是/usr/local/php/include/php/ext
)下,并在php.ini
配置文件中开启扩展既可以。
通过 yum list php72w-*
可以在 CentOS 中查看可以使用命令安装的扩展。
获取 PHP 源码并解压
下载源码
官网下载
官网下载地址: ,在这个页面选择一个具体的版本,点击后会跳转到选择镜像的页面。我试了一下中国的两个镜像,都挂了,随便点了一个日本的镜像,结果下载成功了。。
Git 下载
可以在 GitHub 上的 或 下载源码。
解压
tar -zxvf mirror
配置并构建 PHP
简单示例
PHP 初始的配置和安装过程被 configure 脚本中一系列命令行选项控制。可以通过 ./configure --help
命令了解 PHP 所有可用的编译选项及简短解释。
Linux 下安装软件的步骤:
./configure
:执行配置选项(例如 --prefix 可以指定安装位置),判断硬件及操作系统平台,生成 Makefile 文件make
:编译make install
:安装
配置好 PHP 后,便可以开始用 make 命令编译模块和可执行文件。
cd ../php-7.2.12./configure --prefix=/tdata/soft/php/php-7.2.12make && make install
执行 ./configure
命令时,可能会因为 Linux 尚未安装某些库而报错,安装即可解决。配置成功后会看到授权信息:
Generating filesconfigure: creating ./config.statuscreating main/internal_functions.ccreating main/internal_functions_cli.c+--------------------------------------------------------------------+| License: || This software is subject to the PHP License, available in this || distribution in the file LICENSE. By continuing this installation || process, you are bound by the terms of this license agreement. || If you do not agree with the terms of this license, you must abort || the installation process at this point. |+--------------------------------------------------------------------+
PHP 源码的 ext 目录中,有大量的扩展:
[root@VM_139_38_centos php-7.2.12]# lsacinclude.m4 configure.ac libtool modules README.NEW-OUTPUT-API scriptsaclocal.m4 CONTRIBUTING.md LICENSE NEWS README.PARAMETER_PARSING_API server-tests-config.phpappveyor CREDITS ltmain.sh pear README.REDIST.BINS server-tests.phpbuild ext main php7.spec README.RELEASE_PROCESS snapshotbuildconf EXTENSIONS makedist php7.spec.in README.SELF-CONTAINED-EXTENSIONS stamp-h.inbuildconf.bat footer Makefile php.gif README.STREAMS testsCODING_STANDARDS generated_lists Makefile.frag php.ini-development README.SUBMITTING_PATCH travisconfig.guess genfiles Makefile.fragments php.ini-production README.TESTING TSRMconfig.log header Makefile.gcov README.EXT_SKEL README.TESTING2 UPGRADINGconfig.nice include Makefile.global README.GIT-RULES README.UNIX-BUILD-SYSTEM UPGRADING.INTERNALSconfig.status INSTALL Makefile.objects README.input_filter README.WIN32-BUILD-SYSTEM vcscleanconfig.sub install-sh missing README.MAILINGLIST_RULES run-tests.php win32configure libs mkinstalldirs README.md sapi Zend[root@VM_139_38_centos php-7.2.12]# ls ext/bcmath dba filter imap mysqli pcre pdo_pgsql recode soap sysvsem xmlrpcbz2 dom ftp interbase mysqlnd pdo pdo_sqlite reflection sockets sysvshm xmlwritercalendar enchant gd intl oci8 pdo_dblib pgsql session sodium tidy xslcom_dotnet exif gettext json odbc pdo_firebird phar shmop spl tokenizer zend_testctype ext_skel gmp ldap opcache pdo_mysql posix simplexml sqlite3 wddx zipcurl ext_skel_win32.php hash libxml openssl pdo_oci pspell skeleton standard xml zlibdate fileinfo iconv mbstring pcntl pdo_odbc readline snmp sysvmsg xmlreader
常用的配置选项
PHP 选项
–prefix[=PREFIX]:安装路径的前缀,可以自定义,例如 /tdata/soft/php
。指定prefix,可执行文件默认放在/usr/local/bin,库文件默认放在/usr/local/lib,配置文件默认放在/usr/local/etc,其它的资源文件放在/usr/local/share,很凌乱。指定 prefix,直接删掉一个文件夹就够了。
PHP 扩展
每个扩展对应的选项,需要在具体的扩展文档里找。大部分可以安装 PHP 之后再安装。
–enable-mbstring:开启 mbstring 多字节扩展
–with-gd[=DIR]:激活 GD 支持,可以指定扩展位置。编译 GD 库需要libpng 和 libjpeg。建议通过sudo apt-get install php7.2-gd
或 yum install php72w-gt
安装。 –with-pear:安装 PEAR 扩展。 –with-zip[=DIR]:提供 zip 支持,[DIR]是 ZZIPlib 库安装路径。建议通过 。 进程控制扩展:
–enable-pcntl:开启 PCNTL 进程控制扩展,只能编译安装。网络相关扩展:
–with-openssl[=DIR]:开启 OpenSSL 扩展,可以指定扩展位置 –enable-ftp:开启 FTP 扩展 –with-curl:支持 cURL –enable-sockets:开启 socket 扩展 –enable-soap:支持 SOAP –enable-fpm:激活 FPM 支持数据库扩展:
–with-mysql=mysqlnd –with-mysqli=mysqlnd –with-pdo-mysql=mysqlnd–with-mysql=/usr/bin/mysql_config
–with-mysqli=mysqlnd –with-pdo-mysql=mysqlnd配置 PHP
在之前编译的源码包中,找到 php.ini-production,复制到/usr/local/php下,并改名为php.ini:
$ cp php.ini-production /usr/local/php/php.ini
编译安装 PHP 扩展
PHP 安装后,如果还需要安装扩展,可以先看看 PHP 源码的 ext 目录中有没有,有的话直接编译即可。
PHP 默认安装的扩展
执行 ./configure
命令时,如果不指定任何扩展,PHP 会默认安装如下扩展,其他的就需要自己制定了,例如 GD、MySQL、curl、mbstring、bz2、calendar、exif、ftp 等:
[root@VM_139_38_centos php-7.2.12]# /tdata/soft/php/php-7.2.12/bin/php -m[PHP Modules]CorectypedatedomfileinfofilterhashiconvjsonlibxmlpcrePDOpdo_sqlitePharposixReflectionsessionSimpleXMLSPLsqlite3standardtokenizerxmlxmlreaderxmlwriter[Zend Modules]
CentOS 通过 yum 命令安装的 PHP:
[root@VM_139_38_centos gd]# php -m[PHP Modules]bz2calendarCorectypecurldateexiffileinfofilterftpgdgettextgmphashiconvjsonlibxmlmysqlimysqlndopensslpcntlpcrePDOpdo_mysqlpdo_sqlitePharreadlineReflectionsessionshmopSimpleXMLsocketsSPLsqlite3standardswooletokenizerxmlzipzlib[Zend Modules]