# 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 - 这只是文本文件 ``` 这个文件**不能直接运行**,需要: 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 Options +FollowSymlinks -Multiviews RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L] ``` --- ### 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 ServerName your-domain.com DocumentRoot /var/www/back/public Options Indexes FollowSymLinks AllowOverride All Require all granted ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined ``` ```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 的标准部署方式!