我有一个小应用程序,用户可以在HTML表格中拖放任务。
当用户放弃任务时,我调用了一个名为update_task
的javascript函数:
function update_task(user_id, task_id, status_id, text, uiDraggable, el) {
$.get('task_update.php?user_id='+user_id+'&task_id='+task_id+'&status_id='+status_id+'', function(data) {
try {
jsonResult = JSON.parse(data);
} catch (e) {
alert(data);
return;
};
在task_update.php中我得到了我的价值观; user_id
,task_id
& status_id
并执行PDO UPDATE查询,以更新我的数据库。如果查询正确执行,我
echo json_encode ( array (
'success' => true
) );
然后我将任务附加到正确的表格单元格
if(typeof jsonResult.success != 'undefined') {
$(uiDraggable).detach().css({top: 0,left: 0}).appendTo(el);
}
这一切都很好。但是,我开始意识到,当两个或更多人同时进行更改时,这是一个问题。如果我正在使用2个浏览器进行测试,并且例如在两个浏览器上打开了网站:那么,如果我在browser1上移动任务,我将不得不在browser2上手动刷新页面以查看更改。
所以我的问题是;如果对DB表进行了更改,如何自动检测应用程序?如何在不刷新页面的情况下更新HTML表格。
我已经查看了一些更新页面的定时间隔,但这对我不起作用,因为我真的不想强制浏览器刷新。例如,用户也可以在灯箱iframe中创建新任务,因此如果他们的浏览器在尝试创建新任务时刷新,则会对他们造成极大的烦恼。
所以是的,对我来说最好的做法是什么?
答案 0 :(得分:1)
我会使用ajax以合理的间隔检查服务器。什么是合理的取决于你的项目 - 它应该经常足够,它的一端改变不会弄乱另一个用户正在做的事情。
如果您担心资源密集,可以使用APC为活动的所有内容保存上次修改时间 - 这样,当您只是检查是否有任何更改时,您不必访问数据库。 / p>
当事情发生变化时,您也应该使用ajax,并使用javascript / jquery直接在页面中添加更改。
答案 1 :(得分:1)
使用Redis及其publish/subscribe功能在PHP应用程序和轻量级websocket服务器之间实现消息总线(Node.js是一个不错的选择)。
当您的PHP修改数据时,它还会在Redis中发出一些事件,表明某些数据已更改。
当websocket客户端连接到Node.js服务器时,它告诉服务器它想要监视哪些数据,然后,一旦收到Redis事件并且事件的数据与客户端的监视数据匹配,就通知客户端在websocket上,然后刷新页面。
查看this question,并详细解释所有这些问题,包括可以重复使用的示例代码。
答案 2 :(得分:0)
如果您确实需要检查数据库更改 - 请编写数据库触发器。
但如果除了你的代码之外没有人改变它 - 你可以在你的代码中实现一些观察。