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 默认指美洲的波多黎各。
相关推荐
能不能别报错2 小时前
K8s学习笔记(二):Pod
笔记·学习·kubernetes
呱呱巨基3 小时前
C/C++ 内存管理
c++·笔记·学习
楼田莉子4 小时前
python小项目——学生管理系统
开发语言·python·学习
在路上`4 小时前
前端学习之后端java小白(二)-sql约束/建表
java·sql·学习
真*小白4 小时前
Python语法学习篇(三)【py3】
开发语言·python·学习
lingggggaaaa4 小时前
小迪安全v2023学习笔记(八十二讲)—— Java组件安全&Solr&Shiro&Log4j&CVE复现
笔记·学习·安全
不一样的故事1265 小时前
学习Python是一个循序渐进的过程,结合系统学习、持续实践和项目驱动,
开发语言·python·学习
菜菜子爱学习5 小时前
系统架构设计师——【2025年上半年案例题】真题分享(一)
学习·系统架构·软考·系统架构设计师