Ubuntu 环境下安装PHP(PHP-FPM)

主流的 PHP web 开发环境搭配是:nginx/apache(web服务器) + php-fpm(负责 php 脚本执行)。


这里主要解释如何在 Ubuntu 22.04 环境下,安装 PHP 的问题。


为何使用 发行版软件仓库方式安装 PHP-FPM?

安装 PHP,主要有两个方法:一是源码编译安装,二是基于发行版的软件仓库安装。


源码安装方式 是所有工作于 Linux 平台的开发人员必须掌握的一种技能——构建软件技能。


这种构建技能不是仅仅指敲一个编译命令这么简单,主要是指软件依赖的解决,具体编译问题的解决,具体构建工具的使用等等技术方面。当然,还包括最重要心理素质——耐心。


本文作者之前一直是基于源码安装的方式,比如安装 nginx + php。但现在一般不再使用此方法。因为耗费太长,没有基于发行版的软件仓库安装的方式,来的便捷和快速。


基于源码安装的主要考虑:


首先是一些插件安装,比如 nginx的扩展模块安装、php-fpm 的扩展模块安装(尤其是调试模块 xdebug 的安装);

其次是源码调试,这里主要是 gdb 级别的调试。

后来发现,这些问题,也都可以通过软件仓库安装的方式解决,故而后续开发涉及的软件安装,主要是通过发行版的软件仓库安装方式来解决。


其实还有第三种方式:docker 安装方式。这个以后再说。


发行版软件仓库安装方式,主要是指通过发行部仓库的管理软件来安装已经编译好的软件,比如在 Ubuntu 下,就是 apt,在 CentOS 下是 yum。说实话,在 Linux 发行版(比如 Ubuntu、CentOS、Redhat 等等)下安装软件,比 windows 下安装软件要方便的多了。


安装环境

本文软件的安装环境和版本如下所示:


软件 软件版本

本文测试的开发环境操作系统 Ubuntu 22.04

PHP 版本 PHP 7.4.33(NTS)(ThinkPHP6.x 要求 PHP >= 7.2.5)

PHPStorm 版本 PHPStorm 2018.3 / PHPStorm 2019.1

步骤一:检查发行版仓库源(可选)/etc/apt/sources.list

配置国内的发行版软件仓库源


比如 阿里云、清华大学、网易等等。需要注意不同的发行版版本的仓库源是不一样的,比如 Ubuntu 18.04 和 Ubuntu 22.04 是不一样的。


切换仓库源后,需要使用命令更新仓库的元信息,Ubuntu 下是通过命令:sudo apt-get update 来执行。


步骤二:熟悉安装管理工具的主要命令:Ubuntu's apt(可选)

# (1)查找仓库的软件

apt-cache search <package name>

# apt-cache search php

# apt-cache search xdebug


# (2)查看软件包情况,包括版本号,安装大小,依赖关系

sudo apt show <package name>


# (3)安装软件包

sudo apt install <package name>


# (4)卸载软件包

sudo apt remove <package name>

# 清理不再使用的依赖和库文件

sudo apt autoremove


# (5)命令列出安装的软件包

sudo apt list --installed


# (6)apt 命令列出包依赖项

sudo apt depends packagename

步骤三:选择 PHP 版本,并安装

# (1) 查看当前仓库中支持的 php 版本

apt-cache search php


# 比如在 Ubuntu 22.04 下,支持以下的 PHP 版本安装

# php5.6 - server-side, HTML-embedded scripting language (metapackage)

# php7.0 - server-side, HTML-embedded scripting language (metapackage)

# php7.1 - server-side, HTML-embedded scripting language (metapackage)

# php7.2 - server-side, HTML-embedded scripting language (metapackage)

# php7.3 - server-side, HTML-embedded scripting language (metapackage)

# php7.4 - server-side, HTML-embedded scripting language (metapackage)

# php8.0 - server-side, HTML-embedded scripting language (metapackage)

# php8.1 - server-side, HTML-embedded scripting language (metapackage)

# php8.2 - server-side, HTML-embedded scripting language (metapackage)



# (2)安装需要的 PHP 

sudo apt-get install php7.4

sudo apt-get install php8.1

sudo apt-get install php8.2

安装后的配置目录为: /etc/php


/etc/php 

    ├─7.4      PHP 7.4 版本的配置目录

    ├─8.1      PHP 8.1 版本的配置目录

    ├─8.2      PHP 8.2 版本的配置目录

