Contents
  1. 1. 前言
  2. 2. 基础
    1. 2.1. 原理
      1. 2.1.1. CGI
      2. 2.1.2. Fast-CGI
      3. 2.1.3. PHP-FPM
  3. 3. 开发环境
    1. 3.1. 开发
    2. 3.2. 调试
  4. 4. 发布环境
  5. 5. 附录
    1. 5.1. 如何找到并打开 php.ini
  6. 6. References

前言

本篇文章主要梳理 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 how iteract with static server via cgi.png
如图,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

设置环境变量,

  1. 首先查找可执行文件 php

    1
    $ find /usr -name php
  2. 设置环境变量,在 ~/.bash_profile 中添加下面这一行

    1
    export PATH="$PATH:/usr/local/Cellar/php/7.2.5/bin/"

    验证

    1
    $ php -v

设置 PhpStorm

  1. 创建 php 工程
  2. 创建 php 测试文件,
    phpstom example.png
  3. 设置 php 解释器
    how to find php.ini.png 选择 PHP 7.2 并进行设置;
  4. 点击 Chrome 按钮即可在浏览器启动;

调试

如果想直接调试 PHP 文件,可以直接在 php 代码中设置断点并且使用 PhpStorm 的 Debug 进行调试,但是这种方式缺少了和 HTTP 请求的互动也就是缺少了和浏览器之间的互动;官方推荐使用 xdebug + Chrome Xdebuger Helper 插件 + ? 的方式来进行调试,参考如下步骤,

首先,按照如下的步骤安装和配置 xdebug

  1. 安装 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 一并进行了安装,所以无需额外安装;

  2. 检查 xdebug 是否安装成功,
    按照如何找到并打开 php.ini 小节的步骤,打开 php.ini,如果安装成功,会在文件的开头处添加一行,

    1
    zend_extension="xdebug.so"

    如果有这一行则表示安装成功了;

  3. 配置 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
  4. 设置 php Servers
    configure php server.png

  5. 确保 debug port 与 php.ini 中配置的一致
    configure debug port.png

再次,在 Chrome 浏览器中安装 Xdebuger Helper 插件

  1. 在 Chrome 的 extensions 中搜索并安装 Xdebuger Helper
  2. 设置 Xdebuger Helper,将 IDE key 设置为 PhpStorm
    点击箭头指向的按钮进入该插件的设置,
    xdebuger helper settings entrance.png
    选择 PhpStorm,并点击 Save 按钮,
    xdebuger helper settings - set it to be phpstorm.png

最后,按照如下测试用例的步骤开启调试,有两种方式可以开启这种调试的方式,

  1. 使用默认配置的 Debug Server 通过浏览器进行测试

    1. 使用 Debug 模式启动 PHP Server,
      start php server with debug model.png
      点击 Debug 按钮以后,Chrome 会使用默认的方式开启浏览器,这个时候,不用管它;直接将你要测试的地址贴在 Chrome 中进行调试就可以了,见下面的步骤,
    2. 在 Chrome 中输入需要进行调试的链接地址,http://localhost:63342/securimage/info.php 然后记得在 PhpStorm 中点选接收,于是 Debug 开始了
      phpstorm - the debug begin.png
    3. 这种方式之所以可以直接进行 Debug,是因为 PhpStorm 默认的在后台帮我们生成了一个 Server
      default generated php debug server.png PhpStorm 调试 PHP 代码的时候,使用的就是这个默认的 Server;
  2. 使用 PHP Web Page
    遗憾的是,第 #2 种方式配置了好久,可是始终没有配置成功;有个 1个小时左右的英文视频阐述如何使用这种方式来进行调试,https://www.youtube.com/watch?v=LUTolQw8K9A 有时间再看看;

    1. 配置 PHP Web Page,菜单栏中 Run -> Edit Configurations,
      phpstorm php web page setup.png
    2. 启动 PHP Web Page 开始调试
      debug via php web page - start page.png
  3. 或者直接对 PHP 代码进行调试,
    direct debug the php file.png 这样,我们便可以直接对 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

  1. 使其支持 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>
  2. 设置 Document Root,将 Document Root 设置为你的 PHP 源码和相关文件所在的路径,

    1
    2
    DocumentRoot "/Users/mac/Sites"
    <Directory "/Users/mac/Sites">

然后,创建一个最简单的 php 文件,info.php 包含如下的内容即可,

1
<?php phpinfo(); ?>

附录

如何找到并打开 php.ini

如何查找并编辑 php.ini

  1. 打开 php.ini
    how to find php.ini.png
  2. 点击 Open in Editor,这样就可以在 phpstorm 上面编辑了,

References

http://php.net/manual/zh/

自己一步一步搭建:
中文: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

Contents
  1. 1. 前言
  2. 2. 基础
    1. 2.1. 原理
      1. 2.1.1. CGI
      2. 2.1.2. Fast-CGI
      3. 2.1.3. PHP-FPM
  3. 3. 开发环境
    1. 3.1. 开发
    2. 3.2. 调试
  4. 4. 发布环境
  5. 5. 附录
    1. 5.1. 如何找到并打开 php.ini
  6. 6. References