创新互联专注于渝北企业网站建设,成都响应式网站建设公司,商城网站建设。渝北网站建设公司,为渝北等地区提供建站服务。全流程专业公司,专业设计,全程项目跟踪,创新互联专业和态度为您提供的服务
做网站或者 Web 应用开发,数据存储是绕不开的一环。不管是企业官网里的文章内容、用户提交的留言信息,还是后台管理系统里的订单、会员资料,这些动态数据都需要存放在数据库当中,程序再根据业务需求读取、新增、修改或者删除数据。很多中小型项目选择 PHP 来开发,数据库层面的适配能力,也是大家在做技术选型时会重点考量的部分。不少刚接触 PHP 开发的朋友,只知道 PHP 搭配 MySQL 来搭建站点,并不清楚 PHP 本身具备丰富的数据库相关能力,除了大家最熟悉的 MySQL 之外,还可以对接多种不同类型的数据库系统,满足差异化的项目数据存储需求。
PHP 从语言设计之初,就把 Web 场景下的数据交互作为重要的功能方向。早期版本就内置了 MySQL 相关的扩展,方便开发者快速完成网站数据读写。随着数据库技术持续迭代,不同业务场景诞生出很多不同特性的数据库产品,PHP 也跟着不断更新配套扩展,持续完善对各类数据库的支持。很多新手在学习 PHP 建站的时候,最先接触的就是 PHP 和 MySQL 的组合,这套组合在中小型网站领域经过长期验证,大量企业站、资讯站点、轻量管理系统都在使用这套方案。
PHP 原生内置 MySQL 相关扩展,开发者不用额外下载复杂的第三方工具包,配置好 PHP 环境之后,开启对应的扩展,就可以编写代码完成数据库连接。在开发过程里,可以直接编写语句实现数据库连接、查询数据表、新增记录、修改已有数据和删除记录。很多简单的项目,不需要引入复杂框架,依靠原生 PHP 代码就可以完成基础的数据交互逻辑。不过这里要区分旧版 mysql 扩展和新版 mysqli 扩展,旧版 mysql 扩展已经不再维护,新版本 PHP 环境基本都移除了这个扩展,新项目开发不建议继续使用。mysqli 扩展是面向 MySQL 数据库的改良扩展,支持面向对象和面向过程两种写法,还可以使用预处理语句,降低 SQL 注入带来的安全风险。
很多开发者会混淆原生扩展和 PDO 的概念,PDO 并不是一款数据库,而是 PHP 提供的一套数据库抽象层。PDO 属于 PHP 内置的功能,只要在 php.ini 配置文件中开启对应数据库驱动,就可以使用同一套代码规范去连接不同的数据库。不管项目后端选用 MySQL、PostgreSQL,还是 Oracle,只要开启对应的 PDO 驱动,代码的基础编写逻辑基本保持一致。这种统一的开发方式,可以减少开发者的学习成本,不用针对每一种数据库单独学习一套全新的代码写法。项目后期如果业务发生变化,需要更换数据库类型,基于 PDO 编写的代码,改动的范围会小很多,不用大面积重写业务逻辑。
日常开发工作里,MySQL 依旧是和 PHP 搭配最多的数据库。MySQL 属于关系型数据库,结构清晰,学习门槛不高,开源版本可以免费使用,和 PHP 一样很适合中小型项目。使用 mysqli 原生扩展连接 MySQL 的时候,代码逻辑直观,适合业务简单、数据库长期不会更换的项目。项目只需要稳定对接 MySQL,开发人员熟悉 mysqli 语法,用原生扩展开发,代码执行链路更短,理解起来简单。如果项目存在后续切换数据库的可能性,开发团队更推荐选用 PDO 方式编写数据库交互代码,依靠统一接口适配不同数据库。
PostgreSQL 也是一款应用广泛的开源关系型数据库,在数据一致性要求高、查询逻辑复杂的项目中使用较多。PHP 想要连接 PostgreSQL,既可以启用 pgsql 原生扩展,也可以通过 PDO 搭配 pgsql 驱动完成连接。PostgreSQL 支持更加丰富的数据类型,对于部分需要存储地理信息、复杂 JSON 结构数据的业务场景会更合适。很多人以为 PHP 只能搭配 MySQL,当项目业务对数据完整性、复杂查询能力有更高要求的时候,开发者完全可以选用 PostgreSQL 作为底层数据库,再用 PHP 完成业务逻辑开发。只要环境配置到位,PHP 程序可以正常完成数据表创建、数据读写、事务处理等操作。
Oracle 数据库多用于大型企业业务系统,在金融、大型政企项目当中比较常见。这类项目数据体量较大,对数据安全、事务稳定性要求很高。PHP 同样可以通过 PDO 的 Oracle 驱动完成数据库连接,也可以启用 oci 扩展来对接 Oracle 数据库。很多中小型项目一般不会选用 Oracle,主要是授权成本、运维难度相对更高。如果开发团队承接企业定制项目,客户已经在使用 Oracle 数据库,PHP 程序也能够接入这套数据库系统,读取业务存量数据,开发对应的后台管理页面。只是 Oracle 数据库的配置、权限管理会更加繁琐,开发人员需要熟悉数据库本身的使用规范,再结合 PHP 代码完成开发。
除了上面提到的几款主流关系型数据库之外,PHP 还可以对接其他类型数据库。SQLite 属于轻量级文件数据库,不需要单独安装数据库服务,数据直接保存在单个文件当中。PHP 原生自带 SQLite 相关支持,不需要额外部署数据库服务。小型演示项目、本地工具、低访问量的简单站点,就可以使用 SQLite。数据量不大,访问请求不多的场景,使用 SQLite 可以省去数据库服务器的部署工作,减少运维工作量。但 SQLite 不适合多用户高并发写入场景,大量用户同时提交数据的时候容易出现性能问题,项目选型的时候要评估业务访问特点。
数据库连接的方式不一样,开发过程要注意的细节也会存在区别。使用原生数据库扩展,每一类数据库都有专属的函数。连接 MySQL 用 mysqli 系列函数,连接 PostgreSQL 使用 pgsql 系列函数,函数名称、参数格式互不通用。开发人员如果同时维护多个使用不同数据库的项目,就需要记忆多套函数语法,切换项目的时候容易出现代码书写错误。项目如果后续打算更换数据库,大量数据库操作代码都需要修改,工作量会明显增加。
PDO 抽象层就很好地解决了这个问题。不管后端是什么数据库,连接数据库、执行查询、获取返回数据,调用的 PDO 方法名称保持不变。唯一需要改动的,就是数据库连接字符串,以及数据库账号密码这类连接信息。这种特性带来很大的灵活性,同一个 PHP 程序,切换数据库,大部分业务代码不用重写。PDO 还原生支持预处理语句,不管对接哪一种数据库,都可以借助预处理机制,对输入数据进行转义处理,降低 SQL 注入风险。在 Web 开发当中,SQL 注入是很常见的安全隐患,合理使用预处理语句,可以提升项目整体安全性,这也是很多现代 PHP 框架底层都选用 PDO 进行数据库操作的原因。
很多新手开发容易踩坑,不管用原生扩展还是 PDO 连接数据库,都需要提前在 PHP 配置文件开启对应的数据库驱动。下载安装 PHP 之后,默认不会开启全部数据库扩展。如果没有开启对应驱动,直接运行数据库连接代码,程序就会抛出错误,提示找不到对应的数据库类或者函数。比如想要用 PDO 连接 MySQL,就需要找到 php.ini 文件,取消 pdo_mysql 前面的注释标记,保存文件之后重启 Web 服务,扩展才会生效。很多本地开发环境,像集成的 PHP 环境包,会默认开启常用数据库扩展,方便本地调试。但部署到线上服务器的时候,需要手动检查扩展开启状态,不然上线之后程序无法连接数据库。
数据库字符集也是开发当中需要重点留意的点。PHP 程序和数据库之间传输数据,如果字符集设置不一致,中文内容很容易出现乱码。不管使用 mysqli 原生扩展还是 PDO 连接数据库,建立连接之后,都需要指定数据库字符集。项目大多选用 utf8mb4 字符集,可以完整支持中文、表情符号等各类字符。字符集配置放在数据库连接成功之后,保证程序写入数据库的文字,和读取出来的文字编码保持统一,避免页面展示出现乱码问题。
数据库账号权限管理同样不能忽视。PHP 程序依靠数据库账号密码访问数据库,给项目使用的数据库账号,尽量不要分配过高权限。普通业务账号只需要具备业务所需数据表的查询、新增、修改权限,删除、修改数据表结构这类高危权限,只在开发阶段给到开发账号。线上环境缩小数据库账号权限范围,就算出现程序漏洞,也可以降低数据库被恶意操作带来的损失。数据库连接信息,包括地址、账号、密码,不要直接写在前端页面,也不要随意提交到公开代码仓库,防止敏感信息泄露。
数据库连接管理也是开发要关注的内容。每一次发起数据库连接,都会消耗服务器和数据库服务的资源。程序执行完成之后,不再使用的数据库连接需要及时释放。使用 PDO 的时候,连接对象销毁,连接就会自动断开。mysqli 原生扩展也有对应的关闭连接函数。短连接模式下,每次处理用户请求,建立数据库交互,请求处理完成就释放连接。还有持久连接的方案,建立一次连接之后,连接可以复用,减少反复创建连接带来的资源消耗。持久连接需要谨慎使用,如果使用不当,大量空闲连接占用数据库连接数,会造成数据库无法接收新的连接请求,引发站点无法读写数据的问题。
很多开发者会关心性能层面的差异。原生数据库扩展和 PDO 底层,最终都会调用对应的数据库驱动完成数据交互,两者之间性能差距在绝大多数中小型项目里很难感知到。业务数据量不大,并发访问量不高的时候,选用原生扩展或者 PDO,页面响应速度差别很小。项目数据量持续上涨,访问请求变多,性能瓶颈更多会出现在数据库查询语句设计、索引搭建、服务器硬件配置层面,而不是 PHP 选用哪一种数据库连接方式。想要优化数据读写效率,优先优化 SQL 语句,合理创建数据表索引,做好数据库缓存,这些手段带来的提升会更加明显。
不同数据库各自有着适合的业务场景,PHP 只是提供数据交互的通道,数据库本身的特性不会因为 PHP 程序发生改变。MySQL 适合绝大多数中小型 Web 项目,读写均衡,运维资源丰富。PostgreSQL 适合复杂查询、对数据完整性要求较高的业务。SQLite 适合单机、低并发的小型应用。Oracle 适合大型企业核心业务。开发团队做选型的时候,不能只看 PHP 能不能连接,还要结合业务数据规模、并发访问量、运维人员能力、项目长期维护成本综合判断。
还有一个很重要的点,老旧项目迁移过程里经常遇到。很多早年开发的 PHP 项目,使用已经废弃的 mysql 扩展,这类代码安全性不足,也无法在新版 PHP 环境运行。系统升级的时候,就需要把旧的数据库操作代码迁移到 mysqli 或者 PDO。迁移过程不能简单替换函数名称,还要同步调整代码逻辑,引入预处理语句,修复原有代码里存在的 SQL 注入漏洞。这类迁移工作需要仔细测试,保证原有业务功能不受影响,数据读写正常。
PHP 生态里的各类框架,底层数据库交互大多封装了 PDO,Laravel 这类框架的数据库操作,底层就是基于 PDO 实现。框架封装之后,开发者甚至可以不用手写大量 SQL 语句,借助 ORM 模型完成数据读写。框架的 ORM 简化开发工作,底层依旧依靠 PHP 自带的 PDO 驱动和数据库建立通信。哪怕使用框架开发,也需要服务器开启对应的 PDO 数据库驱动,才能正常连接目标数据库。框架只是在原生数据库能力之上做了一层封装,核心的数据库连接能力,依旧来自 PHP 本身。
线上项目部署阶段,数据库服务器和 Web 服务器可以部署在同一台服务器,也可以分开部署在不同服务器。PHP 程序填写数据库地址的时候,如果数据库独立部署,就填写数据库服务器的内网地址,同时要在数据库服务器配置白名单,只允许 Web 服务器的 IP 访问数据库端口,提升数据库访问安全。很多新手本地开发时数据库和 Web 服务都在本机,地址填写localhost,上线分开部署之后忘记修改数据库地址,就会出现程序无法连接数据库的报错。
在实际开发中,调试数据库连接也是必备技能。代码运行出现数据库报错,首先排查扩展是否开启,数据库地址、端口、账号密码是否填写正确,数据库服务器防火墙是否放行端口,数据库账号是否允许从当前 Web 服务器 IP 登录。数据库服务本身有没有正常启动,也是排查方向。很多时候程序报错不是 PHP 代码问题,而是数据库服务停止、防火墙拦截、账号权限不足这类环境问题。
PHP 提供的多数据库连接能力,给 Web 项目开发带来充足的选择空间。开发人员可以根据项目真实需求挑选合适的数据库,不用被语言限制数据库选型。简单的展示型网站,选用 MySQL 搭配 mysqli 原生扩展就能稳定运行。业务有更换数据库可能性,或者希望统一数据库操作代码,就可以选用 PDO 抽象层。项目业务特殊,需要对接 PostgreSQL、Oracle 这类数据库,PHP 也具备对应的驱动支持,完成数据交互。
开发人员需要客观看待 PHP 的数据库能力。PHP 可以完成各类主流数据库的数据读写工作,但它不会改变数据库本身的性能上限。数据库的承载能力,由数据库自身架构、索引设计、服务器硬件、查询语句质量决定。PHP 只是作为中间层,接收前端请求,组织对应的数据库指令,把指令发送给数据库,拿到返回的数据之后再渲染页面。数据库压力过大的时候,单纯优化 PHP 代码,很难解决数据库层面的瓶颈。项目发展到一定阶段,需要做数据库分库分表、读写分离,这些方案属于数据库层面的优化,PHP 程序只需要适配调整数据库连接地址,就可以对接优化后的数据库架构。
安全方面的考量贯穿整个数据库开发流程。不管是原生扩展还是 PDO,拼接字符串组装 SQL 语句,都存在注入风险。使用预处理语句,参数绑定的方式传递用户输入的数据,能够有效规避这类风险。用户提交的表单内容、URL 传递的参数,都不能直接拼接到 SQL 语句当中。很多安全事故,都是开发者直接把前端传入的数据拼接进 SQL,攻击者构造特殊字符篡改 SQL 逻辑,读取甚至修改数据库里全部业务数据。熟悉 PHP 数据库开发的开发者,都会优先使用预处理语句处理可变参数。
很多刚入行的开发者学习 PHP 数据库开发,会纠结到底选原生扩展还是 PDO。如果确定项目长期只使用 MySQL,项目业务简单,团队熟悉 mysqli 语法,原生扩展是可行方案。如果项目未来存在数据库切换的可能,或者团队同时维护多个不同数据库的项目,PDO 会是更稳妥的选择。掌握 PDO 的开发方式,相当于掌握一套可以适配多种数据库的开发规范,后续接触不同数据库项目,学习压力会减轻不少。
大量真实落地项目可以印证 PHP 数据库相关能力的实用性。企业官网、会员管理系统、轻量商城、内部工单系统,很多项目都基于 PHP 搭配不同数据库开发。不同业务场景选用适配的数据库,依靠 PHP 完成前后端的数据交互,稳定支撑业务运转。理解 PHP 原生数据库扩展和 PDO 抽象层之间的区别,清楚不同数据库的适配条件,在项目前期做好选型规划,写代码的时候做好安全防护,就可以搭建稳定可靠的数据交互功能。
了解 PHP 原生数据库能力和多类型数据库连接方式,不只是学会几段连接数据库的代码,更是理解 Web 应用当中程序和数据存储系统的协作逻辑。开发者掌握这些知识之后,可以根据项目预算、业务需求、运维条件挑选数据库方案,在开发效率、项目安全性、长期维护成本之间找到合适的平衡点,让数据存储模块更好地支撑整个 Web 应用的业务运转。
Copyright © 2009-2022 www.fjjierui.cn 青羊区广皓图文设计工作室(个体工商户)达州站 版权所有 蜀ICP备19037934号