PHP如何加载扩展(如MySql)?
一.PHP怎么和MySql跨部门协作?
php本身不具备操作MySQL数据库的能力,需要借助PHP操作MySqL的扩展来实现
1. PHP 和 MySQL 的关系
- PHP 本身:是一门脚本语言,它只能处理自身的逻辑(变量、函数、类、流程控制等)。
- MySQL 本身:是一个关系型数据库,用来存储和管理数据。
- 问题:PHP 想要读写 MySQL,就必须通过某种"桥梁"跟数据库通信。
2.扩展(Extension)的橘色
PHP没有内置数据库引擎,需要通过扩展来实现和数据库的交互
PHP所有扩展都在ext(extension)文件夹中(mac环境)
注意:
Windows 环境注意事项:
;
; - 许多 DLL 文件位于 ext/
; 扩展文件夹中,以及单独的 PECL DLL 下载中。
; 请确保正确设置 extension_dir 指令。
2.1 早期扩展
mysql
扩展(PHP 5.x 以前常用)- 已废弃,不再推荐使用。
2.2 现代扩展
- MySQLi(MySQL Improved Extension)
- 提供面向对象和过程化两种写法。
- 支持预处理语句(防止 SQL 注入)。
- PDO(PHP Data Objects)
- 是一个数据库抽象层,不仅支持 MySQL,还支持 SQLite、PostgreSQL、Oracle 等多种数据库。
- 更灵活,推荐新项目使用
3. PHP → MySQL 的通信过程(抽象层)
可以理解成一个"三层通信":
- PHP 代码层
- 你写的
<?php ... ?>
脚本。
- 你写的
- PHP 扩展层
mysqli
或pdo_mysql
扩展,把 PHP 语句翻译成数据库驱动可识别的指令。
- MySQL Server 层
- 负责执行 SQL(
SELECT
、INSERT
、UPDATE
等)并返回结果。
- 负责执行 SQL(
流程如下
nginx
PHP 脚本
↓
MySQL 扩展(mysqli / PDO)
↓
MySQL 客户端协议
↓
MySQL 服务器
↓
返回结果
4.php加载扩展这个扩展放在哪个文件里?
4.1. PHP 扩展的本质
- 扩展 = 一段 C 语言编写的动态库(.so / .dll 文件)
- 作用:让 PHP 拥有额外的功能,比如:
- 操作 MySQL (
pdo_mysql
,mysqli
) - 操作图片 (
gd
) - 缓存 (
opcache
)
- 操作 MySQL (
- 所以 PHP 本体只是一个"核心",扩展是"插件"。
4.2 扩展文件放在哪?
查看php配置
bash
php --ini
#返回值如下
Configuration File (php.ini) Path: /opt/homebrew/etc/php/8.4 #配置文件
Loaded Configuration File: /opt/homebrew/etc/php/8.4/php.ini #已经加载的配置文件 (主配置文件)
Scan for additional .ini files in: /opt/homebrew/etc/php/8.4/conf.d # 扫描其他.ini文件 (额外配置文件目录)
Additional .ini files parsed: /opt/homebrew/etc/php/8.4/conf.d/ext-opcache # 解析.ini文件
查看有没有自带MySql的扩展
bash
php -m | grep mysql
#返回值如下
mysqli #用来连接 MySQL,支持面向对象和过程式
mysqlnd #MySQL Native Driver,PHP 内置的驱动层,给 mysqli 和 pdo_mysql 提供底层支持
pdo_mysql #PDO 的 MySQL 驱动,可以用统一的 PDO API 操作数据库。
4.2.1. mysqlnd
- 全称 :MySQL Native Driver
- 作用 :这是 PHP 自带的 MySQL 原生驱动,负责底层和 MySQL 服务器通信。
- 为什么叫 mysqlnd :
mysql
→ 说明它服务于 MySQLnd
→ Native Driver,本地原生驱动
- 特点 :
- 不依赖外部库(例如 libmysqlclient)
- 支持
mysqli
和PDO MySQL
两种 API
4.2.2. mysqli
- 全称 :MySQL Improved
- 作用 :PHP 面向 MySQL 的增强接口,比早期的
mysql
扩展功能更多、更安全 - 为什么叫 mysqli :
mysql
→ 说明它是 MySQL 的接口i
→ improved(改进的),增强功能
- 特点 :
- 支持面向对象和过程式编程
- 支持预处理语句(prepared statements)
- 高性能
4.2.3. pdo_mysql
- 全称 :PHP Data Objects MySQL 驱动
- 作用:通过 PDO 接口操作 MySQL
- 为什么叫 pdo_mysql :
pdo
→ PHP Data Objects,PHP 的统一数据库接口_mysql
→ 这个 PDO 实现是针对 MySQL 的
- 特点 :
- 用同一套 API 访问不同数据库(MySQL、SQLite、PostgreSQL...)
- 支持面向对象,支持预处理语句
- 便于跨数据库迁移
3. PHP 如何加载扩展
PHP 不会自动扫描文件夹,而是 根据配置文件 php.ini
去加载。
在 php.ini
里加一行:
extension=mysqli
extension=pdo_mysql
php.ini 扩展部分配置代码如下图:

4.如何检查PHP环境
php
<?php
//检查php环境函数
phpinfo()
?>
打开挂载当前index.php的apache服务 (上一篇有讲不再赘述)
打开配置好的网页 http://localhost/index.php
php环境如下图:
4.1 可看到版本号,配置文件路径

4.2 Apache 环境

4.3 扩展相关

4.4 php如何设定时区
ini
[Date]
; Defines the default timezone used by the date functions
; https://php.net/date.timezone
;date.timezone =
; https://php.net/date.default-latitude
;date.default_latitude = 31.7667
; https://php.net/date.default-longitude
;date.default_longitude = 35.2333
; https://php.net/date.sunrise-zenith
;date.sunrise_zenith = 90.833333
; https://php.net/date.sunset-zenith
;date.sunset_zenith = 90.833333
1.date.timezone
; Defines the default timezone used by the date functions
; https://php.net/date.timezone
;date.timezone =
-
作用:指定 PHP 默认时区。
-
默认行为 :如果不设置,PHP 会根据系统时区,但在 CLI 或 Web 下可能报 "Warning: date(): It is not safe to rely on the system's timezone"。
-
示例:
date.timezone = "Asia/Bangkok"
2.** date.default_latitude
**
; https://php.net/date.default-latitude
;date.default_latitude = 31.7667
- 作用 :默认的地理纬度,用于日出日落等函数计算(
date_sunrise()
、date_sunset()
)。 - 单位:度(°)
- 示例:31.7667 大约是耶路撒冷纬度。
3.** date.default_longitude
**
; https://php.net/date.default-longitude
;date.default_longitude = 35.2333
- 作用:默认的地理经度,用于日出日落计算。
- 单位:度(°)
- 示例:35.2333 大约是耶路撒冷经度。
4.date.sunrise_zenith
; https://php.net/date.sunrise-zenith
;date.sunrise_zenith = 90.833333
- 作用 :计算日出时的太阳高度角基准值(
zenith
)。 - 单位:度(°)
- 默认值:90.833333°,标准天文定义的日出日落角度(考虑大气折射)。
** date.sunset_zenith
**
; https://php.net/date.sunset-zenith
;date.sunset_zenith = 90.83333
- 作用 :计算日落时的太阳高度角基准值,与
sunrise_zenith
类似。
4.4.1 php.ini 配置文件中设置时区(全局)
1.打开 PHP 配置文件(Homebrew PHP M2 默认路径):
ini
/opt/homebrew/etc/php/8.4/php.ini
2.搜索 date.timezone
,修改为你想要的时区,例如:
ini
date.timezone = "Asia/Bangkok"
注意:必须是 PHP 官方支持的时区名称 ,参考 PHP 时区列表
下图是
:
3.保存后重启 PHP(如果是 FPM 或 Apache 模块):
bash
brew services restart php
4.4.2 脚本中设置时区(临时/局部
如果你不想改 php.ini,可以在 PHP 脚本中使用:
php
<?php
date_default_timezone_set('Asia/Bangkok');
// 测试
echo date('Y-m-d H:i:s');
- 只影响当前运行的脚本
- 比较适合 CLI 或独立脚本
4.4.3 PHP-FPM / Apache 配置
- 如果你用 PHP-FPM,php.ini 改完要重启 FPM:
bash
brew services restart php
- 如果你用 Apache + PHP 模块,改完也要重启 Apache:
bash
brew services restart httpd
4.4.4 验证当前时区
php
<?php
echo date_default_timezone_get();
或者命令行:
bash
php -r "echo date_default_timezone_get();"
4.5 中国时区PRC
date.timezone = PRC
在 PHP 里表示 将默认时区设置为"中华人民共和国标准时间" ,也就是 北京时间(UTC+8)。
PRC
-
PRC = People's Republic of China(中华人民共和国)
-
PHP 内部支持的时区别名之一,等价于
Asia/Shanghai
-
所以:
date.timezone = PRC
等同于:
date.timezone = "Asia/Shanghai"
用途
-
设置后,所有 PHP 日期函数(
date()
、time()
、strtotime()
等)会按这个时区来计算时间。 -
例如:
echo date("Y-m-d H:i:s");
输出就是北京时间。
-
注意事项
PRC
是官方支持的 PHP 时区别名,但在跨平台或新项目中,推荐使用完整时区名(如Asia/Shanghai
),可避免潜在兼容性问题。- 可以通过
php -i | grep "timezone"
查看当前 PHP 时区。
4.6 其他别名时区在哪看?
PHP 官方列出了所有 时区别名 和 对应的标准时区:
例如:
别名 | 标准时区 | 国家/地区 |
---|---|---|
PRC | Asia/Shanghai | 中国 |
MET | Europe/Paris | 法国及中欧部分国家 |
EET | Europe/Bucharest | 罗马尼亚及东欧部分国家 |
AST | America/Puerto_Rico | 波多黎各、部分加勒比地区 |
注意:有些别名是历史遗留的,不推荐在新项目中使用,最好用标准时区名(Area/City
格式)。
说明:
- MET = Middle European Time(中欧时间),覆盖法国、德国、意大利等中欧国家。
- EET = Eastern European Time(东欧时间),覆盖罗马尼亚、希腊、保加利亚等东欧国家。
- AST = Atlantic Standard Time / Arabia Standard Time,不同地区定义不同,这里 PHP 默认指美洲的波多黎各。