zzxworld

Arch Linux 系统安装搭建 PHP 开发环境

经过前两篇文章的尝试,我已经了解到了如何从零开始安装并配置好一个带桌面环境的 Arch Linux 系统。为了能够把这个系统作为自己的正式开发环境,还需要完成开发环境的配置。今天这篇文章就是记录我如何在 Arch Linux 系统上搭建一个用于 PHP 开发的环境。

如果你对 Arch Linux 系统的安装还不是很了解,可以回头看看我之前的两篇文章,它们能让你掌握如何安装并配置好一个可用的 Arch Linux 系统:

  1. VirtualBox 虚拟机体验 Arch Linux 基础安装小记》这篇文章记录了如何安装一个基础的 Arch Linux 系统。
  2. Arch Linux 安装并配置桌面环境》这篇文章记录了如何在基础系统之上,配置好图形化的桌面环境,以及中文显示和输入法等内容。

Arch Linux 的安装过程总体来说并不是很复杂,和 Ubuntu 相比,我的体验就是从一个带任务剧情的游戏换成了一个开放世界的游戏,自由度高了,也更加有趣。

环境需求

在正式开始一项工作之前,先分析并确立自己的目标需求是一个比较好的习惯。

我们的目标是搭建一个 PHP 开发环境。那么问题来了,这个 PHP 开发环境具体应该包含哪些内容?

我的思考和分析如下:

  • 首先,作为语言本身,PHP 语言的执行环境是必不可少的。
  • PHP 的主要应用场景就是 Web 开发,为了方便查看程序执行结果,一个 Web 服务也是少不了的。虽然 PHP 命令端已经通过 -S 参数实现了内置的 Web 服务,但这只能算是临时用途。这里我会选择安装 Nginx。
  • 程序开发过程中离不开数据的存储,要方便和高效的存储数据,自然是离不开数据库。作为中小业务的首选,MySQL 自然是当仁不让。另外作为缓存用途,Redis 一样也不能落下。
  • Web 程序除了 PHP 这种后端语言,作为支撑界面的前端也是很重要的。目前的前端代码早已过了手写时代,通过 Node.js 和其他各种工具进行转译和打包才是正途,所以 Node.js 也要有。

综合以上,我们归纳出以下需要安装的程序:

  • Nginx
  • MySQL
  • Redis
  • Node.js
  • PHP

安装服务和执行环境

明确了需求,接下来就是按部就班的开始安装各项所需的软件。不过开始之前,有一件不太重要的小事我觉得有必要先做一下:创建项目目录。

我的习惯就是在当前用户的主目录下创建一个 Projects 目录:

mkdir ~/Projects

好了,让我们继续。

安装 Nginx

使用 pacman 命令安装:

sudo pacman -S nginx

启动 Nginx:

sudo systemctl start nginx

如果想以后每次开机的时候 Nginx 就自动启动,就执行一下下面的命令:

sudo systemctl enable nginx

在浏览器输入 http://localhost,如果出现以下欢迎界面,表示 Nginx 安装成功,可以继续下一项。

nginx-welcome

安装 MySQL

MySQL 的安装步骤稍微复杂一点,同样也是使用 pacman 命令:

sudo pacman -S mariadb

不熟悉的朋友请不要以为上面的命令打错了。作为 MySQL 的开源社区版本,MariaDB 在使用上和 MySQL 是一样的。

安装命令执行完成后,启动数据库服务之前需要执行一下初始化命令:

sudo mariadb-install-db --user=mysql --basedir=/usr --datadir=/var/lib/mysql

然后启动数据库服务:

sudo systemctl start mariadb

接着执行一下安全策略的辅助配置脚本:

sudo mysql_secure_installation

这个脚本以问答交互的方式执行,按提示操作就可以了。注意修改 root 账号密码的那一步,设置一个自己能记住的密码。本地开发用的,不用搞太复杂。

最后就是验证安装结果了,输入以下命令:

mysql -uroot -p

按回车键执行后会问要 root 账号的密码,输入前面一步中设置的密码,如果能进入 MySQL 的 Shell 界面,那就没问题了。

mysql-shell

如果希望数据库开机自动启动,执行一次下面的命令:

sudo systemctl enable mariadb

