• 推荐
  • 评论
  • 收藏

php 源码编译安装 命令参数选项详解

2020-08-30    3496次浏览

php环境安装说明

我们在使用php的时候,首先面临的就是对php环境的安装了,php环境的安装有几种方式:
  1. 直接使用系统内部提供的安装工具进行安装,比如:yum、apt-get等
  2. 自己去官方下载php源码包进行源码编译安装
  3. 使用其他集成开发环境比如:phpStudy、LNMP等
当我们手动下载源码编译安装的时候,需要用到一些编译和安装的命令,这些命令提供了多个可选的命令参数,指定不同的命令参数可以编译不同的模块功能到php环境中,比如:mysql支持模块,apache支持模块等等,了解和熟悉这些参数选项可以让我们更灵活的手动去安装php环境。

php源码编译和安装命令

php源码编译命令格式:./configure  --prefix=PREFIX,要查看所有可用参数配置选项的列表,在运行 autoconf 命令后在 PHP 的源代码目录运行 ./configure --help。
./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --with-mysql=/usr/local/mysql --with-mysqli=/usr/bin/mysql_config --with-iconv-dir=/usr/local --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --disable-rpath --enable-discard-path --enable-safe-mode --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl --with-curlwrappers --enable-mbregex --enable-fastcgi --enable-fpm --enable-force-cgi-redirect --enable-mbstring --with-mcrypt --with-gd --enable-gd-native-ttf --with-openssl --with-mhash --enable-pcntl --enable-sockets --with-ldap --with-ldap-sasl --with-xmlrpc --enable-zip --enable-soap --without-pear --with-zlib --enable-pdo --with-pdo-mysql --with-mysql 
make ZEND_EXTRA_LIBS='-liconv' 
make install

