一、PHP的运行方式

你好,我是小雨青年,一名程序员。

今天我们来学习如何在本地搭建PHP的运行环境,在这之前我们先来看下PHP的怎么跑起来的。

前面我们提到过,PHP是一种脚本语言,不需要编译即可执行。

1. 命令行运行

在本地安装完成PHP之后,可以直接在命令行运行 php xxx.php运行文件。

php test.php

这种场景一般用在临时执行脚本,或者需要定时任务调用。

2. 服务器端执行

作为Web服务端PHP,绝大多数还是作为Web服务的。

目前Web端运行PHP有两种形式,这两种形式也分别对应了程序连接PHP的两种形式。

  • Apache模式,以Apache的模块运行
  • FastCGI模式,一般通过Nginx服务器调用

关于这两种运行模式,我们会在后续详细说明,本篇的目的是教你如何在本地搭建起PHP的运行环境。

二、整合套件,懒人必备

1. wampserver

Windows 平台上推荐使用的套件,支持切换PHP版本,自带MySQL数据库,并且支持比较老的WIn版本。

这个套件是法国人开发的,官网支持英文。官网地址是 https://www.wampserver.com/en/ 。

这里注意,我们在学习中免不了要下载一些的东西,建议你直接去找源头渠道,即官网,这样可以免去很多弯路,并且不会被错误的信息引导。

image-20220823174841256

2. phpStudy

phpStudy 算是国内做集成环境很早的软件了,并且现在还在更新,现在叫小皮面板。

官网链接 https://www.xp.cn/download.html

image-20220823175228874

3. MAMP

MAMP 是 MacOS 上的集成环境,同时也有win版本。

官网链接 https://www.mamp.info/en/mamp/mac/

关于集成环境,友好的图形界面就是最好的教程,如果你对哪个操作有疑问,可以在评论下列出。

如果你正在使用哪些集成环境,可以在评论区和我一起讨论。

三、Docker,强烈推荐

docker 的优势在于对于原生系统的入侵程度低,如果你的系统装的软件过于复杂,就会在原生安装的时候出现各种问题。

还有一个原因,docker 作为开发环境,可以通过docker-compose.yml 放在代码库中,方便团队内成员同步开发环境,不管是更新配置文件还是增加redis或者memcached都很方便。

使用Docker配置环境,你可以很清晰地知道你的PHP、Nginx的配置情况,并且因为和本地环境隔离,不会有冲突的风险。

这是一份很完整的PHP的docker-compose配置,包括了

  • elasticsearch
  • kibana
  • php
  • nginx
version: "3"
services:
  elastic:
    image: elasticsearch:6.7.0
    ports:
      - "9200:9200"
    environment:
      - bootstrap.system_call_filter=false
    volumes:
      - ../elasticsearch-local/data:/usr/share/elasticsearch/data
    networks:
      web:
        ipv4_address: 172.25.0.3
  kibana:
    image: kibana:6.7.0
    environment:
      - I18N_LOCALE=zh-CN
      - ELASTICSEARCH_HOSTS=http://172.25.0.3:9200
      - ELASTICSEARCH_URL=http://172.25.0.3:9200
    ports:
      - "5601:5601"
    networks:
      - web
  php:
    image: crunchgeek/php-fpm:7.0
    volumes:
      - ./yii_env.php:/var/www/yii_env.php
      - ./php.ini:/usr/local/etc/php/php.ini
      - ./:/var/www/html
    networks:
      - web
  web:
    image: nginx
    ports:
      - "8001-8009:8001-8009"
    volumes:
      - ./yii_env.php:/var/www/yii_env.php
      - ./:/var/www/html
      - ./default:/etc/nginx/conf.d/default.conf
      - ./localcerts:/etc/nginx/certs
    networks:
      - web

networks:
  web:
    ipam:
      driver: default
      config:
        - subnet: "172.25.0.0/16"

那你可能要问了,诶,MySQL呢?我不需要elasticsearch啊?别急,下面我们一步步地从零开始编写属于自己的本地PHP的docker-compose文件。

1. composer.yml的结构

你要想使用docker作为开发环境,就需要简单了解一下docker和docker-compose文件的基本构成。

