前言
本篇文章主要梳理 PHP 的原理以及如何在 mac 本地搭建 PHP 的开发环境;
基础
原理
CGI
首先,我们要弄懂什么是 CGI(Common Gateway Interface) 既通用网关接口,笔者试图用一句话来概括:就是:CGI 是一种数据接口协议,是静态 Web 服务器与应用程序之间的数据交换的协议。怎么来理解笔者的这句话呢?
- 首先,我们要了解一下 CGI 诞生的历史,最初的 Web 服务器非常的简单,主要是用来提供静态资源的内容,也就是说,它并不负责处理动态的内容;
- 后来,随着 Web 的发展,逐渐的,我们需要用户登录,识别用户身份,根据不同的用户展示出不同的页面,即便是相同的页面根据不同的用户也需要展示出不同的内容,于是,我们需要这样的一套机制,使得当下的静态 Web 服务器能够支持动态的特性,于是 CGI 协议便诞生了;
由此,我们应该知道,CGI 协议充当这么一种角色,就是使得静态的 Web 服务器能够处理动态的内容,典型的静态 Web 服务器有 Apache,Nginx 等等;而能够提供动态数据处理能力的当然就是我们的应用程序,只是,该应用程序要能够为静态 Web 服务器提供动态数据的支撑,它必须实现 CGI 协议接口,这样,它才能够与静态 Web 服务器之间进行数据交互,而符合该标准的典型的应用程序,便是本文笔者将要描述的 PHP;用下面一张图来描绘他们之间的关系,
如图,PHP 实现了 CGI 的接口,由此它便可以与静态 Web 服务器之间进行交互,并处理动态的响应请求;
后记,随着技术的发展,动态 Web 服务器也随之而诞生了,它同时兼备了静态 Web 服务器 + 实现了 CGI 标准的应用程序的特性,接收 HTTP 请求,同时通过新的 Servlet 标准直接响应动态内容,比如我们常用的 Tomcat、Jetty 等动态 Web 服务器亦或像构建于 Node.js 之上的异步 Express Web 服务器;所以,以后的大多数动态 Web 服务不再使用 CGI 的标准了;
Fast-CGI
原始的 CGI 标准饱受诟病,因为它要求针对每一次对 HTTP 动态请求的过程都使用一个单独的进程来处理,100 次动态请求就需要 100 个进程来处理,对服务器的资源消耗是致命的;正是因为这个原因,Fast-CGI 诞生了,它重新设计了 CGI 的标准,使得同一个进程可以同时处理多个请求,这样,极大的减少服务器的性能开销;
PHP-FPM
PHP 最开始的版本是基于 CGI 网关接口的,正如前文所描述的那样,它的处理方式会极大的消耗服务器的资源,因此为了支撑新的标准 Fast-CGI,于是 PHP-FPM 模块诞生了;从 https://php-fpm.org/ 的日志中可以看到,PHP-FPM 已经作为 PHP 内部的一个核心的模块默认绑定到 PHP 中了,所以无需单独对其进行安装;见如下描述,
Antony Dovgal announced that PHP-FPM is now being packaged in PHP core’s trunk. Read here. Official instructions for downloading will be up shortly.
开发环境
开发
使用 PhpStorm 直接构建开发环境即可;直接在官网上下载 PhpStorm,然后使用如下链接激活;
http://idea.codebeta.cn/
macOS 默认安装的是 PHP7.1,使用如下命令安装最新版的 PHP72
1 | $ brew install php72 |
设置环境变量,
首先查找可执行文件 php
1
$ find /usr -name php
设置环境变量,在 ~/.bash_profile 中添加下面这一行
1
export PATH="$PATH:/usr/local/Cellar/php/7.2.5/bin/"
验证
1
$ php -v
设置 PhpStorm
- 创建 php 工程
- 创建 php 测试文件,
- 设置 php 解释器
选择 PHP 7.2 并进行设置; - 点击 Chrome 按钮即可在浏览器启动;
调试
如果想直接调试 PHP 文件,可以直接在 php 代码中设置断点并且使用 PhpStorm 的 Debug 进行调试,但是这种方式缺少了和 HTTP 请求的互动也就是缺少了和浏览器之间的互动;官方推荐使用 xdebug + Chrome Xdebuger Helper 插件 + ? 的方式来进行调试,参考如下步骤,
首先,按照如下的步骤安装和配置 xdebug
安装 xdebug
PHP 的代码不能直接通过 PhpStorm 来进行调试,官方推荐使用 xdebug 来对 PHP 进行调试;官网的介绍 https://www.jetbrains.com/help/phpstorm/debugging-with-phpstorm-ultimate-guide.html
不过,有关 xdebug 的介绍已经有些过期了,比如安装 xdebug 的方式,1
$ brew install homebrew/php/php72-xdebug
因为 homebrew/php 已经不再维护,所以上述的命令是不对的,解决方法参考 https://stackoverflow.com/questions/49623173/install-xdebug-for-php-5-6-on-osx-with-homebrew 我们需要使用 pecl 来进行安装
1
2
3
4
5
6
7$ pecl install xdebug
......
......
Build process completed successfully
Installing '/usr/local/Cellar/php/7.2.5/pecl/20170718/xdebug.so'
install ok: channel://pecl.php.net/xdebug-2.6.0
Extension xdebug enabled in php.ini可见,xdebug 的相关信息也添加到了 php.ini 中;这样,再次在 phpstorm 中使用 Debug 模式启动,就可以进行调试了;备注,pecl 默认跟随 php72 一并进行了安装,所以无需额外安装;
检查 xdebug 是否安装成功,
按照如何找到并打开 php.ini 小节的步骤,打开 php.ini,如果安装成功,会在文件的开头处添加一行,1
zend_extension="xdebug.so"
如果有这一行则表示安装成功了;
配置 php.ini
在文件的最末尾添加如下内容,1
2
3
4
5
6
7[xdebug]
xdebug.remote_enable = on
xdebug.remote_handler = dbgp
xdebug.remote_mode = req
xdebug.remote_host = localhost
xdebug.remote_port = 9000
xdebug.idekey = PHPSTORM设置 php Servers
- 确保 debug port 与 php.ini 中配置的一致
再次,在 Chrome 浏览器中安装 Xdebuger Helper 插件
- 在 Chrome 的 extensions 中搜索并安装 Xdebuger Helper
- 设置 Xdebuger Helper,将 IDE key 设置为 PhpStorm
点击箭头指向的按钮进入该插件的设置,
选择 PhpStorm,并点击 Save 按钮,
最后,按照如下测试用例的步骤开启调试,有两种方式可以开启这种调试的方式,
使用默认配置的 Debug Server 通过浏览器进行测试
- 使用 Debug 模式启动 PHP Server,
点击 Debug 按钮以后,Chrome 会使用默认的方式开启浏览器,这个时候,不用管它;直接将你要测试的地址贴在 Chrome 中进行调试就可以了,见下面的步骤, - 在 Chrome 中输入需要进行调试的链接地址,http://localhost:63342/securimage/info.php 然后记得在 PhpStorm 中点选接收,于是 Debug 开始了
- 这种方式之所以可以直接进行 Debug,是因为 PhpStorm 默认的在后台帮我们生成了一个 Server
PhpStorm 调试 PHP 代码的时候,使用的就是这个默认的 Server;
- 使用 Debug 模式启动 PHP Server,
使用 PHP Web Page
遗憾的是,第 #2 种方式配置了好久,可是始终没有配置成功;有个 1个小时左右的英文视频阐述如何使用这种方式来进行调试,https://www.youtube.com/watch?v=LUTolQw8K9A 有时间再看看;- 配置 PHP Web Page,菜单栏中 Run -> Edit Configurations,
- 启动 PHP Web Page 开始调试
- 配置 PHP Web Page,菜单栏中 Run -> Edit Configurations,
- 或者直接对 PHP 代码进行调试,
这样,我们便可以直接对 php 代码进行调试;
备注,因为 PhpStorm 官网上的内容已经很久没有更新了,大部分的介绍还是停留在 PHP56 上,于是乎中途有试图放弃过 PHP72 而改用 PHP56,相关环境都搭建得差不多了,但是在使用 pecl 安装 xdebug 的时候,告诉我已经不兼容 PHP56 了,还得找一个支持 PHP56 版本的 xdebug,发现如果现在改用 PHP56 水更深,于是放弃这种尝试了;
References
https://confluence.jetbrains.com/display/PhpStorm/Zero-configuration+Web+Application+Debugging+with+Xdebug+and+PhpStorm
https://www.jetbrains.com/help/phpstorm/debugging-with-phpstorm-ultimate-guide.html
https://blog.csdn.net/json_vip/article/details/54916119
发布环境
这里主要描述如何在 mac 上构建 PHP 的开发环境;MacOS High Sierra 中默认安装了 Apache 和 PHP,本篇文章将基于此环境并参考官文来构建 PHP 的开发环境,
首先,检查环境,
检查 PHP 环境
默认情况下 High Sierra 是安装了 PHP 的;1
$ php -v
检查 Apahce
然后,编辑 Apache 的配置,配置文件路径 /usr/local/etc/apache2/2.4/httpd.conf
使其支持 PHP,注意,我本地的 PHP 版本是 7.2.5
1
$ sudo vim /private/etc/apache2/httpd.conf
去掉下面这行的注释,
1
LoadModule php7_module libexec/apache2/libphp7.so
在 dir_module 的配置中添加 index.php,如下
1
2
3<IfModule dir_module>
DirectoryIndex index.html index.php
</IfModule>设置 Document Root,将 Document Root 设置为你的 PHP 源码和相关文件所在的路径,
1
2DocumentRoot "/Users/mac/Sites"
<Directory "/Users/mac/Sites">
然后,创建一个最简单的 php 文件,info.php 包含如下的内容即可,1
phpinfo();
附录
如何找到并打开 php.ini
如何查找并编辑 php.ini
- 打开 php.ini
- 点击 Open in Editor,这样就可以在 phpstorm 上面编辑了,
References
自己一步一步搭建:
中文:http://blog.qiji.tech/archives/132
原文:https://blog.frd.mn/install-nginx-php-fpm-mysql-and-phpmyadmin-on-os-x-mavericks-using-homebrew/
细说 PHP-fpm: https://github.com/YuanLianDu/YLD-with-Php/blob/master/articles/php/php-fpm.md 下载
http://php.net/manual/zh/faq.installation.php#faq.installation.phpini
https://laravel-china.org/articles/6243/build-php-development-environment-in-macos-high-sierra-1013