命令参数选项详解

  • --prefix=/usr/local/php  # 指定php安装目录
  • --with-apxs2[=FILE] # 编译共享的 Apache 2.0 模块。FILE 是可选的 Apache apxs 工具的路径,默认指向 apxs,比如:--with-apxs2=/usr/local/apache/bin/apxs,整合对apache支持,apxs功能是使用mod_so中的LoadModule指令,加载指定模块到 apache,要求 apache 要打开SO模块
  • --with-config-file-path=/usr/local/php/etc # 设置 php.ini 的搜索路径。默认为 PREFIX/lib,指定php.ini存储位置
  • --with-MySQL=/usr/local/mysql # mysql安装目录,对mysql的支持
  • --with-mysqli=/usr/local/mysql/bin/mysql_config # mysqli扩展技术不仅可以调用MySQL的存储过程、处理MySQL事务,而且还可以使访问数据库工作变得更加稳定 
  • --enable-safe-mode # 打开安全模式,本特性已自 PHP 5.3.0 起废弃并将自 PHP 5.4.0 起移除
  • --enable-ftp # 打开ftp的支持 
  • --enable-zip # 打开对zip的支持 
  • --with-bz2 # 打开对bz2文件的支持,linux下常见的压缩文件格式,是由具有高压缩率的压缩工具bzip2生成,以后缀为.bz2结尾的压缩文件
  • --with-jpeg-dir # 打开对jpeg图片的支持 
  • --with-png-dir # 打开对png图片的支持 
  • --with-freetype-dir # 打开对freetype字体库的支持,FreeType库是一个完全免费(开源)的、高质量的且可移植的字体引擎,它提供统一的接口来访问多种字体格式文件,包括TrueType, OpenType, Type1, CID, CFF, Windows FON/FNT, X11 PCF等
  • --without-iconv # 关闭iconv函数,种字符集间的转换,此模块包含了iconv 字符集转换功能的接口。 使用此模块,你可以将一个本地字符集表达的字符串转换成另一种字符集,比如可以是 Unicode 字符集。支持的字符集基于你系统上 iconv 的实现。注意,在某些系统上 iconv 函数可能无法以你预期的那样工作。在这种情况下,安装 GNU libiconv 库将会是个不错的主意,它最终将会产生更一致的结果。
  • --with-libXML-dir # 打开libxml2库的支持,libxml是一个用于解析xml文件的库,在各个平台下都能使用,也支持多种语言,如c,Python等。这里是官方网站。上面有libxml的api和一些code examples,都是英文的。不过比较简单。libxml的基础功能就是对xml的读和写
  • --with-XMLrpc # 打开xml-rpc的c语言,Xml-RPC是一个远程过程调用(remote procedure call,RPC)的分布式计算协议,通过XML将调用函数封装,并使用HTTP协议作为传送机制
  • --with-zlib-dir[=DIR] # 打开zlib库的支持,也可以自定义指定zlib的目录路径 
  • --with-gd # 打开gd库的支持 
  • --enable-gd-native-ttf # 支持TrueType字符串函数库 
  • --with-curl # 打开curl浏览工具的支持 
  • --with-curlwrappers # 运用curl工具打开url流 
  • --with-ttf # 打开freetype1.*的支持,可以不加了 
  • --with-xsl # 打开XSLT 文件支持,扩展了libXML2库 ,需要libxslt软件 
  • --with-gettext # 打开gnu 的gettext 支持,编码库用到 
  • --with-pear=DIR # 打开pear命令的支持,PHP扩展用的,也可以指定在 DIR(默认为 PREFIX/lib/php)中安装 PEAR
  • --without-pear # 不安装 PEAR
  • --enable-calendar # 打开日历扩展功能,历法扩展集包括了一系列用于在不同历法间进行转换的函数,它是以Julian Day计数为中介或标准来进行的。Julian Day计数是以公元前的4713年的1月1日为起点的一种计数法。为了在不同历法间进行转换,你首先要转换成Julian Day计数,然后再转换为你所需要的历法。Julian Day计数和Julian历法是非常不同的
  • --enable-mbstring # 多字节字符串的支持,多种编码字符串的支持 
  • --enable-bcmath # 对于任意精度的数学,PHP提供了支持用字符串表示的任意大小和精度的数字的二进制计算,最多为2147483647-1(或0x7FFFFFFF-1)
  • --enable-sockets # 打开对 sockets 协议的支持
  • --enable-exif # 图片的元数据支持,Exif是一种图象文件格式,它的数据存储与JPEG格式是完全相同的。实际上Exif格式就是在JPEG格式头部插入了数码照片的信息,包括拍摄时的光圈、快门、白平衡、ISO、焦距、日期时间等各种和拍摄条件以及相机品牌、型号、色彩编码、拍摄时录制的声音以及全球定位系统(GPS)、缩略图等。简单地说,Exif=JPEG+拍摄参数。因此,你可以利用任何可以查看JPEG文件的看图软件浏览Exif格式的照片,但并不是所有的图形程序都能处理Exif信息
  • --enable-magic-quotes # 魔术引用的支持 
  • --disable-rpath # 关闭额外的运行库文件 
  • --disable-debug # 关闭调试模式 
  • --with-mime-magic=/usr/share/file/magic.mime # 魔术头文件位置
  • --with-mcrypt # mcrypt算法
  • --with-mhash # mhash算法,该扩展名已被Hash扩展模块淘汰
  • --with-gmp # GMP是The GNU MP Bignum Library,是一个开源的数学运算库,它可以用于任意精度的数学运算,包括有符号整数、有理数和浮点数。它本身并没有精度限制,只取决于机器的硬件情况
  • --enable-pdo # 打开PHP数据对象支持
  • --with-pdo-mysql[=DIR] # 启用PHP数据对象mysql数据库的支持
