1. 程式人生 > >PHP多程序引發的msyql連線數問題

PHP多程序引發的msyql連線數問題

PHP多程序引發的msyql連線數問題

業務中有一塊採用了PHP的pcntl_fork多程序,希望能提高效率,但是在執行的時候資料庫報錯

PDO::prepare(): Premature end of data (mysqlnd_wireprotocol.c:1244)
Packets out of order. Expected 1 received 108. Packet size=7102829

發現應該是短時間大量的連結寫入資料庫.導致資料庫無法響應

show variables like '%max_connections%';
show variables like '%back_log%';

修改my.ini 配置 back_log
back_log = 104
MySQL能有的連線數量。當主要MySQL執行緒在一個很短時間內得到非常多的連線請求,這就起作用,
然後主執行緒花些時間(儘管很短)檢查連線並且啟動一個新執行緒。back_log值指出在MySQL暫時停止回答新請求之前的短時間內多少個請求可以被存在堆疊中。
如果期望在一個短時間內有很多連線,你需要增加它。也就是說,如果MySQL的連線資料達到max_connections時,新來的請求將會被存在堆疊中,
以等待某一連線釋放資源,該堆疊的數量即back_log,如果等待連線的數量超過back_log,將不被授予連線資源。
另外,這值(back_log)限於您的作業系統對到來的TCP/IP連線的偵聽佇列的大小。
你的作業系統在這個佇列大小上有它自己的限制(可以檢查你的OS文件找出這個變數的最大值),試圖設定back_log高於你的作業系統的限制將是無效的。