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 默认指美洲的波多黎各。
相关推荐
BingoGo1 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php
JaguarJack1 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php·服务端
BingoGo2 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php
JaguarJack2 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php·服务端
JaguarJack3 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
后端·php·服务端
BingoGo3 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
php
JaguarJack4 天前
告别 Laravel 缓慢的 Blade!Livewire Blaze 来了,为你的 Laravel 性能提速
后端·php·laravel
郑州光合科技余经理5 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
西岸行者5 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
QQ5110082855 天前
python+springboot+django/flask的校园资料分享系统
spring boot·python·django·flask·node.js·php