引言:
PHP 扩展是 PHP 语言功能的延伸与增强,涵盖数据库驱动、网络通信、图像处理、数据格式、加密安全、数学计算、国际化、性能优化、队列缓存、NoSQL 等完整分类。本文系统梳理 PHP 扩展的概念、完整分类列表、各扩展详细代码用法及安装管理方法,帮助开发者全面掌握 PHP 扩展的应用。
PHP 扩展模块完全指南
PHP 扩展模块是 PHP 语言功能的延伸和增强。它们如同一个个功能组件,让 PHP 能够连接数据库、处理图像、进行加密、发送网络请求等。本指南将系统介绍 PHP 扩展的概念,并以分类形式全面梳理各类常见扩展的用途和基本用法。
PHP 扩展的概念与形式
什么是 PHP 扩展
PHP 扩展是用 C 语言编写的动态链接库,用于为 PHP 提供额外的功能。PHP 语言本身提供语法、分支、循环、函数、类等基础能力,而扩展则在 PHP 的基础上补充或扩展功能,使 PHP 变得更加强大。
扩展以"插件式"的方式管理和维护 PHP 的功能。如果将全部功能整合到 PHP 语言中,会导致 PHP 过于臃肿且不够灵活。而有了扩展机制,开发者可以根据实际需求灵活启用或禁用功能。
PHP 扩展的存在形式
在 Linux 系统下,PHP 扩展以 .so 文件存在(如 redis.so),在 Windows 系统下则以 .dll 文件存在。
查看已安装的扩展
1 2 3 4
| <?php
print_r(get_loaded_extensions()); ?>
|
get_loaded_extensions() 函数返回一个数组,包含所有已编译并加载的扩展模块名称。
PHP 扩展的完整分类列表
PHP 扩展种类繁多,以下按照功能领域,系统列出目前 PHP 生态中常见的扩展模块。
一、数据库驱动扩展
| 扩展名称 |
作用与用法 |
| mysqli |
MySQL 数据库原生扩展,支持面向对象和面向过程两种编程风格。支持预处理语句、事务和多个查询结果。 |
| pdo_mysql |
PDO 的 MySQL 驱动程序,提供统一的数据库访问接口。 |
| pgsql |
PostgreSQL 数据库的原生扩展,提供对 PostgreSQL 功能的全面访问。 |
| pdo_pgsql |
PDO 的 PostgreSQL 驱动程序。 |
| sqlite3 |
SQLite 数据库的原生扩展,提供高效且轻量级的数据库访问。 |
| pdo_sqlite |
PDO 的 SQLite 驱动程序。 |
| pdo_dblib |
用于连接 SQL Server 和 Sybase 数据库的 PDO 驱动扩展。 |
| pdo_firebird |
Firebird/InterBase 数据库的 PDO 驱动程序。 |
| pdo_oci |
Oracle 数据库的 PDO 驱动程序。 |
| pdo_odbc |
ODBC 数据库的 PDO 驱动程序,用于连接支持 ODBC 的各类数据库。 |
| pdo_sqlsrv |
Microsoft SQL Server 的 PDO 驱动程序。 |
| sqlsrv |
Microsoft SQL Server 的原生扩展。 |
| mysqlnd |
MySQL Native Driver,MySQL 数据库的底层驱动库,为 mysqli 和 PDO_MySQL 提供底层支持。 |
| odbc |
ODBC(Open Database Connectivity)支持,用于连接多种数据库。 |
| interbase |
Firebird/InterBase 数据库支持。 |
| dba |
与平面文件数据库(如 DBM)交互,提供键值对存储功能。 |
| dbase |
读取和写入 dBASE 格式的数据库文件。 |
二、网络通信与 API 交互扩展
| 扩展名称 |
作用与用法 |
| curl |
使用各种协议(HTTP、HTTPS、FTP 等)发起网络请求,对于与第三方 API 集成和获取外部数据至关重要。 |
| sockets |
提供底层套接字通信功能,使 PHP 能够创建网络客户端和服务器。 |
| ftp |
提供访问 FTP 服务器上文件的函数,简化通过 FTP 传输文件的过程。 |
| soap |
提供构建和使用基于 SOAP 的 Web 服务的功能,简化与使用 SOAP 的遗留系统的集成。 |
| imap |
提供使用 IMAP、POP3 和 NNTP 协议与电子邮件服务器交互的函数,用于读取、撰写和发送电子邮件。 |
| ldap |
与 LDAP(轻量级目录访问协议)目录进行交互,用于管理集中式用户目录和认证。 |
| ssh2 |
通过 SSH 协议进行安全的远程通信和文件传输。 |
| amqp |
与 Advanced Message Queuing Protocol(AMQP)消息队列交互。 |
| zmq |
ZeroMQ 消息队列支持。 |
| grpc |
支持 gRPC 高性能远程过程调用框架。 |
| http |
提供 HTTP 消息处理、客户端请求和服务器响应功能。 |
| smtp |
SMTP 邮件发送支持(部分发行版)。 |
| oauth |
OAuth 认证协议支持。 |
三、图像处理扩展
| 扩展名称 |
作用与用法 |
| gd |
提供创建和操作图像的函数,支持多种图像格式,并提供调整大小、裁剪和绘制形状等功能。 |
| imagick |
提供对 ImageMagick 库的接口,实现高级图像处理功能,如调整大小、模糊和颜色校正。 |
| exif |
从图像中读取可交换图像文件(Exif)元数据,允许访问相机信息、方向、GPS 数据等。 |
| gmagick |
提供对 GraphicsMagick 库的接口,ImageMagick 的轻量级替代方案。 |
| vips |
与 libvips 图像处理库交互,提供快速且内存高效的大图像处理能力。 |
四、数据格式与编码扩展
| 扩展名称 |
作用与用法 |
| json |
提供 JavaScript Object Serialization 支持,用于 JSON 数据的编码和解码。此扩展默认启用。 |
| xml |
提供处理 XML 数据的基本工具,允许解析和验证。 |
| simplexml |
提供简单接口解析和操作 XML 文档,使处理 XML 数据变得直观且高效。 |
| xmlreader |
提供快速、非缓存的 XML 解析器,适合高效处理大型 XML 文件。 |
| xmlwriter |
通过写入器 API 创建 XML 文档,提供高效的 XML 生成。 |
| dom |
通过文档对象模型(DOM)处理 XML 文档的完整 API,简化 XML 解析和操作。 |
| xsl |
使用 XSLT 样式表转换 XML 文档,支持 XML 格式之间灵活的数据转换。 |
| xmlrpc |
支持 XML-RPC 协议的远程过程调用。 |
| yaml |
解析和生成 YAML 格式数据。 |
| protobuf |
支持 Protocol Buffers 序列化格式。 |
| msgpack |
支持 MessagePack 二进制序列化格式。 |
| igbinary |
提供替代的二进制序列化格式,减少存储空间并加快数据反序列化速度。 |
| iconv |
提供在不同字符编码之间转换的函数,确保跨各种语言和编码格式的文本兼容性。 |
| mbstring |
多字节字符串扩展,提供处理多字节编码(如 UTF-8、GBK、Shift-JIS)的功能,对于处理非 ASCII 文本至关重要。 |
| bz2 |
使用 bzip2 算法启用数据压缩,减少文件大小并提高存储效率。 |
| zip |
提供创建、修改和从 ZIP 档案中提取文件的功能,简化档案管理。 |
| zlib |
使用 zlib 库进行数据压缩和解压缩,有助于减少存储空间和网络带宽。 |
| lz4 |
使用 LZ4 算法提供快速压缩和解压缩,适用于需要高速数据压缩的应用。 |
| lzf |
使用 LZF 算法进行快速数据压缩。 |
| rar |
读取和解压缩 RAR 档案文件。 |
| phar |
允许将 PHP 应用程序打包到单个文件存档中,简化应用程序的发布和部署。 |
五、加密与安全扩展
| 扩展名称 |
作用与用法 |
| openssl |
使用 SSL 和 TLS 协议启用安全数据传输,提供加密、解密和数字证书功能。 |
| sodium |
提供现代密码学功能,用于加密、解密、密码哈希和数字签名。 |
| hash |
提供各种哈希算法(MD5、SHA1、SHA256 等),用于生成消息摘要。 |
| mcrypt |
加密扩展库,提供多种加密算法(已废弃,建议使用 OpenSSL 或 Sodium)。 |
| gnupg |
GNU Privacy Guard 接口,用于加密、解密和签名。 |
| enchant |
提供拼写检查功能,支持多种词典库。 |
| pspell |
提供拼写检查功能(基于 Aspell 库)。 |
六、数学计算扩展
| 扩展名称 |
作用与用法 |
| bcmath |
提供任意精度算术,允许使用大数字并执行高精度数学运算,在金融应用中特别有用。 |
| gmp |
使用 GNU 多精度库提供任意精度算术函数,适合加密应用。 |
| stats |
提供统计函数(平均值、标准差、分布等)。 |
| trader |
提供技术分析指标函数,适用于金融数据分析。 |
七、国际化扩展
| 扩展名称 |
作用与用法 |
| intl |
提供国际化功能,包括根据区域设置格式化数字、日期和货币,以及处理不同语言的文本。 |
| calendar |
提供在不同日历格式之间转换的函数,支持儒略历、格里高利历和希伯来历等。 |
| gettext |
提供 GNU gettext 支持,用于实现多语言应用。 |
| timezonedb |
提供时区数据库,用于更新 PHP 的时区信息。 |
八、数据验证与过滤扩展
| 扩展名称 |
作用与用法 |
| filter |
提供简单的方法来清理和验证数据,特别是用户输入,以确保数据完整性和安全性。 |
| ctype |
提供检查字符类型的函数,用于验证和清理文本输入。 |
九、性能优化与调试扩展
| 扩展名称 |
作用与用法 |
| opcache / Zend OPcache |
通过缓存预编译的脚本字节码来提高 PHP 性能,减少了 PHP 在每次请求时重新编译脚本的需要。 |
| xdebug |
提供调试、堆栈跟踪、代码覆盖率分析和性能分析功能。 |
| apcu |
APC User Cache,提供用户级数据缓存功能。 |
| igbinary |
高性能序列化格式,加快数据存储和读取速度。 |
| tideways_xhprof |
提供性能分析功能,用于定位 PHP 应用性能瓶颈。 |
十、命令行与进程控制扩展
| 扩展名称 |
作用与用法 |
| readline |
提供交互式命令行编辑功能,通过支持历史记录和行编辑增强 CLI 体验。 |
| pcntl |
启用进程控制功能,允许在 PHP 中管理并行处理和信号处理。 |
| posix |
提供类似 POSIX 的系统调用功能,用于处理进程管理和文件权限。 |
| sysvmsg |
发送和接收 System V IPC 消息,用于多个进程之间的消息传递。 |
| sysvsem |
管理 System V 信号量,用于同步多个进程。 |
| sysvshm |
读写 System V 共享内存段,用于多个进程之间共享数据。 |
| shmop |
允许 PHP 读取和写入共享内存段,用于进程间通信(IPC)。 |
十一、文件系统与文本处理扩展
| 扩展名称 |
作用与用法 |
| fileinfo |
根据文件签名检测文件类型,对安全检查和内容类型验证有用。 |
| tidy |
提供 HTML 文档清理和修复功能。 |
| tokenizer |
提供将 PHP 代码解析为标记的功能,用于语法高亮和静态分析。 |
| xdiff |
提供差异比较和补丁应用功能。 |
| yaz |
提供 Z39.50 协议支持,用于图书馆信息检索。 |
十二、队列与缓存扩展
| 扩展名称 |
作用与用法 |
| redis |
允许 PHP 与 Redis 内存数据结构存储交互,用于缓存、消息代理和实时数据处理。 |
| memcached |
提供对 Memcached 分布式内存缓存系统的访问。 |
| memcache |
Memcached 的早期扩展版本(功能相对有限)。 |
| apcu |
APC User Cache,提供用户级数据缓存。 |
十三、NoSQL 与大数据扩展
| 扩展名称 |
作用与用法 |
| mongodb |
与 MongoDB NoSQL 数据库交互。 |
| leveldb |
与 LevelDB 键值存储交互。 |
| solr |
与 Apache Solr 搜索平台交互。 |
| elastic_apm |
与 Elastic APM 应用性能监控集成。 |
十四、开发与框架支持扩展
| 扩展名称 |
作用与用法 |
| ffi |
外部函数接口,允许 PHP 直接调用用其他语言(如 C)编写的函数。 |
| reflection |
提供运行时类、方法、属性、参数等信息的导出和提取功能。 |
| spl |
标准 PHP 库,提供解决典型问题的一组接口与类的集合。 |
| phalcon5 |
Phalcon PHP 框架的扩展版本。 |
| psr |
提供 PSR(PHP Standard Recommendations)标准接口。 |
十五、特定应用扩展
| 扩展名称 |
作用与用法 |
| snmp |
与 SNMP(简单网络管理协议)设备交互,用于网络管理。 |
| rrd |
与 RRDtool(Round Robin Database)交互,用于时间序列数据存储和图表生成。 |
| inotify |
提供 Linux 文件系统事件监控功能。 |
| uploadprogress |
提供文件上传进度跟踪功能。 |
| uuid |
生成和操作 UUID(通用唯一标识符)。 |
| gender |
提供性别识别功能。 |
| geoip |
根据 IP 地址获取地理位置信息。 |
| geos |
提供几何计算功能(GEOS 库接口)。 |
| mailparse |
提供邮件消息解析功能。 |
| swoole |
提供异步、并行、高性能网络通信框架。 |
十六、SAPI 模块
SAPI(Server API)是 PHP 与 Web 服务器交互的接口层:
| 模块名称 |
作用 |
| apache2handler |
Apache 2.x Web 服务器的 PHP 处理模块(libphp.so)。 |
| cgi / fastcgi |
通用网关接口模式(php-cgi)。 |
| cli |
命令行模式(php 可执行文件)。 |
| fpm |
FastCGI Process Manager(php-fpm)。 |
| phpdbg |
交互式调试器,用于 Debug PHP 程序。 |
| embed |
允许在 C/C++ 语言中调用 PHP 提供的函数。 |
| litespeed |
LiteSpeed Web 服务器的 PHP 处理模块。 |
十七、其他实用扩展
| 扩展名称 |
作用与用法 |
| session |
在请求之间管理会话数据,简化安全存储和检索用户特定数据的过程。 |
| date |
日期和时间函数,默认编译安装。 |
| libxml |
libxml 库接口,为 SimpleXML、XSLT 和 DOM 等 XML 处理扩展提供底层支持。 |
| pcre |
Perl 兼容正则表达式支持。 |
| standard |
标准函数库,包含 PHP 的核心函数。 |
| core |
PHP 核心扩展,提供语言基础功能。 |
所有扩展的详细用法
下面这一部分我仅写了一些常用的扩展的使用方法,扩展模块过多我的认知有限只能写这么多了。
一、数据库驱动扩展用法
1. MySQLi 扩展
MySQLi(MySQL Improved)是 PHP 操作 MySQL 数据库的原生扩展,支持面向对象和面向过程两种风格。
面向对象方式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| <?php $mysqli = new mysqli('localhost', 'username', 'password', 'database');
if ($mysqli->connect_errno) { die("连接失败: " . $mysqli->connect_error); }
$result = $mysqli->query("SELECT name, email FROM users LIMIT 5");
while ($row = $result->fetch_assoc()) { echo $row['name'] . " - " . $row['email'] . "\n"; }
$stmt = $mysqli->prepare("SELECT name FROM users WHERE id = ?"); $stmt->bind_param("i", $id); $id = 1; $stmt->execute(); $stmt->bind_result($name); while ($stmt->fetch()) { echo $name; }
$mysqli->close(); ?>
|
面向过程方式:
1 2 3 4 5 6 7 8 9 10 11 12
| <?php $conn = mysqli_connect('localhost', 'username', 'password', 'database'); if (!$conn) { die("连接失败: " . mysqli_connect_error()); }
$result = mysqli_query($conn, "SELECT * FROM users"); while ($row = mysqli_fetch_assoc($result)) { print_r($row); } mysqli_close($conn); ?>
|
2. PDO 及数据库驱动
PDO 提供统一的数据库访问接口,支持多种数据库驱动。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| <?php
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8mb4', 'user', 'pass'); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?"); $stmt->execute([1]); $user = $stmt->fetch(PDO::FETCH_ASSOC);
$stmt = $pdo->prepare("INSERT INTO users (name, email) VALUES (:name, :email)"); $stmt->execute([':name' => '张三', ':email' => 'zhang@example.com']);
$lastId = $pdo->lastInsertId();
$pdoPg = new PDO('pgsql:host=localhost;dbname=test', 'user', 'pass');
$pdoSqlite = new PDO('sqlite:/path/to/database.db'); ?>
|
3. PgSQL 扩展
PostgreSQL 数据库的原生扩展。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| <?php $conn = pg_connect("host=localhost port=5432 dbname=mydb user=postgres password=secret"); if (!$conn) { die("连接失败: " . pg_last_error()); }
$result = pg_query($conn, "SELECT id, name FROM users"); while ($row = pg_fetch_assoc($result)) { echo $row['name'] . "\n"; }
$result = pg_prepare($conn, "my_query", "SELECT * FROM users WHERE id = $1"); $result = pg_execute($conn, "my_query", array(1));
pg_free_result($result); pg_close($conn); ?>
|
4. SQLite3 扩展
轻量级嵌入式数据库扩展。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| <?php $db = new SQLite3('database.db');
$db->exec("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT)"); $db->exec("INSERT INTO users (name) VALUES ('张三')");
$result = $db->query("SELECT * FROM users"); while ($row = $result->fetchArray(SQLITE3_ASSOC)) { echo $row['name'] . "\n"; }
$stmt = $db->prepare("SELECT * FROM users WHERE id = :id"); $stmt->bindValue(':id', 1, SQLITE3_INTEGER); $result = $stmt->execute();
$memoryDb = new SQLite3(':memory:');
$db->close(); ?>
|
5. ODBC 扩展
ODBC 扩展用于连接支持 ODBC 的各类数据库。
1 2 3 4 5 6 7 8 9 10 11 12 13
| <?php $conn = odbc_connect('DSN_NAME', 'username', 'password'); if (!$conn) { die("ODBC 连接失败"); }
$result = odbc_exec($conn, "SELECT * FROM users"); while (odbc_fetch_row($result)) { echo odbc_result($result, "name") . "\n"; }
odbc_close($conn); ?>
|
二、网络通信与 API 交互扩展用法
1. cURL 扩展
cURL 是最常用的网络请求扩展,支持 HTTP、HTTPS、FTP 等协议。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| <?php
$curl = curl_init('https://api.example.com/users'); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_HTTPHEADER, [ 'Content-Type: application/json', 'Authorization: Bearer your-token' ]); $response = curl_exec($curl);
if (curl_errno($curl)) { echo "cURL Error: " . curl_error($curl); } else { $data = json_decode($response, true); print_r($data); } curl_close($curl);
$curl = curl_init('https://api.example.com/users'); curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode(['name' => '张三'])); curl_setopt($curl, CURLOPT_HTTPHEADER, ['Content-Type: application/json']); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($curl); curl_close($curl);
$curl = curl_init('https://example.com/file.zip'); $fp = fopen('local_file.zip', 'w'); curl_setopt($curl, CURLOPT_FILE, $fp); curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); curl_exec($curl); curl_close($curl); fclose($fp); ?>
|
2. Sockets 扩展
底层套接字通信功能。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| <?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); if ($socket === false) { die("创建 socket 失败: " . socket_strerror(socket_last_error())); }
$result = socket_connect($socket, '127.0.0.1', 8080); if ($result === false) { die("连接失败: " . socket_strerror(socket_last_error($socket))); }
socket_write($socket, "Hello Server", strlen("Hello Server")); $response = socket_read($socket, 1024); echo "服务器响应: " . $response;
socket_close($socket);
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); socket_sendto($socket, "UDP 消息", strlen("UDP 消息"), 0, '127.0.0.1', 8080); socket_recvfrom($socket, $buf, 1024, 0, $from, $port); echo "收到: " . $buf; socket_close($socket); ?>
|
3. FTP 扩展
FTP 文件传输操作。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| <?php $conn_id = ftp_connect('ftp.example.com'); $login_result = ftp_login($conn_id, 'username', 'password');
if (!$login_result) { die("FTP 登录失败"); }
ftp_put($conn_id, 'remote_file.txt', 'local_file.txt', FTP_BINARY);
ftp_get($conn_id, 'local_file.txt', 'remote_file.txt', FTP_BINARY);
$contents = ftp_nlist($conn_id, '/public'); print_r($contents);
ftp_close($conn_id); ?>
|
4. SOAP 扩展
SOAP Web 服务调用。
1 2 3 4 5 6 7 8 9 10 11
| <?php $client = new SoapClient('http://example.com/webservice.wsdl');
$result = $client->someMethod(['param1' => 'value1', 'param2' => 'value2']); print_r($result);
print_r($client->__getFunctions()); print_r($client->__getTypes()); ?>
|
5. IMAP 扩展
电子邮件操作。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| <?php $mailbox = '{imap.example.com:993/imap/ssl}INBOX'; $username = 'user@example.com'; $password = 'password';
$inbox = imap_open($mailbox, $username, $password); if (!$inbox) { die("连接失败: " . imap_last_error()); }
$emails = imap_search($inbox, 'UNSEEN'); if ($emails) { foreach ($emails as $email_num) { $overview = imap_fetch_overview($inbox, $email_num, 0); echo $overview[0]->subject . "\n"; } }
imap_close($inbox); ?>
|
三、图像处理扩展用法
1. GD 扩展
GD 是最常用的图像处理扩展。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| <?php
$image = imagecreatetruecolor(200, 100); $white = imagecolorallocate($image, 255, 255, 255); $black = imagecolorallocate($image, 0, 0, 0);
imagefilledrectangle($image, 0, 0, 199, 99, $white); imagestring($image, 5, 50, 40, 'Hello PHP', $black);
header('Content-Type: image/png'); imagepng($image); imagedestroy($image);
$src = imagecreatefromjpeg('photo.jpg'); $width = imagesx($src); $height = imagesy($src); $dst = imagecreatetruecolor($width / 2, $height / 2); imagecopyresampled($dst, $src, 0, 0, 0, 0, $width / 2, $height / 2, $width, $height); imagejpeg($dst, 'thumbnail.jpg'); imagedestroy($src); imagedestroy($dst); ?>
|
2. Imagick 扩展
ImageMagick 高级图像处理。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| <?php $image = new Imagick('photo.jpg');
$image->resizeImage(100, 100, Imagick::FILTER_LANCZOS, 1);
$watermark = new Imagick('watermark.png'); $image->compositeImage($watermark, Imagick::COMPOSITE_OVER, 10, 10);
$image->setImageFormat('png'); $image->writeImage('output.png');
$image->cropImage(100, 100, 10, 10);
$image->destroy(); ?>
|
3. EXIF 扩展
读取图像元数据。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <?php $exif = exif_read_data('photo.jpg'); if ($exif) { echo "相机: " . ($exif['Make'] ?? '') . "\n"; echo "型号: " . ($exif['Model'] ?? '') . "\n"; echo "拍摄时间: " . ($exif['DateTimeOriginal'] ?? '') . "\n"; echo "GPS 纬度: " . ($exif['GPSLatitude'] ?? '') . "\n"; echo "GPS 经度: " . ($exif['GPSLongitude'] ?? '') . "\n"; }
$thumb = exif_thumbnail('photo.jpg'); if ($thumb) { file_put_contents('thumb.jpg', $thumb); } ?>
|
四、数据格式与编码扩展用法
1. JSON 扩展
JSON 编解码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <?php
$data = ['name' => '张三', 'age' => 30, 'skills' => ['PHP', 'JavaScript']]; $json = json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT); echo $json;
$jsonStr = '{"name":"张三","age":30}'; $array = json_decode($jsonStr, true); $object = json_decode($jsonStr);
if (json_last_error() !== JSON_ERROR_NONE) { echo "JSON 错误: " . json_last_error_msg(); } ?>
|
2. XML 扩展系列
SimpleXML:简单 XML 解析。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <?php $xml = simplexml_load_string('<user><name>张三</name><age>30</age></user>'); echo $xml->name . "\n"; echo $xml->age . "\n";
$xml = simplexml_load_file('data.xml'); foreach ($xml->children() as $child) { echo $child->getName() . ": " . $child . "\n"; }
$xml = new SimpleXMLElement('<root/>'); $xml->addChild('user', '张三'); $xml->user->addAttribute('id', 1); echo $xml->asXML(); ?>
|
DOM 扩展:完整的 DOM API。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <?php $doc = new DOMDocument('1.0', 'UTF-8'); $doc->formatOutput = true;
$root = $doc->createElement('users'); $doc->appendChild($root);
$user = $doc->createElement('user'); $user->setAttribute('id', 1); $name = $doc->createElement('name', '张三'); $user->appendChild($name); $root->appendChild($user);
$xml = $doc->saveXML(); echo $xml; ?>
|
XMLReader:高效读取大型 XML。
1 2 3 4 5 6 7 8 9 10 11 12
| <?php $reader = new XMLReader(); $reader->open('large.xml');
while ($reader->read()) { if ($reader->nodeType == XMLReader::ELEMENT && $reader->name == 'user') { $node = new SimpleXMLElement($reader->readOuterXML()); echo $node->name . "\n"; } } $reader->close(); ?>
|
3. Mbstring 扩展
多字节字符串处理。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <?php $str = "你好世界 Hello World";
echo mb_strlen($str, 'UTF-8') . "\n"; echo mb_substr($str, 0, 4, 'UTF-8') . "\n"; echo mb_strtoupper($str, 'UTF-8') . "\n"; echo mb_strpos($str, 'World', 0, 'UTF-8') . "\n";
$gbk = mb_convert_encoding($str, 'GBK', 'UTF-8'); $utf8 = mb_convert_encoding($gbk, 'UTF-8', 'GBK');
$encoding = mb_detect_encoding($str, ['UTF-8', 'GBK', 'BIG5']); echo $encoding . "\n"; ?>
|
4. Zip 扩展
ZIP 档案操作。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| <?php
$zip = new ZipArchive(); if ($zip->open('archive.zip', ZipArchive::CREATE) === TRUE) { $zip->addFile('file1.txt', 'file1.txt'); $zip->addFile('file2.jpg', 'images/photo.jpg'); $zip->addEmptyDir('docs'); $zip->addFromString('readme.txt', '这是说明文件'); $zip->close(); }
$zip = new ZipArchive(); if ($zip->open('archive.zip') === TRUE) { $zip->extractTo('extract_folder/'); $zip->close(); }
$zip = new ZipArchive(); if ($zip->open('archive.zip') === TRUE) { for ($i = 0; $i < $zip->numFiles; $i++) { $stat = $zip->statIndex($i); echo $stat['name'] . " - " . $stat['size'] . "\n"; } $zip->close(); } ?>
|
5. Zlib 扩展
数据压缩。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| <?php $data = "这是需要压缩的数据,重复重复再重复。";
$compressed = gzcompress($data, 9); $encoded = base64_encode($compressed); echo "压缩后大小: " . strlen($encoded) . "\n";
$decoded = base64_decode($encoded); $uncompressed = gzuncompress($decoded); echo $uncompressed . "\n";
$fp = gzopen('file.gz', 'w9'); gzwrite($fp, $data); gzclose($fp); ?>
|
五、加密与安全扩展用法
1. OpenSSL 扩展
SSL/TLS 安全通信。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| <?php
$data = "敏感数据"; $key = openssl_random_pseudo_bytes(32); $iv = openssl_random_pseudo_bytes(16);
$encrypted = openssl_encrypt($data, 'aes-256-cbc', $key, 0, $iv); $decrypted = openssl_decrypt($encrypted, 'aes-256-cbc', $key, 0, $iv);
echo $decrypted . "\n";
$privateKey = openssl_pkey_get_private('file://private.pem'); openssl_sign($data, $signature, $privateKey, OPENSSL_ALGO_SHA256);
$publicKey = openssl_pkey_get_public('file://public.pem'); $valid = openssl_verify($data, $signature, $publicKey, OPENSSL_ALGO_SHA256); echo $valid ? '签名有效' : '签名无效'; ?>
|
2. Sodium 扩展
现代密码学。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| <?php
$password = 'user_password'; $hash = sodium_crypto_pwhash_str( $password, SODIUM_CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE, SODIUM_CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE );
if (sodium_crypto_pwhash_str_verify($hash, $password)) { echo "密码验证成功\n"; }
$key = sodium_crypto_secretbox_keygen(); $nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES); $message = '机密消息'; $ciphertext = sodium_crypto_secretbox($message, $nonce, $key); $plaintext = sodium_crypto_secretbox_open($ciphertext, $nonce, $key); echo $plaintext . "\n"; ?>
|
3. Hash 扩展
哈希函数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <?php echo md5('hello') . "\n"; echo sha1('hello') . "\n"; echo hash('sha256', 'hello') . "\n";
$algorithms = hash_algos(); print_r($algorithms);
$hmac = hash_hmac('sha256', 'message', 'secret_key'); echo $hmac . "\n";
echo hash_file('md5', 'file.txt') . "\n"; ?>
|
六、数学计算扩展用法
1. BCMath 扩展
任意精度算术。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| <?php
$result = bcadd('1.23456789', '9.87654321', 8); echo $result . "\n";
$result = bcmul('999999999.99', '888888888.88', 2); echo $result . "\n";
$result = bcdiv('10', '3', 4); echo $result . "\n";
$cmp = bccomp('1.5', '1.2', 1); echo $cmp . "\n";
$pow = bcpow('2', '10'); echo $pow . "\n";
$sqrt = bcsqrt('16', 0); echo $sqrt . "\n"; ?>
|
2. GMP 扩展
GNU 多精度算术。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| <?php
$a = gmp_init('999999999999999999'); $b = gmp_init('888888888888888888'); $sum = gmp_add($a, $b); echo gmp_strval($sum) . "\n";
$fact = gmp_fact(100); echo gmp_strval($fact) . "\n";
$prime = gmp_init('17'); echo gmp_prob_prime($prime) . "\n";
$rand = gmp_random_range(1, 100); echo gmp_strval($rand) . "\n"; ?>
|
3. Stats 扩展
统计函数。
1 2 3 4 5 6 7
| <?php $data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; echo "平均值: " . stats_mean($data) . "\n"; echo "标准差: " . stats_standard_deviation($data) . "\n"; echo "方差: " . stats_variance($data) . "\n"; echo "中位数: " . stats_median($data) . "\n"; ?>
|
七、国际化扩展用法
1. Intl 扩展
国际化功能。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| <?php
$formatter = new NumberFormatter('zh_CN', NumberFormatter::CURRENCY); echo $formatter->formatCurrency(1234.56, 'CNY') . "\n";
$dateFormatter = new IntlDateFormatter( 'zh_CN', IntlDateFormatter::LONG, IntlDateFormatter::SHORT ); echo $dateFormatter->format(new DateTime()) . "\n";
$msgFormatter = new MessageFormatter('zh_CN', '{0} 于 {1,date} 完成'); echo $msgFormatter->format(['任务', time()]) . "\n";
$collator = Collator::create('zh_CN'); $result = $collator->compare('张三', '李四'); echo $result . "\n";
$trans = Transliterator::create('Any-Latin; Latin-ASCII'); echo $trans->transliterate('中文拼音') . "\n"; ?>
|
2. GetText 扩展
多语言支持。
1 2 3 4 5 6 7 8 9 10 11 12 13
| <?php putenv('LC_ALL=zh_CN.UTF-8'); setlocale(LC_ALL, 'zh_CN.UTF-8'); bindtextdomain('messages', './locale'); textdomain('messages');
echo _('Hello World') . "\n"; echo gettext('Welcome') . "\n";
echo ngettext('1 item', '%d items', 5) . "\n"; ?>
|
八、性能优化扩展用法
1. OPcache 扩展
PHP 字节码缓存。
1 2 3 4 5 6 7
| opcache.enable=1 opcache.memory_consumption=128 opcache.interned_strings_buffer=8 opcache.max_accelerated_files=4000 opcache.validate_timestamps=0 opcache.revalidate_freq=0
|
1 2 3 4 5 6 7 8 9 10 11 12
| <?php
opcache_reset();
$status = opcache_get_status(); echo "缓存的文件数: " . $status['opcache_statistics']['num_cached_scripts'] . "\n";
$config = opcache_get_configuration(); print_r($config); ?>
|
2. APCu 扩展
用户数据缓存。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| <?php
apcu_store('key', 'value', 3600); apcu_store('user', ['name' => '张三', 'age' => 30]);
$value = apcu_fetch('key'); if ($value === false) { }
apcu_delete('key');
apcu_clear_cache();
if (apcu_exists('key')) { echo "存在\n"; }
$info = apcu_cache_info(); print_r($info); ?>
|
九、队列与缓存扩展用法
1. Redis 扩展
Redis 内存数据库。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| <?php $redis = new Redis(); $redis->connect('127.0.0.1', 6379); $redis->auth('password');
$redis->set('key', 'value'); $redis->setex('expiring_key', 60, 'value'); echo $redis->get('key') . "\n";
$redis->hSet('user:1', 'name', '张三'); $redis->hSet('user:1', 'age', 30); $user = $redis->hGetAll('user:1');
$redis->lPush('queue', 'task1'); $redis->rPush('queue', 'task2'); $task = $redis->rPop('queue');
$redis->sAdd('tags:php', 'web', 'backend'); $members = $redis->sMembers('tags:php');
$redis->zAdd('rank', 1, 'user_a'); $redis->zAdd('rank', 2, 'user_b'); $top = $redis->zRange('rank', 0, 9, true);
$redis->publish('channel', 'message');
$redis->multi(); $redis->set('a', 1); $redis->set('b', 2); $results = $redis->exec();
$redis->close(); ?>
|
2. Memcached 扩展
分布式缓存。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| <?php $memcached = new Memcached(); $memcached->addServer('127.0.0.1', 11211);
$memcached->set('key', 'value', 3600); $memcached->setMulti(['a' => 1, 'b' => 2]);
$value = $memcached->get('key'); $values = $memcached->getMulti(['a', 'b']);
$memcached->add('counter', 0); $memcached->increment('counter'); $memcached->decrement('counter');
$memcached->delete('key');
$cas = 0; $value = $memcached->get('key', null, $cas); $memcached->cas($cas, 'key', 'new_value');
$memcached->quit(); ?>
|
十、NoSQL 扩展用法
1. MongoDB 扩展
MongoDB NoSQL 数据库。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| <?php $client = new MongoDB\Client('mongodb://localhost:27017');
$db = $client->mydb; $collection = $db->users;
$result = $collection->insertOne(['name' => '张三', 'age' => 30]); $id = $result->getInsertedId();
$result = $collection->insertMany([ ['name' => '李四', 'age' => 25], ['name' => '王五', 'age' => 35] ]);
$documents = $collection->find(['age' => ['$gt' => 20]]); foreach ($documents as $doc) { echo $doc['name'] . "\n"; }
$collection->updateOne( ['name' => '张三'], ['$set' => ['age' => 31]] );
$collection->deleteOne(['name' => '张三']);
$pipeline = [ ['$match' => ['age' => ['$gt' => 20]]], ['$group' => ['_id' => '$age', 'count' => ['$sum' => 1]]] ]; $result = $collection->aggregate($pipeline); ?>
|
十一、扩展的安装与启用方法
查看已安装扩展
1 2 3 4 5 6 7 8 9 10 11 12
| <?php
print_r(get_loaded_extensions());
if (extension_loaded('mysqli')) { echo "MySQLi 扩展已加载\n"; }
phpinfo(); ?>
|
命令行方式:
1 2
| php -m php -i | grep extension
|
安装扩展
Linux 包管理器方式:
1 2 3 4 5 6 7 8
| sudo apt-get install php-mysqli php-curl php-gd php-mbstring
sudo yum install php-mysqli php-curl php-gd php-mbstring
sudo dnf install php-mysqli php-curl php-gd php-mbstring
|
PECL 方式:
1 2 3
| sudo pecl install redis sudo pecl install mongodb sudo pecl install imagick
|
Windows 方式:在 php.ini 中取消扩展注释。
1 2 3
| extension=mysqli extension=curl extension=gd
|
启用扩展
在 php.ini 中添加或取消注释:
1 2 3 4 5 6 7
| extension=mysqli extension=curl
extension=php_mysqli.dll extension=mysqli.so
|
PIE:下一代扩展管理工具
PIE(PHP Installer for Extensions)是新一代 PHP 扩展安装工具,旨在取代 PECL,解决 PECL 维护困难、依赖管理不足等问题。
1 2
| pie install asgrim/example_pie_extension
|
PIE 支持通过 Composer 管理扩展依赖,可以将扩展像普通 PHP 包一样声明在 composer.json 中。
总结
本文系统梳理了 PHP 各类扩展的完整列表和详细代码用法,涵盖了数据库驱动、网络通信、图像处理、数据格式、加密安全、数学计算、国际化、性能优化、队列缓存、NoSQL 等主要扩展类别。
PHP 扩展的使用核心要点可归纳为:
- 选择合适的扩展:根据项目需求选择扩展,MySQLi 适合 MySQL 专属项目,PDO 适合跨数据库项目
- 安全使用:数据库操作使用预处理语句防止 SQL 注入,加密使用 OpenSSL 或 Sodium
- 性能优化:使用 OPcache 缓存字节码,使用 Redis/Memcached 缓存数据
- 安装与管理:优先使用系统包管理器,其次选择 PECL,新项目可评估 PIE 工具
掌握这些扩展的使用方法,能够帮助开发者构建功能丰富、性能优良、安全可靠的 PHP 应用。