1.1 进站须知:认识 PHP 与运行环境


文档摘要

1.1 进站须知:认识 PHP 与运行环境 本节摘要:PHP 是一门服务端脚本语言,专职接待 HTTP 请求并生成响应。本节从"一个请求抵达时服务器内部发生了什么"讲起,给出本地环境的两种搭建方式与验证手段,并用一张生命周期标注图把"进站到出站"的全过程拆开——这张图是全册的路线底图,后续每一节都会回到它的某个环节上。 学习目标 阅读完本节,你应当能够: 解释 PHP 解释执行模型与"页面即脚本"的历史渊源,说清它和编译型语言在部署形态上的差别; 独立搭建一套 PHP 8 命令行环境,并用内置服务器跑起第一个页面; 说出请求生命周期里 Web 服务器、PHP 进程、脚本代码三者的分工; 用命令行确认版本与已加载扩展,为后续章节的数据库、会话功能铺路。

1.1 进站须知:认识 PHP 与运行环境

本节摘要:PHP 是一门服务端脚本语言,专职接待 HTTP 请求并生成响应。本节从"一个请求抵达时服务器内部发生了什么"讲起,给出本地环境的两种搭建方式与验证手段,并用一张生命周期标注图把"进站到出站"的全过程拆开——这张图是全册的路线底图,后续每一节都会回到它的某个环节上。

学习目标

阅读完本节,你应当能够:

  1. 解释 PHP 解释执行模型与"页面即脚本"的历史渊源,说清它和编译型语言在部署形态上的差别;
  2. 独立搭建一套 PHP 8 命令行环境,并用内置服务器跑起第一个页面;
  3. 说出请求生命周期里 Web 服务器、PHP 进程、脚本代码三者的分工;
  4. 用命令行确认版本与已加载扩展,为后续章节的数据库、会话功能铺路。

一、请求进站时到底发生了什么

先把镜头对准月台入口。你在浏览器里敲下一个网址回车,数据包顺着网络抵达服务器,第一个接手的是 Web 服务器(Nginx 或 Apache)。它像一个进站大厅:核对你要去哪个"站台"(域名与端口),决定这件"行李"(请求)由谁来处理。如果请求的是一张静态图片,大厅直接从货架上取货交给你;如果请求的是 PHP 页面,大厅会把请求转交给 PHP 进程——这就是所谓动态请求。

PHP 进程拿到请求后做三件事:读取你写的脚本文件,把它从头到尾解释执行一遍,把执行过程中 echo 出来的内容当作响应体吐回去。Web 服务器接住这些内容,加上状态码和响应头,原路送回浏览器。整个过程通常以毫秒计,旅客几乎无感。理解这套流程的关键在于:PHP 代码不常驻内存,每个请求都要重新走一遍"读取—执行—输出",这也是后面第 2.5 节谈性能优化时反复回扣的前提。

图:请求生命周期标注——从进站到出站的完整接力

图:请求生命周期标注——从进站到出站的完整接力

这里补一个容易混淆的点:所谓"PHP 网站慢",多数情况不是语言本身慢,而是某个作业环节堵了——数据库查询没走索引、循环里重复读文件、每个请求都重新编译大段配置。把生命周期图记牢,排查时才能按图索骥,先定位"堵在哪个站台",再决定动哪里。

二、把环境搭起来:两条路线

第一条路线是集成环境包,适合刚进站的新旅客。Windows 上常见的选择有 phpStudy、XAMPP 这类套装,装好后自带 PHP、MySQL 与管理界面,点几下就能起服务。它的好处是省心,坏处是各组件版本被套装锁定,遇到"套装里的 PHP 是旧版"这种问题时,升级要自己动手。

第二条路线是官方运行时分组件安装,推荐在认真学下去之后切换过来。以 Windows 为例:到 PHP 官网下载对应系统的线程安全或非线程安全压缩包,解压到某个目录,把该目录加入系统 PATH;Linux 发行版通常直接用包管理器安装。装完后打开终端验证:

php -v # PHP 8.3.6 (cli) (built: ... ) —— 能看到版本号即安装成功 php -m # 列出已加载扩展,确认里面有 pdo_mysql、json、mbstring、openssl

pdo_mysql 是第 2.2 节数据库操作的前提,mbstring 是 1.5 节处理中文字符串的前提,这两个扩展缺了就要补装。验证扩展比记住安装步骤重要——环境问题八成出在"以为装了其实没装"。