注意:安装后的对应 php 可执行文件名为:php+版本号,比如 php7.4、php8.1、php8.2 等等。

步骤四:安装 PHP 的扩展模块(可选)

# (1)查询特定 PHP 版本的扩展模块

apt-cache search php | grep "php7.4"


# php7.4-gd - GD module for PHP

# php7.4-mbstring - MBSTRING module for PHP

# php7.4-mysql - MySQL module for PHP

# php7.4-readline - readline module for PHP

# php7.4-xdebug - Xdebug Module for PHP


# (2)安装对应的扩展模块

sudo apt-get install php7.4-mysql php7.4-xdebug

步骤五:配置 xdebug 模块(可选)

开发程序,最最最最最重要的步骤是,如何调试程序。调试 php 程序,需要 xdebug 模块的帮助。


xdebug 和 PHP 版本是有互相关联性的。比如某一特定的 PHP 版本,需要某一 xdebug 的版本才能配合。可以利用 xdebug 官网:wizard,来检查当前 php 版本所需的 xdebug 版本。


但此种方式是源码安装,你需要编译,并将最终编译好的动态库存放到特定的扩展目录下,或者修改扩展目录的配置。总而言之,这个方法比较麻烦。


之前通过 apt 方式安装的 xdebug 模块,其实就是和特定的 php 版本配合的 xdebug,故而上述的检查步骤不再需要。比如 php7.4-xdebug,就是官方建议配合 php7.4 的 xdebug 版本。


xdebug 主要是配置,以及如何和集成开发工具相配合(基于 PHP 开发的最最重要的集成开发工具是 PHPStorm)。


xdebug 在 v2.x 和 v3.x 有比较大的差异。网络上搜索信息,大多是关于 2.x 的,这一点需要留意。


下面以 php7.4-xdebug(v3.1.6) 模块的版本为例说明配置:


$> php7.4 -version

PHP 7.4.33 (cli) (built: Jun  8 2023 15:23:32) ( NTS )

Copyright (c) The PHP Group

Zend Engine v3.4.0, Copyright (c) Zend Technologies

    with Zend OPcache v7.4.33, Copyright (c), by Zend Technologies

    with Xdebug v3.1.6, Copyright (c) 2002-2022, by Derick Rethans

步骤 5.1:修改 /etc/php/7.4/mods-available/xdebug.ini

zend_extension=xdebug.so

xdebug.mode = debug


# client_host client_port 是 xdebug v3.x 中才有的选项

xdebug.client_host = 127.0.0.1 


# 此处为监听端口,配置集成开发环境时需要(重要)

xdebug.client_port = 9003

xdebug.collect_return=On


# 此处搭配的 PHPSTORM,配置 PHPSTORM 时需要

xdebug.idekey=PHPSTORM 



#   下面配置项,是在 xdebug v2.x 下常用的配置项,不要在 xdebug v3.x 下使用

##   xdebug.remote_host=127.0.0.1

##   xdebug.remote_handle=dbgp

##   xdebug.remote_enable=on

步骤 5.2:配置 PHPStorm

PHPStorm 2018.3 / PHPStorm 2019.1(PHP Storm 主要是为了调试使用,和 PHP 版本以及 xdebug 版本关系并不大)


填写 xdebug.ini 中的相关配置,对应的 phpstorm 位置:File -> Setting -> Php -> Debug -> Dbgp Proxy


测试验证 Phpstorm 中的 debug 配置(此处最好验证,否则可能会无法停住断点)


注意下面测试配置项:


Path to create validation script: 此处填写的是项目目录,和 nginx 的 root /var/www/cxmx/public 一致:



打开 phpstorm 调试开关:



步骤 5.3:常见配置问题

如果 phpstorm 在使用浏览器访问 php,一直无法停在断点上,可以使用如下方式测试:

# 此种方式来源于 xdebug 官网,如果这个没有问题,需要重新检查 phpstorm 关于 xdebug 的配置

curl -d "XDEBUG_SESSION_START=123" 127.0.0.1/x.php

如果调试过程中,调试过程直接被终止,考虑下面的配置

# step1: 检查 nginx 的 nginx.conf 的 keepalive_timeout 配置项

keepalive_timeout 600


# step2: 检查 php-fpm 中关于 request_terminate_timeout 配置项

# 使用仓库源方式安装的文件修改位置:/etc/php/7.4/fpm/pool.d/www.conf

request_terminate_timeout = 600s


有话要说