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

391 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 是**脚本语言**,不是编译型语言:
```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 模块(占内存)
**你的项目已有配置:**
```apache
# 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简单方式
```bash
# 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
```
```apache
<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>
```
```bash
# 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推荐
```bash
# 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
```
```nginx
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;
}
}
```
```bash
# 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 请求:
```bash
# 命令行运行(仅用于测试)
php index.php
# PHP 内置服务器(仅用于开发)
php -S localhost:8080 -t public/
```
内置服务器**不适合生产环境**,因为:
- 单线程,性能差
- 功能简陋,不支持 .htaccess
- 不稳定,容易崩溃
### Q2: 能不能让 PHP 像 Java 一样独立运行?
**A:** 可以使用 Swoole/Workerman 等框架:
```php
// 使用 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
---
## 七、快速部署检查清单
```bash
# ✓ 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 的标准部署方式!