以CGI方式运行php,需要使用以下参数:
  • --enable-fpm # 打上PHP-fpm 补丁后才有这个参数,CGI方式安装的启动程序
  • --enable-fastCGI # 支持fastcgi方式启动PHP
  • --enable-force-CGI-redirect # 重定向方式启动PHP
  • --with-ncurses # 支持ncurses 屏幕绘制以及基于文本终端的图形互动功能的动态库
  • --enable-pcntl # freeTDS需要用到的,可能是链接mssql 才用到
  • --enable-inline-optimization # 优化线程
  • --with-openssl # openssl的支持,加密传输时用到的
  • --enable-dbase # 此扩展模块功能可以访问dBase格式(dbf)数据库中存储的记录
  • --with-pcre-dir=/usr/local/bin/pcre-config # perl的正则库安装位置
  • --disable-dmalloc # 关闭dmalloc,debug malloc library,以一种库的形式发布,dmalloc可以精准的检测出没释放内存的申请位置(哪个C文件第几行),并自动将debug信息保存下来
  • --with-gdbm # 数据库dba的gdbm支持
  • --enable-sigchild #    使用PHP自带的SIGCHLD处理器
  • --enable-sysvsem # 启用系统V信号支持
  • --enable-sysvshm # 启用系统V共享内存支持
  • --enable-zend-multibyte # 编译zend的多字节支持
  • --enable-mbregex # 打开多字节正则表达式的支持
  • --enable-wddx # 启用WDDX支持,从PHP 7.4.0 开始, 此扩展名已弃用,并且未绑定
  • --enable-shmop # 启用shmop支持,PHP做内存共享有两套接口。一个是shm,它实际上是变量共享,会把对象变量序列化后再储存。使用起来倒是挺方便,但是序列化存储对于效率优先的内存访问操作而言就没啥意义了。另外一个是shmop,它是Linux和Windows通用的,不过功能上比shm弱了一些,在 Linux 上,这些函数直接是通过调用 shm* 系列的函数实现,而 Winodows 上也通过对系统函数的封装实现了同样的调用
  • --enable-soap # 启用SOAP支持,PHP 的 SOAP 扩展可以用来提供和使用 Web Services。换句话说,PHP 开发者可以利用这个 PHP 扩展来写他们自己的 Web Services,也可以写一些客户端来使用给定的 Web Services

最佳实践与经验参考

  • 如果在编译参数中指定了--with-apxs2=/usr/local/apache/bin/apxs以后,就不要再指定参数:--enable-fpm和--enable-fastCGI,apxs是以php module的模式加载PHP的。
  • Mysql在编译了Mysql开发library以后,可以不用指定mysql的路径。
  • PHP编译存在基础的依赖的关系,编译PHP首先需要安装XML扩展,因为php5核心默认打开了XML的支持,其他的基础库,相应需要:GD -> zlib, Png, Jpg, 如果需要支持其他,仍需要根据实际情况编译扩展库,ttf库需要freetype库的支持。
  • --enable-magic-quotes,是一个极其不推荐的参数,当然,如果你需要PHP为你做这些底下的工作,实际上他也没有很彻底的解决问题。
  • mysqli是MySQL团队提供的MySQL驱动,具有很多实用的功能和典型特征。不过他不是MySQL于PHP平台最好的选择,PDO被证实,是一个简易、高并发性,而且易于创建和回收的标准接口。不过PDO也经历了5.3以前的内存溢出的问题,在5.3以后,在读取Oracle的LOB资源时,若不对内存进行限制,仍会内存溢出。
  • 如果要运行的php环境是正式版系统,那么像pear、shmop、ftp这类php扩展模块等,不推荐使用,他们要做的事情,用C/C++,用Java,甚至其他脚本语言,都有很好很快速的选择,无需局限于使用PHP去实现。不熟悉的类库和不常用的库,也不推荐使用。magic-quote、session.auto_start、PHP服务器信息、PHP报错信息等在编译完成后,应该第一时间关闭,避免暴露服务器信息。
  • PHP对应的Web Server模式,module、fastcgi、fpm只需要一种即可,服务器不是你的试验田。fastcgi可以选择Nginx和lighttpd,其实Nginx也是使用lighttpd的spwan-fcgi进行fcgi进程管理的。fpm是使用PHP自身去管理多进程,有点类似一个后端代理。无论什么模式,在发布产品服务器,都应该做进程和线程调优,做足够多的压力测试,找出最好的进程数组合。
  • 选好一种PHP OPCode cache的扩展,这个也是很重要的,linux 2.6核心下,fcgi下,xcache有较好的实践经验,其他的在并发数增加以后,性能衰减严重。

编译扩展库和扩展模块(以sockets为例)

cd php/ext/sockets/ # 进入sockets 源码目录
/usr/local/php/bin/phpize
./configure    --enable-sockets --with-php-config=/usr/local/php/bin/php-config
make
make install
在/etc/php.ini添加加载扩展代码:extension=sockets.so
重启php环境:service php-fpm reload或service httpd reload