接着不依赖任何 Web 服务器,先让脚本跑起来。新建一个文本文件命名为 hello.php,内容如下:

<?php // 第一份脚本:三个最常用的输出与内省手段 echo "月台已就绪", PHP_EOL; // echo 可接多个参数 $name = 'PHP 服务端'; printf("当前运行环境:%s,PHP 版本:%s\n", $name, PHP_VERSION); phpinfo(); // 在 CLI 下会输出大段文本;放到网页环境里则是完整信息页

在终端执行 php hello.php,能看到版本信息输出。这个文件不需要放在任何"站点目录"里也能跑——因为命令行模式下没有 HTTP 请求,脚本顺序执行完就退出。这一点值得体会:PHP 脚本有两种触发方式,命令行直接执行,以及"被 HTTP 请求唤起"。全册教程关注后者,但调试时前者往往更快。

再看不带 Nginx 的轻量路线——PHP 内置服务器,适合本地开发:

# 在站点根目录下执行,把 8080 换成任意空闲端口 php -S localhost:8080 -t ./public # 终端会提示: # [Sun ... ] PHP 8.3.6 Development Server (http://localhost:8080) started

此时浏览器访问该地址,每个请求都会唤起 PHP 执行对应脚本——完整的进站出站流程在本机就闭合了。内置服务器是单进程的,官方明确不建议用于生产,但学习阶段它是启动成本最低的选择。

三、SAPI 与脚本边界:两个高频疑问

PHP 通过不同入口对接不同宿主环境,这些入口统称 SAPI。下表对比学习期最常见的入口:

入口 触发方式 典型用途 生命周期
CLI 命令行手动执行 定时任务、脚本工具 执行完退出
内置服务器 本地 HTTP 请求 学习与开发调试 单进程逐请求处理
PHP-FPM 配 Nginx 线上 HTTP 请求 生产部署 进程池常驻复用

围绕这张表回答两个常被问到的问题。其一,<?php 标签必须吗?在纯 PHP 文件里约定只写开标签不写闭标签,文件里混有 HTML 时才需要闭标签把动态部分圈出来;漏写闭标签反而能避免结尾意外输出空白,破坏响应头。其二,脚本执行到哪算结束?正常执行到文件末尾,或者遇到 exitdie 提前收班;若过程中抛出未捕获的异常,月台会广播一条错误并中断本次服务——这正是 1.9 节的主题。

常见问题

内置服务器与 Nginx 加 FPM 的行为差异会不会误导学习?

绝大多数语言层行为完全一致,差异集中在静态资源处理、并发能力与进程模型上——这些恰好是本册基本不涉及、留到部署阶段的内容。学习期放心用内置服务器,只需记住两条:单进程意味着"自己请求自己时会被阻塞",以及它不该出现在任何对外环境。等学到 2.5 节性能话题时,再回头补进程模型这一课也不迟。

需要立刻装 Composer 吗?

第一章用不到,第二章 2.7 节会手把手带你装好并用起来。提前装好也无妨——它只是个包管理器,不影响语言本身的任何行为。唯一提醒:别用网上来路不明的"一键安装脚本",从官方渠道获取安装器是最基本的供应链安全习惯,这个原则到 2.6 节会反复出现。

常见坑

⚠️ 版本装了旧版却不自知:php -v 显示的版本才作数,安装包宣传语不作数。第 4.1 节的大量新语法在旧版本上会直接报错,动手前先核版本。

⚠️ 改了配置不生效:命令行与网页环境可能读不同的配置文件,用 php --ini 查命令行加载的是哪份,网页环境则看 phpinfo() 输出的 Loaded Configuration File 一行。

本节要点回顾

  • 解释执行:PHP 每次请求都重新读取并执行脚本,理解这一点是后续性能与缓存话题的地基。
  • 三类入口:CLI、内置服务器、FPM 对接三种场景,学习期用前两者,生产用第三者。
  • 扩展即能力pdo_mysqlmbstring 决定了数据库与中文字符串功能是否可用,先验扩展再写代码。
  • 两条验证命令php -v 看版本,php -m 看扩展,环境排错从它们开始。
  • 生命周期图:进站大厅、月台作业区、寄存库的分工图要留在脑子里,全册每节都能在这张图上找到锚点。

下一节进入语言本体:语法基础。我们会把变量、类型与控制结构放进"处理一份表单数据"的真实作业里讲,而不是背语法表。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U