bitsCN.com
前面讲过一篇《实现一个简单的服务端推送方案-实例篇Polling(服务端阻塞读)》,那篇文章服务端利用Gearman队列来实现阻塞读,这篇服务器端用原生MySQL的Sleep函数来实现阻塞读,这篇文章也是另一篇文章《使用MySQL构建一个队列表》的实例实现。
客户端代码,JS库为prototype.js:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312" /><title>无标题文档</title><script language="JavaScript" type="text/javascript" src="./prototype.js"></script></head><body><script language="JavaScript"> var Class = { create: function() { return function() { this.initialize.apply(this, arguments); } } } var Comet = Class.create(); Comet.prototype = { maxvid: 0, url: './backend.php', noerror: true, initialize: function(){ }, connect: function(){ this.ajax = new Ajax.Request(this.url, { method: 'get', parameters: { 'maxvid': this.maxvid }, onSuccess: function(transport){ var response = transport.responseText.evalJSON(); this.comet.maxvid = response['vid']; this.comet.handleResponse(response); this.comet.noerror = true; }, onComplete: function(transport){ if (!this.comet.noerror) setTimeout(function(){ comet.connect() }, 5000); else this.comet.connect(); this.comet.noerror = false; } }); this.ajax.comet = this; }, handleResponse: function(response){ $('content').innerHTML += '<p>' + response['msg'] + '</p>'; } } var comet = new Comet(); comet.connect();</script><p id="content"></p></body></html>
服务器端代码,backend.php,在这里当读不到新数据时,就调用"带注释的Sleep函数"来阻塞,阻塞直到超时或线程被KILL
<?phpheader("Cache-Control: no-cache, must-revalidate");header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");flush();//控制浏览器前端不要缓存结果,每次都要重新查询$maxvid = $_GET["maxvid"];//$maxvid = -1;error_log(date("[Y-m-d H:i:s]")." > "."maxvid: ".$maxvid."/n", 3 , "/usr/local/apache2219/logs/php_log");$dblnk = mysql_connect('localhost:3306', 'root', 'cpyf');mysql_select_db('test', $dblnk);if ( $maxvid <= 0 ) { $result = mysql_query("select max(vid) from vdooropen"); $result = mysql_fetch_row($result); $maxvid = $result[0]; error_log(date("[Y-m-d H:i:s]")." > "."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]")." < ".$responseText."/n", 3 , "/usr/local/apache2219/logs/php_log");echo $responseText;flush();?>
当新增加数据后,通过show processlist找到带注释的Sleep线程,并KILL掉,阻塞就会退出。增加数据代码如下:
<?php$dblnk = mysql_connect('localhost:3306', 'root', 'cpyf');mysql_select_db('test', $dblnk);mysql_query('insert into vdooropen values(0, 2001, "0863030900020185","20130510-115152","D")');mysql_query('insert into vdooropen values(0, 2001, "0863030900020185","20130510-115152","D")');mysql_query('insert into vdooropen values(0, 2001, "0863030900020185","20130510-115152","D")');mysql_query('insert into vdooropen values(0, 2001, "0863030900020185","20130510-115152","D")');mysql_query('insert into vdooropen values(0, 2001, "0863030900020185","20130510-115152","D")');$result = mysql_query("SHOW PROCESSLIST");$num = mysql_num_rows($result);for ($i = 0; $i < $num; $i++) { $row = mysql_fetch_row($result); if ( strstr($row[7], "wait queue msg") != NULL ) { echo "KILL ".$row[0] . "/n"; mysql_query("KILL ".$row[0]); }}?>

MySQL是一种开源的关系型数据库管理系统,主要用于快速、可靠地存储和检索数据。其工作原理包括客户端请求、查询解析、执行查询和返回结果。使用示例包括创建表、插入和查询数据,以及高级功能如JOIN操作。常见错误涉及SQL语法、数据类型和权限问题,优化建议包括使用索引、优化查询和分表分区。

MySQL是一个开源的关系型数据库管理系统,适用于数据存储、管理、查询和安全。1.它支持多种操作系统,广泛应用于Web应用等领域。2.通过客户端-服务器架构和不同存储引擎,MySQL高效处理数据。3.基本用法包括创建数据库和表,插入、查询和更新数据。4.高级用法涉及复杂查询和存储过程。5.常见错误可通过EXPLAIN语句调试。6.性能优化包括合理使用索引和优化查询语句。

选择MySQL的原因是其性能、可靠性、易用性和社区支持。1.MySQL提供高效的数据存储和检索功能,支持多种数据类型和高级查询操作。2.采用客户端-服务器架构和多种存储引擎,支持事务和查询优化。3.易于使用,支持多种操作系统和编程语言。4.拥有强大的社区支持,提供丰富的资源和解决方案。

InnoDB的锁机制包括共享锁、排他锁、意向锁、记录锁、间隙锁和下一个键锁。1.共享锁允许事务读取数据而不阻止其他事务读取。2.排他锁阻止其他事务读取和修改数据。3.意向锁优化锁效率。4.记录锁锁定索引记录。5.间隙锁锁定索引记录间隙。6.下一个键锁是记录锁和间隙锁的组合,确保数据一致性。

MySQL查询性能不佳的原因主要包括没有使用索引、查询优化器选择错误的执行计划、表设计不合理、数据量过大和锁竞争。 1.没有索引导致查询缓慢,添加索引后可显着提升性能。 2.使用EXPLAIN命令可以分析查询计划,找出优化器错误。 3.重构表结构和优化JOIN条件可改善表设计问题。 4.数据量大时,采用分区和分表策略。 5.高并发环境下,优化事务和锁策略可减少锁竞争。

在数据库优化中,应根据查询需求选择索引策略:1.当查询涉及多个列且条件顺序固定时,使用复合索引;2.当查询涉及多个列但条件顺序不固定时,使用多个单列索引。复合索引适用于优化多列查询,单列索引则适合单列查询。

要优化MySQL慢查询,需使用slowquerylog和performance_schema:1.启用slowquerylog并设置阈值,记录慢查询;2.利用performance_schema分析查询执行细节,找出性能瓶颈并优化。

MySQL和SQL是开发者必备技能。1.MySQL是开源的关系型数据库管理系统,SQL是用于管理和操作数据库的标准语言。2.MySQL通过高效的数据存储和检索功能支持多种存储引擎,SQL通过简单语句完成复杂数据操作。3.使用示例包括基本查询和高级查询,如按条件过滤和排序。4.常见错误包括语法错误和性能问题,可通过检查SQL语句和使用EXPLAIN命令优化。5.性能优化技巧包括使用索引、避免全表扫描、优化JOIN操作和提升代码可读性。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

ZendStudio 13.5.1 Mac
功能强大的PHP集成开发环境

Atom编辑器mac版下载
最流行的的开源编辑器

Dreamweaver CS6
视觉化网页开发工具

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。