Docker是一个容器平台,可以把应用软件和基础架构区分开,并可以通过管理应用软件的方式管理基础架构,可以理解为配置即服务。下图为Docker的架构图,你可以看到,Docker占用的系统资源相对于虚拟机来说更少。

docker与虚拟机的区别

什么是docker-compose呢?你可以理解为对docker命令的打包,由于一套环境涉及到多种软件,并且会挂载到不同目录和不同的配置,那么docker-compose就可以把所有相关的配置放在一个文件中,这样仅需一个命令即可启动整套环境。

version: "3"

最新的版本已经弃用,version 指的是docker使用的版本,目前的最新版本是3.8,如果你对于docker的要求不高,建议你使用上面的版本描述,在没有小数点的情况下,这样的写法默认是version: "3.0"

services:

services 是 docker-compose 中必需的内容,是你的应用程序需要的服务,每个服务里可以配置使用的镜像、挂载、配置文件,docker-compose中存在多个服务,都可以单独配置。

  php:
    image: crunchgeek/php-fpm:7.0
    volumes:
      - ./yii_env.php:/var/www/yii_env.php
      - ./php.ini:/usr/local/etc/php/php.ini
      - ./:/var/www/html
    networks:
      - web

这里我们可以看到,这个名为php的服务使用的镜像是crunchgeek/php-fpm:7.0,挂载了三个目录,分别是配置文件、项目的配置文件、项目文件,启用的网络名称是web

networks:
  web:
    ipam:
      driver: default
      config:
        - subnet: "172.25.0.0/16"

networks 是配置的网络,我这里是名为web的网络配置,也是上面php服务使用的,这里指定了子网ip,如果不需要可以不指定。

2. LNMP环境的配置文件

下面是一套完整的本地LNMP配置文件,你需要把他放在本地项目的根目录,然后修改项目入口文件位置即可使用。

services:
  php:
    image: crunchgeek/php-fpm:7.0
    volumes:
      - ./:/var/www/html
    networks:
      - nmp
  mysql:
    image: mysql:5.7
    ports:
      - "3309:3306"
    volumes:
      - ./mysql/data:/var/lib/mysql/:rw
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: "123456"
      TZ: "Asia/Shanghai"
    networks:
      - nmp
  web:
    image: nginx
    ports:
      - "8010:8010"
    volumes:
      - ./:/var/www/html
      - ./default:/etc/nginx/conf.d/default.conf
    networks:
      - nmp
    depends_on:
      - mysql
networks:
  nmp:

同级目录下的nginx配置文件default,你也可以把他放在单独的文件夹内。

server {
    listen          8010;
    index           index.php index.html;
    server_name     _;
    root            /var/www/html;

    location /status {
            fastcgi_pass  php:9000;
            fastcgi_param  SCRIPT_FILENAME  $fastcgi_script_name;
            include fastcgi_params;
    }

    location / {
            try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}

Nginx对外暴露端口为8010,浏览器可以访问。

image-20220824110311802

MySQL我们配置的对外暴露端口为3009,为的是和本地不冲突,也是可以访问成功的。

image-20220824110711711

MySQL的挂载目录为项目目录下的MySQL文件夹,但是实际项目中不推荐这样做,因为不同的开发人员的本地测试数据会不一样,不需要同步。

image-20220824111039093

四、虚拟机

虚拟机这种方式不建议你作为本地开发环境使用,占用系统资源比较多,项目代码的更新也多麻烦一些。

但是,虚拟机作为给实际项目的部署工作练手,是很好的方式。

目前常用的虚拟机有一下几种

  • Virtualbox 。Oracle 出品的虚拟机,免费。推荐。 https://www.virtualbox.org/wiki/Downloads

  • Vmware 。 也是老牌的虚拟机,需要付费。 https://customerconnect.vmware.com/en/downloads

  • Parallels Desktop。MacOS专用的虚拟机,兼容性最好,也是需要付费的。 https://www.parallels.cn/products/desktop/trial/

五、总结

目前PHP网站的主流使用Nginx作为web服务,本地开发环境优先使用docker环境。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