PHP vs Java 选型
场景对比;本站栈选 Java/Spring Boot 的原因。
25 分钟
PHP vs Java 选型
这一课你将能做到
- 从进程模型、生命周期、状态管理三个底层维度说清两门语言的本质差异
- 对照 Spring Boot 的 IoC/事务/连接池,说出 PHP 侧的对应物与缺失项
- 面对真实场景(内容站、高并发交易、快速验证)给出有依据的选型结论
为什么要学
本站的核心栈是 Spring Boot,但你迟早会遇到 PHP:接手历史项目、评审跨语言方案、被问「为什么不用 PHP 写」(或反过来)。要回答得专业,靠的不是「Java 更重、PHP 更快上线」的印象分,而是把两门语言放回各自的运行模型里比较——PHP 的 shared-nothing 与 JVM 的常驻内存,是所有表层差异(性能、DI、连接池、热部署)的总根源。
人话:这一课是整条 PHP 路线的「收官复盘」——用你已经懂的 Spring Boot 作参照系,把 PHP 的设计取舍逐一讲透。
先建立图像
两门语言的请求处理模型对比:
PHP(FPM 多进程,请求隔离)
请求 ─► fpm worker 执行完整生命周期 ─► 销毁一切 ─► 下一个请求
内存:每请求从零构建框架对象图
状态:进程内不可存活,必须外置
Java(JVM 常驻,线程复用)
启动 ─► 构建容器/Bean/连接池/线程池 ─► 万千请求复用 ─► 常驻到重启
内存:对象图启动一次终身复用
状态:单例 Bean 字段跨请求存活(要小心并发)
一句话:PHP 把「冷启动」摊到每个请求,Java 把「热身」集中在启动时刻。后续所有差异都是这句话的推论。
跟着做
步骤 1:同一个接口,两种写法
需求:GET /api/users/{id} 返回用户 JSON。
PHP 原生版(前几课的知识拼图):
<?php
// public/index.php + nginx/fpm 托管
declare(strict_types=1);
header('Content-Type: application/json; charset=utf-8');
$id = (int) ($_GET['id'] ?? 0); // 路由解析(简化)
$pdo = new PDO('mysql:host=db;dbname=demo;charset=utf8mb4', 'root', 'secret',
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);
$stmt = $pdo->prepare('SELECT id, name FROM users WHERE id = ?');
$stmt->execute([$id]);
$user = $stmt->fetch(PDO::FETCH_ASSOC);
http_response_code($user === false ? 404 : 200);
echo json_encode($user ?? ['message' => 'not found'], JSON_UNESCAPED_UNICODE);
Spring Boot 版(你熟悉的世界):
@RestController
public class UserController {
private final UserRepository repo; // IoC 注入,单例复用
public UserController(UserRepository repo) { this.repo = repo; }
@GetMapping("/api/users/{id}")
public ResponseEntity<User> get(@PathVariable Long id) {
return repo.findById(id)
.map(ResponseEntity::ok)
.orElse(ResponseEntity.notFound().build());
}
}
差异速读:PHP 每请求新建 PDO 连接、解析整个入口文件;Spring 的 DataSource 连接池启动时建好,Controller 单例常驻。PHP 版如果像 Java 一样把 PDO 存全局变量想复用——第二行就失效了,请求结束它就没了。
步骤 2:逐项对齐「Java 有、PHP 怎么办」
| 你在 Spring 依赖的 | PHP 的对应物 | 关键差异 |
|---|