PHP是一种非常容易学习和使用的一门语言,它的语法特点类似于C语言,但又没有C语言复杂的地址操作,而且又加入了面向对象的概念,再加上它具有简洁的语法规则,使得它操作编辑非常简单,实用性很强。但是由于语言发展较快,版本较多,应用过程中,要求开发人员对软件版本、特性等一定熟悉度,否则容易造成冲突,使配置问题难以处理。因此,PHP 开发者常被建议避免单独进行环境搭配,而使用容器(如docker),或封装好的环境安装包(如LAMP)。也因此很多PHP 开发者可能已经参与过多个项目开发,却没有搭建过PHP 环境。
环境搭建不仅是为了进行开发方便,也是帮助开发者特别初学者加深对语言运行原理理解的良好方法。本文将整个搭建过程分为两部分:
PHP Web服务器环境搭建(nginx, php) 和 PHP 开发调试环境搭建(xdebug ,PhpStorm)。
一、PHP Web服务器环境搭建
我们都知道PHP是解释型语言,支持多种运行模式,比较常见的五大运行模式包括cli、cgi 、fast-cgi、isapi、apache模块的DLL。
目前最为流行的nginx+php-fpm 模式,即fast-cgi 模式,下面是其运行原理:
- Web服务器启动时,初始化FastCGI 的程序执行环境。例如Nginx 服务器对应的 ngx_http_fastcgi_module 模块加载。
- FastCGI进程管理器自身初始化,启动多个CGI解释器进程并等待来自Web服务器的连接。
- 当客户端请求到达Web服务器时,Web服务器将该请求采用socket方式转发到 FastCGI 主进程, FastCGI 主进程选择并连接到一个CGI解释器(关联 FastCGI 子进程),然后,Web服务器将CGI环境变量和标准输入发送到 FastCGI 子进程。
- FastCGI 子进程完成处理后,将标准输出和错误信息从同一socket连接返回给Web服务器。最后FastCGI 子进程关闭与Web服务器之间的连接。
- FastCGI 子进程继续等待并处理下一个来自Web服务器的连接。
因为只是开发环境,为简化安装配置,我们使用CGI模式(PHP 自带php-cgi.exe),其原理相对更简单:
1) 每次当web server收到index.php这种类型的动态请求后,会启动对应的CGI程序(PHP的解析器);
2)PHP解析器会解析php.ini配置文件,初始化运行环境,然后处理请求,处理完成后将数据按照CGI规定的格式返回给web server然后退出进程;
3)最后web server再把结果返回给浏览器;
下面是具体安装步骤:
- PHP 官网下载Windows 版本zip 包(留意版本号,是否nts, 及是否X64), 下载后解压即可。本文使用 E:\\php7
- nginx 官网下载nginx zip包, 下载后解压即可,如:E:\\nginx
- PHP 根目录(E:\\php7)下复制php.ini-development ,粘贴到同目录下,重命名为php.ini
- 启动php-cgi.exe, PHP根目录下右键启动 CMD, 执行 php-cgi.exe -b 127.0.0.1:9001 -c E:\\php7\\php.ini
- nginx配置目录下(E:\\nginx\\conf)编辑nginx.conf. 在server 节点中添加如下配置, 保存后双击E:\\nginx\\nginx.exe 启动
location ~ \.php$ {
root E:/phpwork/blog/public; #php 项目根目录
fastcgi_index index.php; #默认的php脚本
fastcgi_pass 127.0.0.1:9001; #转发到的php-cgi 服务地址和端口
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
至此 php 的web 服务环境搭建完成(后续项目步骤中简称为服务端),可以在php 项目根目录创建 index.php, 任意输入点内容,访问 http://localhost/index.php 验证。
二、PHP 开发调试环境搭建
有了web 服务环境,就可以进行代码编写及运行了,但对于开发来说好用的IDE和调试工具无疑是可以大大提高开发效率的。接下来我们将在本地搭建一套开发调试环境,因为PHP本身是不支持单步调试的,需要安装相应的扩展,本文采用Xdebug 扩展(php 扩展,支持按行执行)。首先简单介绍下Xdebug 与PhpStorm调试原理:
1)PhpStorm集成了一个遵循BGDp的Xdebug插件。启动该插件会启动一个监听服务,负责监听远程服务器发过来的debug信息。
2)服务端PHP收到需要进行debug的请求(带debug标识或cookie,如XDEBUG_SESSION_START) 后通知Xdebug扩展
3)Xdebug扩展会向来源配置的客户端(即PhpStorm的Xdebug服务)发送一个debug请求,收到响应后启动调试。
4)PHP开始执行代码,每执行一行都会让Xdebug过滤一下。
5)Xdebug过滤代码时,会暂停代码的执行,然后向客户端发送该行代码的执行情况,等待客户端的决策。
6)客户端收到Xdebug发送过来的执行情况,判定对应行是否存在断点,如存在则在IDE展示相关信息,等待开发者发送操作调试指令(单步,还是执行到下个断点)。
7)开发者发生调试指令后,客户端相应给服务端,重复4-7步。
从以上原理可以知道, PhpStorm 及服务端相互依赖的,且需要在双方做关联配置。其中PhpStorm 需要知道服务端地址与端口, 同时服务端也需要客户端Xdebug服务的地址与端口。
因为上面服务端调试完成,我们已经知道了服务端的地址和端口,我们先配置PhpStorm,启动PhpStorm 新建或载入一个项目,接下来开始配置:
- File –> settings 设置Xdebug 客户端服务端口, 改端口需要配置到服务端。
- File –> settings 设置DBGP, IDE key 任意填写,需要配置到服务端。
- File –> settings 设置servers, 填写服务端地址与端口, debugger 选择 Xdebug
- run –> debug configurations 设置debug 配置, 添加一个PHP Web page, server 选择3 步配置的server
- 在服务端Xdebug 扩展安装配置好并在IDE 设置好断点后启动调试, IDE 自动使用第4步配置的浏览器打开Start URL
- 进行调试。
服务端Xdebug 扩展安装与配置
- 下载安装Xdebug 扩展,需要特别注意你服务端使用的php 版本。不请求的可以复制phpinfo() 输出页面源码到https://xdebug.org/wizard 会自动跳转到对应版本下载地址。
- 下载的dll 复制到php 的ext 目录下(非必须),如E:\\php7\\ext
- 修改php.ini ,增加以下配置. 注意:以下配置是基于3.0.3版本,3.0 版本以前配置稍有不同,参考:https://xdebug.org/docs/upgrade_guide
;xdebug库文件
zend_extension=php_xdebug-3.0.3-7.3-vc15-nts-x86_64.dll
;开启远程调试xdebug.mode=debug
;客户机ip
xdebug.client_host=”127.0.0.1″
;客户机xdebug监听端口和调试协议
xdebug.client_port=9011
;IDEkey 区分大小写
xdebug.idekey=”PHPSTORM”
4. 重启 php-cgi.exe , CMD 命令行运行 php -m 查看扩展是否加载成功,在phpinfo 页面可以查看详细的xdebug 生效配置。
至此服务端配置完成, 可以在IDE 中点击调试进行调试。
总的来说整个安装过程还是比较简单,容易出错的地方不多,主要有:
- PHP 和扩展版本未对应
- 配置出错,特别是Xdebug 扩展配置,不过对原理有了解后, 对于各配置项也就更能理解。
安装步骤大家没必要记,因为不同系统或版本可能都有不同, 所以更希望大家通过环境安装能够加深对相关原理理解。
附:
Xdebug linux 环境安装要更简单一点,官方安装文档也比较完善。下面是源码安装的步骤和命令示例
注意检查PHP版本,源码安装只需找到对应版本号就可以,如php 7.1 只能找3.0以下的 wget https://xdebug.org/files/xdebug-2.9.8.tgztar -xzvf xdebug-2.9.8.tgz cd xdebug-2.9.8.tgz phpize ./configure makemake install #成功会显示安装位置, 如:/opt/bitnami/php/lib/php/extensions/ 正常情况会自动配置php.ini (php --ini 查看ini 位置), 可以使用 php -m 查看是否能成功加载。 按上文修改php.ini 配置,填入正确的客服端信息即可 由Xdebug 调试原理可知,如果远程调试,则要求客户端(IDE Xdebug服务)和服务端网络是互通, 不仅客户端能访问服务端, 服务端也要能够访问客户端。