Files
oms-back/PHP项目部署说明.md
2026-03-09 22:59:24 +08:00

11 KiB
Raw Permalink Blame History

PHP 项目部署说明文档

一、PHP 与 Java 部署方式的本质区别

1.1 Java 项目(如 Spring Boot

Java 应用 = 自带 Web 服务器
┌─────────────────────────┐
│   your-app.jar          │
│  ┌───────────────────┐  │
│  │  业务代码          │  │
│  ├───────────────────┤  │
│  │  内置 Tomcat      │  │  ← 自带 Web 服务器
│  │  (监听 8080 端口) │  │
│  └───────────────────┘  │
└─────────────────────────┘

运行方式:
$ java -jar your-app.jar
# 应用自己监听端口,直接处理 HTTP 请求

特点:

  • JAR 包内置了 Web 服务器Tomcat/Jetty/Undertow
  • 独立运行,不需要外部 Web 服务器
  • 直接监听端口(如 8080
  • 一个命令启动:java -jar app.jar

1.2 PHP 项目(如 ThinkPHP

PHP 应用 = 需要外部 Web 服务器
┌──────────────────────────────────┐
│  Web 服务器 (Nginx/Apache)        │
│  ┌────────────────────────────┐  │
│  │  监听 80/443 端口           │  │
│  │  处理 HTTP 请求             │  │
│  │  ↓                          │  │
│  │  转发给 PHP 解释器          │  │
│  └────────────────────────────┘  │
└──────────────────────────────────┘
           ↓
┌──────────────────────────────────┐
│  PHP-FPM (PHP 解释器)             │
│  ┌────────────────────────────┐  │
│  │  执行 PHP 代码              │  │
│  │  返回结果                   │  │
│  └────────────────────────────┘  │
└──────────────────────────────────┘
           ↓
┌──────────────────────────────────┐
│  你的 PHP 代码 (ThinkPHP)         │
│  - index.php                     │
│  - 业务逻辑                       │
└──────────────────────────────────┘

特点:

  • PHP 代码本身不能直接运行
  • 需要 Web 服务器Nginx/Apache接收 HTTP 请求
  • 需要 PHP 解释器PHP-FPM执行代码
  • 三层架构Web 服务器 → PHP 解释器 → 你的代码

二、为什么 PHP 需要 Nginx/Apache

2.1 PHP 的运行机制

PHP 是脚本语言,不是编译型语言:

// index.php - 这只是文本文件
<?php
echo "Hello World";
?>

这个文件不能直接运行,需要:

  1. Web 服务器监听 80 端口,接收 HTTP 请求
  2. PHP 解释器读取 .php 文件,执行代码
  3. 返回结果给 Web 服务器
  4. Web 服务器返回给客户端

2.2 完整请求流程

用户浏览器
    ↓ HTTP 请求
    ↓ http://your-domain.com/api/user/login
    ↓
┌─────────────────────────────────────┐
│  Nginx (监听 80 端口)                │
│  - 接收 HTTP 请求                    │
│  - 处理静态文件 (CSS/JS/图片)        │
│  - 转发 PHP 请求给 PHP-FPM           │
└─────────────────────────────────────┘
    ↓ FastCGI 协议
    ↓
┌─────────────────────────────────────┐
│  PHP-FPM (监听 9000 端口)            │
│  - 接收 Nginx 转发的请求             │
│  - 执行 PHP 代码                     │
│  - 连接数据库                        │
│  - 返回执行结果                      │
└─────────────────────────────────────┘
    ↓ 执行
    ↓
┌─────────────────────────────────────┐
│  你的 ThinkPHP 项目                  │
│  /back/public/index.php              │
│  /back/application/api/controller/   │
└─────────────────────────────────────┘

三、两种部署方案对比

3.1 方案一Apache + mod_php

Apache 服务器
├── 内置 PHP 模块 (mod_php)
├── 直接执行 PHP 代码
└── 配置简单,但性能较低

优点:

  • 配置简单,.htaccess 自动生效
  • 适合小型项目、虚拟主机

缺点:

  • 性能较低
  • 每个 Apache 进程都加载 PHP 模块(占内存)

你的项目已有配置:

# back/public/.htaccess
<IfModule mod_rewrite.c>
  Options +FollowSymlinks -Multiviews
  RewriteEngine On
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
</IfModule>

3.2 方案二Nginx + PHP-FPM推荐

Nginx (Web 服务器)
    ↓ FastCGI
PHP-FPM (PHP 进程管理器)
    ↓
你的 PHP 代码

优点:

  • 高性能,适合生产环境
  • Nginx 处理静态文件速度快
  • PHP-FPM 独立管理 PHP 进程

缺点:

  • 配置稍复杂
  • 需要单独安装 PHP-FPM

四、实际部署步骤

4.1 使用 Apache简单方式

# 1. 安装 Apache 和 PHP
sudo apt install apache2 php libapache2-mod-php php-mysql

# 2. 启用 mod_rewrite
sudo a2enmod rewrite

# 3. 配置虚拟主机
sudo nano /etc/apache2/sites-available/your-site.conf
<VirtualHost *:80>
    ServerName your-domain.com
    DocumentRoot /var/www/back/public
    
    <Directory /var/www/back/public>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
    
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
# 4. 启用站点并重启
sudo a2ensite your-site.conf
sudo systemctl restart apache2

# 5. 设置权限
sudo chown -R www-data:www-data /var/www/back
sudo chmod -R 755 /var/www/back
sudo chmod -R 777 /var/www/back/runtime

4.2 使用 Nginx + PHP-FPM推荐

# 1. 安装 Nginx 和 PHP-FPM
sudo apt install nginx php-fpm php-mysql php-mbstring php-curl

# 2. 配置 Nginx
sudo nano /etc/nginx/sites-available/your-site
server {
    listen 80;
    server_name your-domain.com;
    root /var/www/back/public;
    index index.php index.html;

    # 访问日志
    access_log /var/log/nginx/your-site-access.log;
    error_log /var/log/nginx/your-site-error.log;

    # ThinkPHP 路由重写
    location / {
        if (!-e $request_filename) {
            rewrite ^(.*)$ /index.php?s=$1 last;
            break;
        }
    }

    # PHP 处理
    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;  # 根据 PHP 版本调整
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    # 静态文件缓存
    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$ {
        expires 30d;
    }

    # 禁止访问隐藏文件
    location ~ /\. {
        deny all;
    }
}
# 3. 启用站点
sudo ln -s /etc/nginx/sites-available/your-site /etc/nginx/sites-enabled/
sudo nginx -t  # 测试配置
sudo systemctl restart nginx
sudo systemctl restart php7.4-fpm

# 4. 设置权限
sudo chown -R www-data:www-data /var/www/back
sudo chmod -R 755 /var/www/back
sudo chmod -R 777 /var/www/back/runtime

五、与 Java 部署的对比总结

特性 Java (Spring Boot) PHP (ThinkPHP)
运行方式 java -jar app.jar 需要 Web 服务器 + PHP 解释器
Web 服务器 内置Tomcat 外部Nginx/Apache
进程模型 单个 JVM 进程 多个 PHP-FPM 进程
端口监听 应用自己监听 Web 服务器监听
部署复杂度 简单(一个 JAR 中等(需配置 Web 服务器)
性能 JIT 编译) 中(解释执行)
内存占用 较高JVM 较低
适用场景 微服务、高并发 Web 应用、CMS

六、常见问题

Q1: 为什么不能像 Java 一样 php index.php 直接运行?

A: 可以,但只能在命令行运行,不能处理 HTTP 请求:

# 命令行运行(仅用于测试)
php index.php

# PHP 内置服务器(仅用于开发)
php -S localhost:8080 -t public/

内置服务器不适合生产环境,因为:

  • 单线程,性能差
  • 功能简陋,不支持 .htaccess
  • 不稳定,容易崩溃

Q2: 能不能让 PHP 像 Java 一样独立运行?

A: 可以使用 Swoole/Workerman 等框架:

// 使用 Workerman类似 Node.js
require_once __DIR__ . '/vendor/autoload.php';
use Workerman\Worker;

$http_worker = new Worker("http://0.0.0.0:8080");
$http_worker->onMessage = function($connection, $request) {
    $connection->send("Hello World");
};

Worker::runAll();

但你的 ThinkPHP 项目是传统架构,需要 Web 服务器。

Q3: 我应该选择 Apache 还是 Nginx

建议:

  • 开发/测试环境Apache配置简单
  • 生产环境Nginx + PHP-FPM性能更好
  • 虚拟主机:通常只能用 Apache

七、快速部署检查清单

# ✓ 1. 环境检查
php -v                    # PHP >= 5.4
nginx -v                  # 或 apache2 -v
mysql --version           # 数据库

# ✓ 2. 安装依赖
cd /var/www/back
composer install

# ✓ 3. 配置数据库
# 修改 application/database.php

# ✓ 4. 导入数据库
mysql -u root -p < kingcharm.sql

# ✓ 5. 设置权限
chmod -R 777 runtime/

# ✓ 6. 配置 Web 服务器
# 见上文 Nginx/Apache 配置

# ✓ 7. 重启服务
sudo systemctl restart nginx
sudo systemctl restart php-fpm

# ✓ 8. 测试访问
curl http://localhost

八、总结

核心区别:

  • Java:应用 = Web 服务器 + 业务代码(一体化)
  • PHP:应用 = Web 服务器 + PHP 解释器 + 业务代码(分离式)

为什么这样设计?

  • PHP 诞生于 Web 时代,设计为与 Web 服务器配合
  • Java 后来发展出内置服务器,简化部署
  • 各有优劣,适用不同场景

你的 ThinkPHP 项目需要 Nginx/Apache 是正常的,这是 PHP 的标准部署方式!