作者简介:

       姜海强:闷骚码农,互联网行业摸爬滚打数余载,先后担任中国体育直播TV主程、网信集团先锋支付架构师、奇虎360服务器端资深开发。热爱技术,喜欢分享,热衷领域:PHP/Golang语言、面向对象设计模式、Redis、Yaf、Yii2、微服务等。

视频课程

yaf+yar微服务-腾讯课堂
yaf+yar微服务-51CTO学院
CSDN学院

Github

个人主页
swoole-boot
roach
roach-orm

QQ群:

姜海强的QQ群

公众号:

360tryst公众号

php扩展

1.安装PHP

生产环境PHP都是运行在Linux操作系统中,如:Centos操作系统,在Centos操作系统中安装PHP需要经过预编译、编译和安装等阶段。

安装步骤如下:

  • 1.从PHP官方网站下载某个版本的PHP源码包,如:7.2.31

    PHP官网地址:https://www.php.net/

  • 2.创建php-fpm运行用户组与用户

  1. # 创建www用户组
  2. groupadd www
  3. #创建www用户,且www用户不能登录
  4. useradd www -g www -s /sbin/nologin
  • 3.解压并进入安装目录
  1. tar xzvf php-7.2.31.tar.gz
  2. cd php-7.2.31
  • 4.预编译,执行以下命令
  1. ./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --with-gd --with-iconv --with-zlib --with-curl --with-pdo-mysql --with-png-dir --with-jpeg-dir --with-freetype-dir --with-fpm-user=www --with-fpm-group=www --with-gettext --with-openssl --enable-bcmath --enable-fpm --enable-mbstring --enable-sockets --enable-session --with-gettext
  • 5.编译,执行如下命令
  1. make
  • 6.安装,执行如下命令
  1. make install

此步骤安装完成后,PHP会被安装到/usr/local/php,目录结构如下

  1. drwxr-xr-x 12 root wheel 384 9 15 2019 bin/
  2. drwxr-xr-x 7 root wheel 224 7 4 11:12 etc/
  3. drwxr-xr-x 3 root wheel 96 9 15 2019 include/
  4. drwxr-xr-x 3 root wheel 96 9 15 2019 lib/
  5. drwxr-xr-x 4 root wheel 128 9 15 2019 php/
  6. drwxr-xr-x 3 root wheel 96 9 15 2019 sbin/
  7. drwxr-xr-x 4 root wheel 128 9 15 2019 var/

至此,cli模式下可以执行命令了,如

  1. # 查看php版本
  2. /usr/local/php/bin/php -v
  3. # 查看php已安装启用模块
  4. /usr/local/php/bin/php -m
  5. #查看php详情
  6. /usr/local/php/bin/php -i

为了方便执行php命令,我们可以把/usr/local/php/bin目录配置到系统环境变量中,这样就可以省略路径执行php命令。

  • 7.配置php-fpm

php的源码目录中有两个ini格式的配置文件,名称如下

  1. -rw-rw-r-- 1 root wheel 71232 8 28 2019 php.ini-development
  2. -rw-rw-r-- 1 root wheel 71504 8 28 2019 php.ini-production

两个配置文件分别是php提供的开发和生产环境的默认配置参数,我们根据自己需要拷贝即可,如

  1. cp php.ini-production /usr/local/php/etc/

拷贝完成之后,我们进行一些常规配置修改

  1. ;关闭php版本输出
  2. expose_php = Off
  3. ;设置错误级别
  4. error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT & ~E_NOTICE
  5. ;设置php错误日志目录,目录必须存在,且www用户具有写权限
  6. error_log = /data/logs/php_errors.log
  7. [Date]
  8. ;根据自己需要设置时区
  9. date.timezone = PRC
  10. ...

进行了一些自定义配置后,还需要配置php-fpm的配置

  1. # 进入php的etc目录
  2. cd /usr/local/php/etc/
  3. cp php-fpm.conf.default php-fpm.conf

此配置文件也可以根据自己需要进行自定义配置,开发环境保持默认即可。

