PHP运行模式的深入理解
什么是PHP运行模式?
在讲解 PHP 运行模式前,需要先了解 PHP 的基础架构,PHP 可以以两种不同的方式运行:
- Apache模块运行方式(mod_php)
- CGI方式(php-cgi或FastCGI)
Apache模块运行方式是将 PHP 解释器做成一个 Apache 的扩展模块(apache module),加载到 Apache 在启动时读取,Apache 与 PHP 的通讯是通过直接调用 C 函数的方式实现的。这种方式下,每一次请求到来,都会开启一个新的线程或者进程,并在其中执行一个新的 PHP 程序,所以称为 静态方式运行。
CGI方式是通过在 Web 服务器(例如 Apache)与 PHP 解释器(php-cgi 或 FastCGI 进程)之间建立通信,使得 PHP 可以独立于 Web 服务器来运行。这种方式下,每一次请求到来均为新进程,并在其中执行 PHP,所以称为 动态方式运行。
静态方式运行的优缺点
优点
- 性能十分优秀,在高负载情况下表现更加突出,因为它可以复用 Apache 已存在的进程或线程,无需每次都初始化 PHP 环境。
- 对于某些不稳定的 PHP 扩展,使用 Apache 模块可以避免 php 代码的 segfault。
- 能够和 Apache 很好地整合
缺点
- PHP 代码直接运行在 Apache 中,一旦出现错误导致 Apache 进程或线程崩溃,就会导致站点奔溃,风险较高。
- 在 PHP 代码更新时需要重启 Apache 才能生效。
动态方式运行的优缺点
优点
- 安全性高,因为要启动一个进程或线程来执行 PHP,所以 PHP 代码无法访问 Web 服务器的其他服务。
- 当 PHP 代码更新时,无需重新启动 Web 服务器,直接重启 PHP 进程即可生效,更加方便。
缺点
- 动静态请求都要启动PHP进程,开销巨大,难以承受高负载。
- 进程与进程之间的环境是独立的,不能共享。
示例
静态方式运行示例
下载个demo文件并确认 phpinfo 信息
<?php
phpinfo();
?>
将它重命名为info.php并将其放置在 Apache 公共目录中,然后在浏览器中访问 http://localhost/info.php。 会出现 Apache 版本、操作系统、PHP 确定的服务器/客户机环境以及加载的模块信息。
动态方式运行示例
启动一个 TCP 服务器
<?php
// 创建服务器并返回一个套接字(socket)
$server_sock = stream_socket_server("tcp://127.0.0.1:9000", $errno, $errstr)
or die("create server fail!$errno-$errstr");
echo "Server run on tcp://127.0.0.1:9000 start\n";
while ($conn_sock = stream_socket_accept($server_sock, -1)) {// 建立连接
$pid = pcntl_fork();// 创建子进程
if ($pid == -1) {
die('fork fail');
} elseif ($pid) {
// 父进程关闭客户端连接
fclose($conn_sock);
} else {
// 子进程处理请求并返回结果
$data = fread($conn_sock, 1024);
fwrite($conn_sock, "Your input data length is ".strlen($data));
fclose($conn_sock);
exit;
}
}
上面启动的 TCP 服务器代码会一直监听端口 9000 并等待 TCP 客户端的请求,当有客户端请求到来时,会创建一个子进程来处理这个客户端的请求。当子进程处理完请求并发送响应数据后,会关闭套接字并退出。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PHP运行模式的深入理解 - Python技术站