bitscn.com
前面讲过一篇《实现一个简单的服务端推送方案-实例篇polling(服务端阻塞读)》,那篇文章服务端利用gearman队列来实现阻塞读,这篇服务器端用原生mysql的sleep函数来实现阻塞读,这篇文章也是另一篇文章《使用mysql构建一个队列表》的实例实现。
客户端代码,js库为prototype.js:
无标题文档
服务器端代码,backend.php,在这里当读不到新数据时,就调用带注释的sleep函数来阻塞,阻塞直到超时或线程被kill
.maxvid: .$maxvid./n, 3 , /usr/local/apache2219/logs/php_log);$dblnk = mysql_connect('localhost:3306', 'root', 'cpyf');mysql_select_db('test', $dblnk);if ( $maxvid .maxvid: .$maxvid./n, 3 , /usr/local/apache2219/logs/php_log);}while (1){ $result = mysql_query(select * from vdooropen where vid > $maxvid order by vid limit 1); $num = mysql_num_rows($result); if ( $num > 0 ) break; mysql_query(/*!999999 wait queue msg */ select sleep(300)); if ( mysql_errno() != 0 ) { mysql_close($dblnk); //必须先关闭 $dblnk = mysql_connect('localhost:3306', 'root', 'cpyf'); mysql_select_db('test', $dblnk); }}$result = mysql_fetch_row($result);// 返回 json 数组$response = array();$response['vid'] = $result[0];$response['msg'] = $result[0].,.$result[1].,.$result[2].,.$result[3].,.$result[4];$responsetext = json_encode($response);error_log(date([y-m-d h:i:s]).
当新增加数据后,通过show processlist找到带注释的sleep线程,并kill掉,阻塞就会退出。增加数据代码如下:
bitscn.com