在 Arch Linux 上使用 Workbench 图形化的 MySQL 管理软件时,可能会碰到无法连接 MySQL 服务的问题。如果提示的消息是:The name org.freedesktop.secrets was not provided by any .service files,可以通过 pacman 命令安装 gnome-keyring 组件来解决。

安装 Redis

和 MySQL 相比,Redis 的安装就简单多了。使用以下命令:

sudo pacman -S redis

然后启动 Redis 服务:

sudo systemctl start redis

如果要开启自动启动 Redis 服务,还是和之前相同的命令:

sudo systemctl enable redis

使用下面的命令可以验证 Redis 是否安装成功:

redis-cli

如果出现以下界面,就没问题了:

redis-cli

安装 Node.js

Node.js 也是相同的套路,首先是安装:

sudo pacman -S nodejs

然后输入以下命令:

node -v

能得到下面类似版本号的输出就可以了。

image-20210901103404976

安装 PHP

终于到最后的正主了,作为最后的压轴,我将尝试两种安装 PHP 的方式。一种是跟上面类似的包管理方式。另外一种就是最原始的编译方式。两种安装方式各有自己适合的场景,所以要怎么选择就看各位自己了。

使用 pacman 安装 PHP

使用 pacman 命令安装 PHP 简单快捷:

sudo pacman -S php php-fpm

在当前时间点(2021-09-01),这将会安装最新的 PHP 8。如果你需要安装 PHP 7,需要执行以下命令:

sudo pacman -S php7 php7-fpm

安装 PHP 扩展也是采用类似的方法:

sudo pacman -S php-gd php-redis php-geoip

总之,一切交给 pacman 命令来就行了。

接下来需要配置下 /etc/php/php-fpm.d/www.conf 文件,修改以下几项配置:

user = zzxworld
group = zzxworld

listen = 127.0.0.1:9000

user 和 group 后面的 zzxworld 为当前登录的用户名称,请替换为你自己的登录名。

使用源码编译安装 PHP

使用源码编译的方式就没有这么轻松了,但这种方式可以让我们随心所欲的安装任何 PHP 版本。不论是最新的,还是最老的。它不一定适合所有人,但所有人都有必要了解。(注:这里所有人指的是用 Linux 作为开发环境的人)

源码编译的第一步就是下载源码,用浏览器打开 PHP 官网的下载地址:https://www.php.net/downloads。选择当前稳定版本 7.4.23。

image-20210901114133948

点击第一个 php-7.4.23.tar.gz 下载到本地。

打开终端程序,输入以下命令进入 Downloads 目录:

cd ~/Downloads

通过 ls 命令应该会发现里面有一个 php-7.4.23.tar.gz 文件,解压这个文件:

tar zxvf php-7.4.23.tar.gz

当前目录下会多了个 php-7.4.23 目录。

进入这个目录:

cd php-7.4.23

执行以下编译命令:

./configure --prefix=/usr/local/php7 \
    --enable-fpm \
    --with-fpm-systemd

--prefix--enable-fpm--with-fpm-systemd 都是编译参数,用来指定编译的位置,以及需要编译出那些功能。类似的参数还有很多,可以通过以下命令来查询:

./configure --help

这里仅做演示,所以只设置的以上几个参数,实际的业务场景下,会设置更多。比如开启网络请求组件 CURL,启用图片处理组件 GD 等。

开启响应的功能,也会需要提前安装一些依赖的库和软件。如果缺少依赖的软件,编译的过程中会报错并给出提示。拿着这些编译提示消息,通过搜索引擎基本都能解决。

如果你目前的 Arch Linux 系统是按照我前面的两篇文章安装的,如果执行上面的编译命令,大概率会遇到如下的错误:

image-20210901131314236

这是提示缺少 C 编译器,所以要补充安装一下:

sudo pacman -S gcc

再次执行编译命令,顺利执行了一大段代码后,又会碰到这个错误:

image-20210901131703182

貌似是提示没有 pkg-config 脚本,那就安装一个:

sudo pacman -S pkgconf

再次执行编译命令,如果出现“ Thank you for using PHP”,那就完成了编译的第一步。

image-20210901132023948

接下来,需要使用 make 命令来开始编译。首先安装一下 Make

