PHP 开发环境搭建

前言

本篇文章主要梳理 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