php学习(第五天)

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 的通信过程(抽象层)

可以理解成一个"三层通信":

  1. PHP 代码层
    • 你写的 <?php ... ?> 脚本。
  2. PHP 扩展层
    • mysqlipdo_mysql 扩展,把 PHP 语句翻译成数据库驱动可识别的指令。
  3. MySQL Server 层
    • 负责执行 SQL(SELECTINSERTUPDATE 等)并返回结果。

流程如下

nginx 复制代码
PHP 脚本 
   ↓
MySQL 扩展(mysqli / PDO)
   ↓
MySQL 客户端协议
   ↓
MySQL 服务器
   ↓
返回结果

4.php加载扩展这个扩展放在哪个文件里?

4.1. PHP 扩展的本质
  • 扩展 = 一段 C 语言编写的动态库(.so / .dll 文件)
  • 作用:让 PHP 拥有额外的功能,比如:
    • 操作 MySQL (pdo_mysql, mysqli)
    • 操作图片 (gd)
    • 缓存 (opcache)
  • 所以 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 → 说明它服务于 MySQL
    • nd → Native Driver,本地原生驱动
  • 特点
    • 不依赖外部库(例如 libmysqlclient)
    • 支持 mysqliPDO 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");

    输出就是北京时间。

  1. 注意事项

    • 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 默认指美洲的波多黎各。
相关推荐
张书名1 小时前
《强化学习数学原理》学习笔记6——贝尔曼最优方程的压缩性质
笔记·学习
悠哉悠哉愿意2 小时前
【ROS2学习笔记】话题通信篇:话题通信项目实践——系统状态监测与可视化工具
笔记·学习·ros2
hssfscv2 小时前
JAVA学习笔记——9道综合练习习题+二维数组
java·笔记·学习
charlie1145141915 小时前
精读 C++20 设计模式:行为型设计模式 — 访问者模式
c++·学习·设计模式·访问者模式·c++20
长路归期无望6 小时前
C语言小白实现多功能计算器的艰难历程
c语言·开发语言·数据结构·笔记·学习·算法
知识分享小能手6 小时前
微信小程序入门学习教程,从入门到精通,微信小程序常用API(上)——知识点详解 + 案例实战(4)
前端·javascript·学习·微信小程序·小程序·html5·微信开放平台
yuxb738 小时前
Ceph 分布式存储学习笔记(二):池管理、认证和授权管理与集群配置(下)
笔记·ceph·学习
悠哉悠哉愿意8 小时前
【ROS2学习笔记】话题通信篇:python话题订阅与发布
笔记·学习·ros2
Aevget8 小时前
PHP智能开发工具PhpStorm v2025.2全新上线——支持PHPUnit 12等
开发语言·ide·php·phpstorm
bruk_spp9 小时前
从pty驱动学习tty设备驱动加载
linux·学习