V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
whatisnew
V2EX  ›  PHP

PHP cli while(true) sleep(60) mysql

  •  
  •   whatisnew · 2015-05-12 20:00:38 +08:00 · 3743 次点击
    这是一个创建于 3510 天前的主题,其中的信息可能已经有所发展或是发生改变。

    假设有一个 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 连接数?

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

    ps:这个问题似乎直到 5.6.7 都没被发现和解决。
    yangqi
        8
    yangqi  
       2015-05-12 21:15:47 +08:00
    你php如何结束连接的?按道理正常结束Mysql连接应该不会有sleep connection了
    tabris17
        9
    tabris17  
       2015-05-12 21:26:35 +08:00
    @whatisnew mysql有内置的线程缓存,相当于连接池的功能。如果你把建立TCP连接的IO开销都算进去,那就有点杞人忧天了
    whatisnew
        10
    whatisnew  
    OP
       2015-05-12 21:59:40 +08:00
    @tabris17 线程缓存 thread_cache_size 跟连接池是不同的概念好嘛
    tabris17
        11
    tabris17  
       2015-05-12 22:04:44 +08:00
    @whatisnew 确实不是等同,但是线程缓存已经节省了新建连接的99%的开销,在客户端使用短连接,完全可以替代连接池的作用
    jamlee
        12
    jamlee  
       2015-05-12 22:35:02 +08:00
    可以考虑下读写分离 减缓服务器压力
    Septembers
        13
    Septembers  
       2015-05-13 03:23:15 +08:00
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2899 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 00:08 · PVG 08:08 · LAX 16:08 · JFK 19:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.