尽量避免提供太多信息,但这里是在 Linux 上与 Apache 一起使用时 PHP 的完整周期。
先决条件
一种常见的服务器设置称为 LAMP 堆栈,它代表 Linux、Apache、Mysql 和 PHP。通常,您可以找到数十种准备使用的 LAMP 堆栈设置以及使用它们的指南,因此在您的问题上下文中,您只需要关注 Apache 和 PHP。
第 1 阶段 - 授权
当网络浏览器通过 PHP 联系运行 Apache 的网络服务器时,Apache 的第一步是找到所需的内容。假设您访问 www.mywebsite.com/hello.php,Apache 会看到您正在寻找一个名为 hello.php 的文件。此时,由于后缀 (.php) ,Apache 知道该文件需要由 PHP 解释,因此它将处理委托给 PHP 解释器。
第 2 阶段 - 设置
从 Apache 到 PHP 的移交包括一系列标头,这些标头告诉 PHP 以下内容:正在处理的事务类型 (GET/POST/PUT/DELETE)、传入请求的 IP 地址、浏览器的用户代理(Firefox、MSIE、IPhone 等),如果有 cookie。更重要的是,Apache 将服务器上 hello.php 文件的路径交给 PHP。
第 3 阶段 - 处理
根据配置,PHP 可能需要做一些基本的内务管理(自行设置),但在理想条件下,它可以随时打开并打开 hello.php PHP 的一部分是一个名为 lexer 的模块,它查看 hello.php 和弄清楚如何处理文件。通过提供的示例,一个非常简单的示例可能如下所示:
- T_STRING = "\n\t\n\t"
- T_OPEN_TAG;
- T_ECHO;
- T_STRING = "来自 PHP 的 HTML 标题";
- ;
- T_CLOSE_TAG;
- T_STRING = "\t\n\t\n\t
你好世界!
\n\t\n"李>
请注意,大部分 T_ 代码都是我编造的,但它们与真实代码非常接近。
第 1 行 - PHP 知道它超出了所谓的范围,因此它立即将整个字符串传递给 Apache,即网络服务器。然后 Apache 很可能会将整个字符串传递到 Web 浏览器。
第 2 行 - T_OPEN_TAG 告诉 PHP 它正在进入 PHP 范围并等待它的第一条指令。
第 3 行 - T_ECHO 告诉 PHP 它将发出一个 echo 语句,因此它的规则然后开始寻找要输出的表达式或字符串。
第 4 行 - 幸运的是,下一个标记是一个字符串,所以 PHP 现在知道它会回显“来自 PHP 的 HTML 标题”
第 5 行 - ;告诉 PHP echo 语句是完整的,更重要的是这在语法上是正确的......所以 PHP 将字符串“HTML Title from PHP”交给 Apache,Apache 将其传递给浏览器。
第 6 行 - 关闭 ?> 标记告诉 PHP 它正在离开 PHP 语言范围,因此它回到了一组更简单的规则
第 7 行 - 与第 1 行一样,整个字符串被传递给 Apache 以传递给 Web 浏览器
此时,PHP 到达所谓的 EOF 或文件结尾,并且知道它已完成对文件 hello.php 的处理。它会进行清理工作,然后告诉 Apache 已完成。
完成
此时请求已基本完成,Apache 很可能会挂断网络浏览器,发送所有内容已完成的通知。
如果您有任何问题或需要任何关于下一步的指示,请告诉我。另请注意,为简洁起见,此处省略了很多细节,但只是为了了解 PHP 与 Web 浏览器和 Web 服务器的关系如何鸟瞰,这应该足以开始。
演示脚本
$test = 'Hello world <' . '?' . 'php echo \'this is in scope\'; ?' . '> and we\'re done';
$tokens = token_get_all($test);
print_r($tokens);
输出将是 PHP 生成的真实世界令牌字符串。每个令牌可以是字符串或三元素元组/数字数组,其中索引 0 == 令牌 ID,索引 1 == 原始字符串,我一生都记不住第三个元素是什么。如果您想知道每个令牌的名称是什么,请使用 token_name。