1. PHP CLI (Command Line Interface)
CLI是PHP的命令行模式,就像你在玩玩具时可以直接发出指令一样。
<?php
// test.php
// 这是一个简单的PHP脚本,可以在命令行中运行
$name = "小明"; // 定义一个变量,存储名字
echo "你好, ". $name ."!\n"; // 输出问候语,\n表示换行
// 可以计算数学题
$result = 5 + 3; // 计算5加3的结果
echo "5 + 3 = ". $result ."\n"; // 输出计算结果
// 还可以读取命令行参数
$args = $argv; // $argv是PHP内置的数组,存储了命令行参数
if (isset($args[1])) { // 检查是否有第一个参数
echo "你输入的参数是: ". $args[1] ."\n"; // 输出第一个参数
}
?>
在命令行中运行这个脚本:
php test.php 今天天气不错
# 输出:
# 你好, 小明!
# 5 + 3 = 8
# 你输入的参数是: 今天天气不错
底层原理:
- 当你在命令行中输入
php test.php
时,系统会启动PHP解释器 - PHP解释器读取test.php文件,逐行执行其中的代码
- 执行完毕后,PHP解释器会自动退出
使用场景:
- 编写自动化脚本,比如定时备份文件
- 执行一次性的任务,比如导入数据到数据库
- 调试PHP代码,快速验证某个功能
2. PHP-FPM (FastCGI Process Manager)
FPM是PHP的一种运行模式,专门用于处理Web请求,就像一个餐厅的服务员,负责接收客人的订单并交给厨师处理。
<?php
// index.php - 这是一个Web页面的PHP代码
// 当用户访问网站时,Web服务器会调用PHP-FPM来执行这段代码
// 连接数据库
$servername = "localhost"; // 数据库服务器地址
$username = "root"; // 数据库用户名
$password = "password"; // 数据库密码
$dbname = "mydatabase"; // 数据库名
// 创建数据库连接
$conn = new mysqli($servername, $username, $password, $dbname);
// 检查连接是否成功
if ($conn->connect_error) {
die("数据库连接失败: ". $conn->connect_error); // 如果失败,输出错误信息并终止脚本
}
// 查询数据
$sql = "SELECT id, name, email FROM users"; // SQL查询语句
$result = $conn->query($sql); // 执行查询
// 输出HTML页面
echo "<html>";
echo "<head><title>用户列表</title></head>";
echo "<body>";
echo "<h1>用户列表</h1>";
echo "<table border='1'>";
echo "<tr><th>ID</th><th>姓名</th><th>邮箱</th></tr>";
// 输出查询结果
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
echo "<tr>";
echo "<td>". $row["id"]. "</td>";
echo "<td>". $row["name"]. "</td>";
echo "<td>". $row["email"]. "</td>";
echo "</tr>";
}
} else {
echo "<tr><td colspan='3'>没有数据</td></tr>";
}
echo "</table>";
echo "</body>";
echo "</html>";
$conn->close(); // 关闭数据库连接
?>
底层原理:
- 当用户在浏览器中输入网址访问网站时,请求会先到达Web服务器(如Nginx或Apache)
- Web服务器根据配置,将PHP文件的请求转发给PHP-FPM
- PHP-FPM维护着一组PHP进程(就像餐厅里的厨师团队),随时准备处理请求
- 当收到请求时,PHP-FPM会分配一个空闲的PHP进程来执行对应的PHP文件
- PHP进程执行PHP代码,可能会连接数据库、读取文件等
- 执行完毕后,PHP进程将结果返回给Web服务器
- Web服务器再将结果返回给用户的浏览器
- PHP进程不会立即退出,而是继续等待下一个请求(这就是"FastCGI"的"Fast"所在)
使用场景:
- 所有类型的Web应用,尤其是高并发的网站,如电商平台、社交网络
- 需要快速响应的API服务
- 任何需要与Web服务器集成的PHP应用
3. CLI vs FPM 的核心区别
特性 | CLI模式 | FPM模式 |
---|---|---|
运行环境 | 命令行,直接由用户启动 | 作为服务后台运行,由Web服务器调用 |
生命周期 | 执行完脚本就结束 | 长期运行,等待处理多个请求 |
输入来源 | 命令行参数($argv) | HTTP请求(GET/POST数据) |
输出方式 | 直接打印到终端 | 返回HTML、JSON等给Web服务器 |
配置文件 | php.ini | php.ini + php-fpm.conf |
适合场景 | 脚本、工具、定时任务 | Web应用、API服务 |
性能 | 启动开销大,适合单次执行 | 启动开销小,适合高并发 |
4. 为什么需要两种模式?
这就像一个人有两种状态:
- CLI模式就像你在自己房间里玩玩具,可以随意摆弄,不需要遵循太多规则
- FPM模式就像你在学校上课,需要遵循一定的流程,和老师、同学配合
PHP设计这两种模式是为了满足不同的使用场景:
- CLI模式让PHP可以像Python、Ruby一样,作为脚本语言使用
- FPM模式让PHP可以高效地处理Web请求,成为世界上最流行的Web开发语言之一
5. 如何配置PHP-FPM?
PHP-FPM的配置文件通常位于/etc/php-fpm.d/www.conf
,下面是一些关键配置项的解释:
; 进程池名称
[www]
; 监听地址和端口
listen = 127.0.0.1:9000
; 启动时创建的子进程数
pm.start_servers = 5
; 最小空闲进程数
pm.min_spare_servers = 2
; 最大空闲进程数
pm.max_spare_servers = 8
; 最大请求数,达到这个数后进程会重启,防止内存泄漏
pm.max_requests = 500
; 慢请求日志,记录执行时间超过指定时间的请求
slowlog = /var/log/php-fpm/www-slow.log
request_slowlog_timeout = 5s
这些配置项决定了PHP-FPM的性能和行为,就像给餐厅设置服务员的数量和工作规则一样。