当前位置:首页 > 休闲

thinkphp5数据库配置文件

ThinkPHP5的数据数据库配置藏在application/database.php里。这个文件返回一个PHP数组,库配框架启动时直接读取,置文没有中间层。数据很多人第一次找它的库配时候会翻到config.php去,其实5.0版本已经把数据库配置独立出来了,置文跟3.2那套完全不一样。数据

打开这个文件,库配你会看到一个return后面跟着一长串键值对。置文最上面是数据type,默认写的库配是mysql。别小看这个字段,置文它决定了后面所有配置项按哪套规则解析。数据你改成sqlite,库配下面的置文hostname、database含义就变了。我见过有人从MySQL切到PostgreSQL,只改了type和hostname,结果charset没动,跑起来报编码错误,排查了半天。

hostname写的是数据库地址,本地开发一般填127.0.0.1。用localhost行不行?行,但走的是Unix socket,跟TCP连接在错误提示上不一样。有次帮人看一个连接超时的问题,localhost死活连不上,换成127.0.0.1秒连——MySQL的socket路径配置有问题。这种事不常遇到,遇到了就记一辈子。

database填库名,username和password不用多说。有个细节:密码里如果带#或者@,在PHP数组里直接写字符串没问题,但如果你用环境变量注入,得注意转义。TP5支持Env::get()方式读取,配置文件里写成'password' => Env::get('database.password', ''),这样生产环境和开发环境可以共用同一份代码。

prefix是表前缀,默认空字符串。实际项目里一般会设成tp_或者项目缩写。这个值影响的不只是查询构建器,连Db::name('user')这种写法都会自动拼上前缀。如果你用了Db::table('user'),那前缀就不生效了——name和table的区别,新手很容易踩坑。

charset默认utf8。现在建库建表都推utf8mb4了,因为要存emoji。这个配置只影响连接字符集,库表本身的字符集得在MySQL层面设好。两边不一致的时候,写入特殊字符会报Incorrect string value。我习惯直接改成utf8mb4,然后MySQL的my.cnf里也同步设成utf8mb4,省心。

debug字段控制是否记录SQL日志。开发环境设true,配合app_debug一起用,页面右下角会弹出SQL执行面板。生产环境必须关掉,不然日志文件膨胀得飞快。有一次忘了关,一天跑了20G的日志,磁盘直接满了。

deploy是分布式部署配置,单机项目不用管。里面可以配master_num和slave_no,做读写分离的时候才需要动。TP5的读写分离是框架层自动判断的,query走从库,execute走主库,但事务里所有操作强制走主库——这个逻辑写死在Connection类里,不看源码容易困惑。

rw_separate打开读写分离后,如果从库延迟太高,可以设rw_separate为false临时降级。这个开关在流量突增时挺有用,不用改代码,改配置就行。

params数组里可以塞PDO的额外选项。比如PDO::ATTR_TIMEOUT设连接超时,PDO::ATTR_PERSISTENT开长连接。长连接在PHP-FPM模式下要小心,pm.max_requests设大了可能把MySQL连接数占满。我一般设成500,让FPM定期回收进程。

配置文件支持多环境。在application目录下建database.local.php,本地开发时TP5会自动加载并覆盖database.php里的同名键。这个机制比改.env文件直接,团队协作时把local文件加进.gitignore就行。

最后提一句:改完配置记得清缓存。TP5的配置缓存存在runtime/cache下,有时候改了文件没生效,八成是缓存没清。命令行跑php think clear,或者手动删runtime目录,比什么都管用。

分享到: