有很多软件在没有接入网络的情况下也可以运行,等到有网络时,会进行数据同步。这样在多个客户端间可以无缝所有。
典型代表:有道云笔记、挖财记账本
目前,我使用php开发一款软件的服务端,软件提供网页版和客户端。在离线状态下,客户端主要功能也是可以使用的。
现在采用的方案是:
用C语言写了一个php的扩展,用于生成唯一int64值
。
需要同步的数据表,都添加了一个字段modify_num,存放唯一int64值,对数据记录进行增删改时,都改变modify_num。
客户端定时执行同步操作,每次同步包含2个原子操作:先是客户端给服务端自己最大的modify_num,服务端把大于该modify_num的数据都返回给客户端,简称为update
;然后客户端处理完数据后,把客户端需要进行增删改的数据发送给服务端,服务端进行处理,简称为commit
。
补充:
1.为什么modify_num不直接使用时间戳,而是唯一数值:
我们没有直接采用时间戳是有原因的:操作时间间隔太短的时候,产生的时间戳会是相同的数值。如果不唯一会有这样的情况发生,在update时服务端返回了多条modify_num相同的数据给客户端,客户端每处理一条就修改自己的最大modify_num,万一客户端以为外因崩溃,多条数据没有处理完,下次启动时发送的最大modify_num给服务端,那么服务端返回的是大于这个值的数据,意味着那几条因为崩溃没有处理的数据都没有拿到。采用唯一数值就是为了避免这种情况发生。
2.关于冲突处理:
毕竟我们面对的是普通用户,不是程序员,不会像版本管理工具一样,有合并冲突的功能,冲突我们有自己的一套简单机制。基本原则是以modify_num大的优先,以最后操作优先。
大家有没有更好的方案或者有什么想法,都可以说说
回复内容:
有很多软件在没有接入网络的情况下也可以运行,等到有网络时,会进行数据同步。这样在多个客户端间可以无缝所有。
典型代表:有道云笔记、挖财记账本
目前,我使用php开发一款软件的服务端,软件提供网页版和客户端。在离线状态下,客户端主要功能也是可以使用的。
现在采用的方案是:
用C语言写了一个php的扩展,用于生成唯一int64值
。
需要同步的数据表,都添加了一个字段modify_num,存放唯一int64值,对数据记录进行增删改时,都改变modify_num。
客户端定时执行同步操作,每次同步包含2个原子操作:先是客户端给服务端自己最大的modify_num,服务端把大于该modify_num的数据都返回给客户端,简称为update
;然后客户端处理完数据后,把客户端需要进行增删改的数据发送给服务端,服务端进行处理,简称为commit
。
补充:
1.为什么modify_num不直接使用时间戳,而是唯一数值:
我们没有直接采用时间戳是有原因的:操作时间间隔太短的时候,产生的时间戳会是相同的数值。如果不唯一会有这样的情况发生,在update时服务端返回了多条modify_num相同的数据给客户端,客户端每处理一条就修改自己的最大modify_num,万一客户端以为外因崩溃,多条数据没有处理完,下次启动时发送的最大modify_num给服务端,那么服务端返回的是大于这个值的数据,意味着那几条因为崩溃没有处理的数据都没有拿到。采用唯一数值就是为了避免这种情况发生。
2.关于冲突处理:
毕竟我们面对的是普通用户,不是程序员,不会像版本管理工具一样,有合并冲突的功能,冲突我们有自己的一套简单机制。基本原则是以modify_num大的优先,以最后操作优先。
大家有没有更好的方案或者有什么想法,都可以说说
modify_num
干脆改成last_modify
比较直观,内容就是最后一次修改时间戳,这样同步的时候带上上次同步完的时间戳,服务器把上次同步之后所有更改发回。
两边都维护了一个num,冲突解决如何处理?
如果最初版本值为0,在网页端和离线客户端编辑,
同步时,服务器端和客户端的版本值都为1;
这就是涉及到冲突问题的解决,你说客户端先把大于
1的值更新,这时候服务器的值也是1,但是内容是变化了的;
可以考虑使用类似数据库的redo日志;
服务器和客户端数据修改前都记录日志(含精确的时间戳);
在客户端联网后,先将客户端离线期间的日志发送到服务器端,
服务器端按时间点插入日志(客户端服务端日志合并),redo日志;
然后,将数据同步到客户端;
应该参考git软件内部的实现,有冲突的时候分为可以自动合并和不可以自动合并
merge对于普通用户门槛太高 让用户选择一个版本基本就够了 其实最简单的方法就是让用户接受开机自启动 不知不觉完成同步,。,

PHPSession失效的原因包括配置错误、Cookie问题和Session过期。1.配置错误:检查并设置正确的session.save_path。2.Cookie问题:确保Cookie设置正确。3.Session过期:调整session.gc_maxlifetime值以延长会话时间。

在PHP中调试会话问题的方法包括:1.检查会话是否正确启动;2.验证会话ID的传递;3.检查会话数据的存储和读取;4.查看服务器配置。通过输出会话ID和数据、查看会话文件内容等方法,可以有效诊断和解决会话相关的问题。

多次调用session_start()会导致警告信息和可能的数据覆盖。1)PHP会发出警告,提示session已启动。2)可能导致session数据意外覆盖。3)使用session_status()检查session状态,避免重复调用。

在PHP中配置会话生命周期可以通过设置session.gc_maxlifetime和session.cookie_lifetime来实现。1)session.gc_maxlifetime控制服务器端会话数据的存活时间,2)session.cookie_lifetime控制客户端cookie的生命周期,设置为0时cookie在浏览器关闭时过期。

使用数据库存储会话的主要优势包括持久性、可扩展性和安全性。1.持久性:即使服务器重启,会话数据也能保持不变。2.可扩展性:适用于分布式系统,确保会话数据在多服务器间同步。3.安全性:数据库提供加密存储,保护敏感信息。

在PHP中实现自定义会话处理可以通过实现SessionHandlerInterface接口来完成。具体步骤包括:1)创建实现SessionHandlerInterface的类,如CustomSessionHandler;2)重写接口中的方法(如open,close,read,write,destroy,gc)来定义会话数据的生命周期和存储方式;3)在PHP脚本中注册自定义会话处理器并启动会话。这样可以将数据存储在MySQL、Redis等介质中,提升性能、安全性和可扩展性。

SessionID是网络应用程序中用来跟踪用户会话状态的机制。1.它是一个随机生成的字符串,用于在用户与服务器之间的多次交互中保持用户的身份信息。2.服务器生成并通过cookie或URL参数发送给客户端,帮助在用户的多次请求中识别和关联这些请求。3.生成通常使用随机算法保证唯一性和不可预测性。4.在实际开发中,可以使用内存数据库如Redis来存储session数据,提升性能和安全性。

在无状态环境如API中管理会话可以通过使用JWT或cookies来实现。1.JWT适合无状态和可扩展性,但大数据时体积大。2.Cookies更传统且易实现,但需谨慎配置以确保安全性。


热AI工具

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

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

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

DVWA
Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

记事本++7.3.1
好用且免费的代码编辑器

VSCode Windows 64位 下载
微软推出的免费、功能强大的一款IDE编辑器