11 KiB
11 KiB
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";
?>
这个文件不能直接运行,需要:
- Web 服务器监听 80 端口,接收 HTTP 请求
- PHP 解释器读取 .php 文件,执行代码
- 返回结果给 Web 服务器
- 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 的标准部署方式!