php-fpm.conf配置最后一行为include=/usr/local/php/etc/php-fpm.d/*.conf,此处加载了/usr/local/php/etc/php-fpm.d目录下所有conf扩展名的配置,这个目录下一般放php-fpm进程池配置。

配置www进程池

  1. cd /usr/local/php/etc/php-fpm.d
  2. mv www.conf.default www.conf

此配置也可以根据自己需要进行自定义配置,如

  1. ;监听地址和端口
  2. listen = 127.0.0.1:9007
  3. ;fpm子进程管理方式
  4. pm = dynamic
  5. ;每个子进程最大处理请求数,当处理请求数量超过配置值时,会创建新的子进程,旧的子进程退出。
  6. pm.max_requests = 500
  7. ...

此处强调一下,fpm子进程管理方式有三种,此处面试的时候经常会被问到,本文简单的介绍一下。

  1. pm 的可选值有staticdynamicondemand
  2. static代表子进程的数量是固定的,由配置pm.max_children决定
  3. dynamic代表数量是动态的,具体策略受这些配置影响。
  4. pm.max_children:同一时间生存子进程的最大数量;
  5. pm.start_servers:fpm启动的时候创建的子进程数量;
  6. pm.min_spare_servers:处于空闲状态子进程的最小数量,当空闲的子进程数量小于配置值时,将有新的子进程被创建;
  7. pm.max_spare_servers:处于空闲状态子进程的最大数量,当空闲子进程数量大于配置值时,将有子进程被杀掉。
  8. ondemand代表按需创建,当fpm启动的时候不创建子进程,当有新的请求连接时,将会创建子进程。具体策略受这些配置影响。
  9. pm.max_children:同一时间生存子进程的最大数量;
  10. pm.process_idle_timeout:单位是s,子进程空闲时间超过配置值时,该子进程将被杀掉。
  • 8.将php-fpm加入开机启动

centos6操作系统

  1. # 将php源码目录中的php-7.2.31/sapi/fpm/init.d.php-fpm拷贝到/etc/init.d/
  2. cd ./php-7.2.31/sapi/fpm/
  3. cp init.d.php-fpm /etc/init.d/php-fpm
  4. #加入开机启动
  5. chkconfig php-fpm on
  6. #启动php-fpm
  7. service php-fpm start
  8. #关闭php-fpm
  9. service php-fpm stop
  10. #重启php-fpm
  11. service php-fpm restart
  12. #平滑重启php-fpm
  13. service php-fpm reload

centos7操作系统

  1. # 将php源码目录中的php-7.2.31/sapi/fpm/php-fpm.service拷贝到/usr/lib/systemd/system
  2. cd ./php-7.2.31/sapi/fpm/
  3. cp php-fpm.service /usr/lib/systemd/system
  4. #赋予执行权限
  5. chmod +x /usr/lib/systemd/system/php-fpm.service
  6. #加入开机启动
  7. systemctl enable php-fpm
  8. #启动php-fpm
  9. systemctl start php-fpm
  10. #关闭php-fpm
  11. systemctl stop php-fpm
  12. #重启php-fpm
  13. systemctl restart php-fpm
  14. #平滑重启php-fpm
  15. systemctl reload php-fpm

到这里我们就成功安装了php-fpm

2.安装扩展

在PHP的源码目录中有个ext目录,里面包含了PHP官方提供的扩展,如下

  1. drwxrwxr-x 5 root root 4096 May 22 14:11 bcmath
  2. drwxrwxr-x 3 root root 4096 Aug 28 2019 bz2
  3. drwxrwxr-x 3 root root 4096 Aug 28 2019 calendar
  4. drwxrwxr-x 3 root root 4096 Aug 28 2019 com_dotnet
  5. drwxrwxr-x 4 root root 4096 May 22 14:11 ctype
  6. drwxrwxr-x 4 root root 4096 May 22 14:11 curl
  7. drwxrwxr-x 5 root root 4096 May 22 14:09 date
  8. drwxrwxr-x 6 root root 4096 Aug 28 2019 dba
  9. drwxrwxr-x 5 root root 4096 May 22 14:11 dom
  10. drwxrwxr-x 4 root root 4096 Aug 28 2019 enchant
  11. drwxrwxr-x 3 root root 4096 Aug 28 2019 exif
  12. -rwxrwxr-x 1 root root 9415 Aug 28 2019 ext_skel
  13. -rw-rw-r-- 1 root root 1165 Aug 28 2019 ext_skel_win32.php
  14. drwxrwxr-x 5 root root 4096 May 22 14:11 fileinfo
  15. drwxrwxr-x 5 root root 4096 May 22 14:12 filter
  16. drwxrwxr-x 3 root root 4096 Aug 28 2019 ftp
  17. drwxrwxr-x 5 root root 4096 May 22 14:12 gd
  18. drwxrwxr-x 4 root root 4096 May 22 14:12 gettext
  19. drwxrwxr-x 3 root root 4096 Aug 28 2019 gmp
  20. drwxrwxr-x 5 root root 4096 May 22 14:12 hash
  21. drwxrwxr-x 4 root root 4096 May 22 14:12 iconv
  22. drwxrwxr-x 3 root root 4096 Aug 28 2019 imap
  23. drwxrwxr-x 3 root root 4096 Aug 28 2019 interbase
  24. drwxrwxr-x 21 root root 4096 Aug 28 2019 intl
  25. drwxrwxr-x 4 root root 4096 May 22 14:12 json
  26. drwxrwxr-x 3 root root 4096 Aug 28 2019 ldap
  27. drwxrwxr-x 4 root root 4096 May 22 14:10 libxml
  28. drwxrwxr-x 7 root root 4096 May 22 14:12 mbstring
  29. drwxrwxr-x 3 root root 4096 Aug 28 2019 mysqli
  30. drwxrwxr-x 3 root root 4096 May 22 14:14 mysqlnd
  31. drwxrwxr-x 3 root root 4096 Aug 28 2019 oci8
  32. drwxrwxr-x 3 root root 4096 Aug 28 2019 odbc
  33. drwxrwxr-x 5 root root 4096 May 22 14:09 opcache
  34. drwxrwxr-x 4 root root 4096 May 22 14:10 openssl
  35. drwxrwxr-x 3 root root 4096 Aug 28 2019 pcntl
  36. drwxrwxr-x 5 root root 4096 May 22 14:10 pcre
  37. drwxrwxr-x 4 root root 4096 May 22 14:13 pdo
  38. drwxrwxr-x 3 root root 4096 Aug 28 2019 pdo_dblib
  39. drwxrwxr-x 3 root root 4096 Aug 28 2019 pdo_firebird
  40. drwxrwxr-x 4 root root 4096 May 22 14:13 pdo_mysql
  41. drwxrwxr-x 3 root root 4096 Aug 28 2019 pdo_oci
  42. drwxrwxr-x 3 root root 4096 Aug 28 2019 pdo_odbc
  43. drwxrwxr-x 3 root root 4096 Aug 28 2019 pdo_pgsql
  44. drwxrwxr-x 4 root root 4096 May 22 14:13 pdo_sqlite
  45. drwxrwxr-x 3 root root 4096 Aug 28 2019 pgsql
  46. drwxrwxr-x 5 root root 4096 May 22 14:16 phar
  47. drwxrwxr-x 4 root root 4096 May 22 14:13 posix
  48. drwxrwxr-x 3 root root 4096 Aug 28 2019 pspell
  49. drwxrwxr-x 3 root root 4096 Aug 28 2019 readline
  50. drwxrwxr-x 3 root root 4096 Aug 28 2019 recode
  51. drwxrwxr-x 4 root root 4096 May 22 14:13 reflection
  52. drwxrwxr-x 4 root root 4096 May 22 14:13 session
  53. drwxrwxr-x 3 root root 4096 Aug 28 2019 shmop
  54. drwxrwxr-x 5 root root 4096 May 22 14:13 simplexml
  55. drwxrwxr-x 3 root root 4096 Aug 28 2019 skeleton
  56. drwxrwxr-x 3 root root 4096 Aug 28 2019 snmp
  57. drwxrwxr-x 4 root root 4096 Aug 28 2019 soap
  58. drwxrwxr-x 4 root root 4096 May 22 14:13 sockets
  59. drwxrwxr-x 3 root root 4096 Aug 28 2019 sodium
  60. drwxrwxr-x 6 root root 4096 May 22 14:13 spl
  61. drwxrwxr-x 5 root root 4096 May 22 14:10 sqlite3
  62. drwxrwxr-x 5 root root 12288 May 22 14:14 standard
  63. drwxrwxr-x 3 root root 4096 Aug 28 2019 sysvmsg
  64. drwxrwxr-x 3 root root 4096 Aug 28 2019 sysvsem
  65. drwxrwxr-x 3 root root 4096 Aug 28 2019 sysvshm
  66. drwxrwxr-x 4 root root 4096 Aug 28 2019 tidy
  67. drwxrwxr-x 4 root root 4096 May 22 14:14 tokenizer
  68. drwxrwxr-x 3 root root 4096 Aug 28 2019 wddx
  69. drwxrwxr-x 4 root root 4096 May 22 14:14 xml
  70. drwxrwxr-x 5 root root 4096 May 22 14:14 xmlreader
  71. drwxrwxr-x 4 root root 4096 Aug 28 2019 xmlrpc
  72. drwxrwxr-x 5 root root 4096 May 22 14:14 xmlwriter
  73. drwxrwxr-x 3 root root 4096 Aug 28 2019 xsl
  74. drwxrwxr-x 2 root root 4096 Aug 28 2019 zend_test
  75. drwxrwxr-x 5 root root 4096 Aug 28 2019 zip
  76. drwxrwxr-x 4 root root 4096 May 22 14:11 zlib

我们可以看到PHP官方我们提供了丰富的扩展,我们可以去PHP官网学习一下这些扩展的功能,另外除了以上这些扩展,也可以安装第三方开发者开发的扩展,如:yafyar等。

PHP扩展的安装有多种方式,作者习惯采用phpize的方式安装,此文件位于PHP安装目录/usr/local/php/bin

phpize安装扩展是由规律可循的,主要分为以下几步

  • 1.进入待安装扩展目录,执行/usr/local/php/bin/phpize生成configure文件,如
  1. cd php-7.2.31/ext/ftp
  2. /usr/local/php/bin/phpize
  • 2.预编译,预编译过程需要制定php-config路径,路径位置为/usr/local/php/bin/php-config,如
  1. ./configure --with-php-config=/usr/local/php/bin/php-config
  • 3.编译安装,如
  1. make && make install

安装完成后如下提示

  1. ...
  2. Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20170718/

以上提示了扩展被安装的目录

  • 4.将刚刚安装的扩展配置到php.ini文件中,如
  1. [ftp]
  2. extension=ftp.so

此时执行php -m,如果能看到表示ftp扩展在cli模式下已经安装成功。

注意:fpm模式下ftp扩展并未生效,需要reload才能生效。

通过phpize安装扩展的步骤就是以上4步,其他扩展都是大同小异,好了,你学会了吗?如果没有学会或者有什么疑问可以加到QQ群【621674014】,我们一起讨论学习。

QQ群:

姜海强的QQ群

公众号:

360tryst公众号