sudo pacman -S make

然后开始编译:

make

接下来就需要相当长一段时间,等待编译完成。如果电脑性能不佳,去看一集电视剧都可以。

如果中间没有出现任何编译错误,应该会出现 “Build complete“ 的提示,这意味着编译好了,执行编译安装命令:

sudo make install

在一连串的 “Installing ....” 信息之后,就完成了 PHP 的编译安装。但这并不代表编译安装 PHP 的工作流程都结束了,接下来还有一些后续的收尾工作。

首先需要从源码中复制一份 php.ini 文件。源码中提供了有两份,名称分别为 php.ini-developmentphp.ini-production。我们开发环境使用,所以复制 development 命名的这份:

sudo cp php.ini-development /usr/local/php7/lib/php.ini

然后再复制一份 php-fpm 的配置文件:

sudo cp /usr/local/php7/etc/php-fpm.conf.default /usr/local/php7/etc/php-fpm.conf
sudo cp /usr/local/php7/etc/php-fpm.d/www.conf.default /usr/local/php7/etc/php-fpm.d/www.conf

打开 /usr/local/php7/etc/php-fpm.d/www.conf 文件,修改如下的配置项目:

user = zzxworld
group = zzxworld

后面的 zzxworld 为当前登录的用户名称,请替换为你自己的登录名。

最后再复制一份 php-fpm 的服务管理配置文件:

sudo cp sapi/fpm/php-fpm.service /usr/lib/systemd/system/

打开 /usr/lib/systemd/system/php-fpm.service 文件,修改成如下的配置值,否则因为权限问题会无法正常启动 php-fpm。

ProtectSystem=strict

这就算是完工了。

最后的检查和验证

通过以上步骤,我们基本完成了 PHP 开发环境的搭建,接下来要用经典的 phpinfo() 函数来验证一下结果。

还记得开头我们创建的 Projects 目录吗,让我们在里面先创建一个 PHP 脚本文件:

echo "<?php phpinfo();" >> ~/Projects/phpinfo.php

然后打开 Nginx 的配置文件 /etc/nginx/nginx.conf,修改一下下面所示的两处配置:

# ...
user zzxworld;
# ...
        server {
            location / {
                root /home/zzxworld/Projects;
#               ...
            }
        }

#       ...

        location ~ \.php$ {
            root /home/zzxworld/Projects;
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            include fastcgi.conf;
        }
# ...

注意配置项中的 zzxworld,这是我的用户名和目录中的名称,请替换成你自己的。

重启一下 Nginx 服务:

sudo systemctl restart nginx

然后再启动一下 php-fpm 服务:

sudo systemctl start php-fpm

在浏览器中输入 http://localhost/phpinfo.php,按回车键后如果返回下面这个页面内容,就意味着大功告成。

phpinfo

总结

如果只是纯粹的想学习一下 PHP 这门语言,前面的 Web 服务器,数据库,Node.js 其实都可以不用安装。Web 服务器就用 PHP 命令内置的,数据库可以换成 SQLite,至于缓存,存文件就行了。

这些步骤看起来很繁琐,但基本都是通过命令端在操作。所以完全可以把这些步骤做成一个安装脚本,实现一键安装。我以前就有这样一个 Shell 脚本,在新安装的系统上,执行这个脚本后,去干点别的,过会儿回来看,开发环境就安装好了。不过 Docker 出现后,我的开发环境就开始转向了 Docker。

把 Docker 应用于开发环境,让系统更加的纯粹,也更加优雅的解决了不同项目对语言版本要求不一的问题。不过也带来了另外一些问题,我想接下来应该会写一篇文章,介绍一下我全部用 Docker 搭建一个开发环境的过程和体验。

总之,这是我学习并了解 Arch Linux 的第三篇文章。我已经学会了如何安装 Arch Linux 系统,并配置一个图形化的桌面环境,并开始尝试搭建了一个 PHP 开发环境。不过作为开发环境来说,还缺少一些写代码的工具。所以提前预告一下,下一篇文章我可能会尝试在 Arch Linux 上配置一个愉悦的代码编辑环境。这个愉悦当然只是针对我自己而言的,所以仅希望对各位能有借鉴意义,欢迎关注。