PHP cli while(true) sleep(60) mysql

2015-05-12 20:00:38 +08:00
 whatisnew

假设有一个 php cli 文件,每2分钟运行一次与 mysql 数据写入操作。

如果是 corntab 或者 mq 的话,每一次执行都要和 mysql

  1. 建立连接
  2. 执行批量写入
  3. php 手动结束 mysql 连接
  4. php 结束运行 释放内存
  5. mysql connection 处理 sleep 状态
  6. 再次 1 ~ 5

脚本每 2 分钟一次,24小时下来,mysql 就会产生大量的 sleep connection,就算优化了 mysql 的 wait_timeout thread_cache_size 这些参数也没有用。

如果是 while(true) 的话,php 使用 pconnect 只有建立一个 mysql 连接,只要进程在 php 就永不释放 mysql connection 对吗?

这样是不是就能节省 mysql 连接数?

3700 次点击
所在节点    PHP
13 条回复
takatost
2015-05-12 20:12:11 +08:00
接下来你就要考虑怎么释放PHP进程的内存问题了
feiyuanqiu
2015-05-12 20:19:24 +08:00
我怎么感觉你想多了
实际上不只是你这个脚本在运行时会干这些事,所有的你的网站的涉及到数据库的页面,在用户访问的时候都会重复做这些事情,比如一个页面的 pageview 是每秒 2 次,一天下来就要重复 86400 * 2 次主楼里面的 1-6 的操作
似乎也没有浪费太多资源吧
whatisnew
2015-05-12 20:20:14 +08:00
@feiyuanqiu 主要是为了减轻 mysql 服务器的压力。
tabris17
2015-05-12 20:26:10 +08:00
mysql有自己的连接池啊
whatisnew
2015-05-12 20:27:54 +08:00
@tabris17 除了 java jdbc 连接池,你给我找一个 php 对 mysql 的连接池试试看。。。
mahone3297
2015-05-12 21:10:59 +08:00
1l说了,你减轻了这点不在乎的mysql资源,你换来的是无尽的内存烦恼。。。
php好像不会释放内存给os
Actrace
2015-05-12 21:13:00 +08:00
pconnect 和 PDO 建立的长连接都有大量sleep的问题,实际上你只需要用普通的方式建立连接,然后执行完毕后断开然后unset变量即可,效率和你所设想的长连接方式是一样的。

ps:这个问题似乎直到 5.6.7 都没被发现和解决。
yangqi
2015-05-12 21:15:47 +08:00
你php如何结束连接的?按道理正常结束Mysql连接应该不会有sleep connection了
tabris17
2015-05-12 21:26:35 +08:00
@whatisnew mysql有内置的线程缓存,相当于连接池的功能。如果你把建立TCP连接的IO开销都算进去,那就有点杞人忧天了
whatisnew
2015-05-12 21:59:40 +08:00
@tabris17 线程缓存 thread_cache_size 跟连接池是不同的概念好嘛
tabris17
2015-05-12 22:04:44 +08:00
@whatisnew 确实不是等同,但是线程缓存已经节省了新建连接的99%的开销,在客户端使用短连接,完全可以替代连接池的作用
jamlee
2015-05-12 22:35:02 +08:00
可以考虑下读写分离 减缓服务器压力
Septembers
2015-05-13 03:23:15 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/190540

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX