PHP运行模式的深入理解

yizhihongxing

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,所以称为 动态方式运行。

静态方式运行的优缺点

优点

  1. 性能十分优秀,在高负载情况下表现更加突出,因为它可以复用 Apache 已存在的进程或线程,无需每次都初始化 PHP 环境。
  2. 对于某些不稳定的 PHP 扩展,使用 Apache 模块可以避免 php 代码的 segfault。
  3. 能够和 Apache 很好地整合

缺点

  1. PHP 代码直接运行在 Apache 中,一旦出现错误导致 Apache 进程或线程崩溃,就会导致站点奔溃,风险较高。
  2. 在 PHP 代码更新时需要重启 Apache 才能生效。

动态方式运行的优缺点

优点

  1. 安全性高,因为要启动一个进程或线程来执行 PHP,所以 PHP 代码无法访问 Web 服务器的其他服务。
  2. 当 PHP 代码更新时,无需重新启动 Web 服务器,直接重启 PHP 进程即可生效,更加方便。

缺点

  1. 动静态请求都要启动PHP进程,开销巨大,难以承受高负载。
  2. 进程与进程之间的环境是独立的,不能共享。

示例

静态方式运行示例

下载个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技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • php 截取字符串并以零补齐str_pad() 函数

    PHP中的str_pad()函数可以截取给定字符串的一部分,并在所截取的字符串前面添加零或其他字符,以将其的长度补齐。 该函数的语法格式如下: str_pad($str, $pad_len, $pad_str = "0", $pad_type = STR_PAD_RIGHT) 其中,$str为需要被处理的字符串,$pad_len为补齐后的…

    PHP 2023年5月26日
    00
  • 非常全面的php日期时间运算汇总

    PHP日期时间运算汇总 本文将详细介绍PHP中日期时间相关的运算操作。包括日期格式化、日期计算、日期比较、日期解析等常见操作。读者在学习本文后,将具备掌握PHP中日期时间相关的运算操作的能力。 一、日期格式化 日期格式化是指将日期按照一定的格式展示的过程。在PHP中日期格式化可以使用date()函数来实现,date()函数的参数传入所需要的格式字符串即可。 …

    PHP 2023年5月24日
    00
  • php实现简单洗牌算法

    可以通过下面的步骤来实现简单的洗牌算法。 基本思路 生成一个数组,包含待打乱的元素。 循环每个元素,随机交换它和数组中的另一个元素。 循环结束后,数组元素的顺序已被打乱。 代码实现 function shuffle_array($arr) { $len = count($arr); for ($i = 0; $i < $len; $i++) { $ra…

    PHP 2023年5月23日
    00
  • thinkphp实现like模糊查询实例

    下面是“thinkphp实现like模糊查询实例”的完整攻略。 1. 创建模型 在ThinkPHP中,我们需要使用模型来完成对表的操作。在本实例中,我们需要创建一个专门用来处理like模糊查询的模型。 <?php namespace app\index\model; use think\Model; class Article extends Mode…

    PHP 2023年5月26日
    00
  • 详解PHP处理字符串类似indexof的方法函数

    当我们在使用PHP进行开发的时候,经常会涉及到对字符串的处理,比如查找某个字符在字符串中的位置,PHP提供了一系列函数来处理此类任务,下面我们来详细讲解PHP处理字符串类似indexof的方法函数的完整攻略。 介绍 在PHP中,我们可以使用以下函数来查找字符串中某个字符或字符串的位置: strpos():查找字符串中某个字符或字符串第一次出现的位置。 str…

    PHP 2023年5月26日
    00
  • PHP那些琐碎的知识点(整理)

    PHP那些琐碎的知识点(整理) 1. isset()、empty()和is_null()的区别 a. isset() isset()用来判断一个变量是否被定义和非NULL。如果变量存在,返回true,否则返回false。 例如: $name = ‘John Doe’; if (isset($name)) { echo ‘The variable $name …

    PHP 2023年5月26日
    00
  • PHP匹配连续的数字或字母的正则表达式

    要匹配连续的数字或字母,可以使用正则表达式中的元字符(metacharacter)来进行匹配。常用的元字符有.、*、+、?、|等,而用来匹配数字或字母的元字符有\d和\w。 使用\d+匹配连续的数字 \d用来匹配数字,\d+则表示匹配一个或多个数字(即连续的数字)。下面是一个例子,展示了如何使用\d+来匹配字符串中的连续数字: <?php $str =…

    PHP 2023年5月26日
    00
  • PHP substr()函数参数解释及用法讲解

    PHP substr()函数参数解释及用法讲解 substr()函数介绍 substr()函数是PHP中用于截取字符串的函数。该函数的作用是截取一个字符串中的一部分,并返回截取后的结果。substr()函数的语法如下: substr(string $string, int $start, int $length = ?): string substr()函数…

    PHP 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部