我有一个iOS应用程序,人们可以加入主题和发布内容,所有内容都存储在mysql数据库中。当他们加入一个主题时,会有一个帖子(比如iMessage或WhatsApp),只要有新帖子就需要更新。
我知道这样做的唯一方法是设置一个计时器并检查每一秒以查看是否有新帖子。如果我的应用程序变大,并且每天都有大量用户从服务器请求数据,这似乎可能会使服务器超载。是否有一种更有效或标准的方式来保持饲料更新或这是常规应用程序正在做什么?任何建议都表示赞赏。
答案 0 :(得分:0)
您不想轮询网络。这对用户的数据使用以及系统非常困难。
相反,您希望在用户收到新邮件时将通知推送给用户。
您可能不想使用Apple的推送通知服务,因为用户可以停用您应用的推送通知,Apple says this:
如果要向同一设备发送多个通知或 计算机在短时间内,推送服务将发送 只有最后一个。
相反,请考虑使用没有这些限制的第三方推送服务,或创建自己的限制。基本上,从客户端建立到服务器的TCP连接并等待,或者通过UDP从服务器向客户端发送通知。
通常,您不会在推送通知中发送实际数据。相反,您只需告诉客户端从服务器检索数据。
答案 1 :(得分:0)
我一直致力于我的应用程序(这是一个自学项目),最终得到了以下解决方案:
检查应尽可能减少开销。我注意到Twitter的支票未经过身份验证。如果有新内容等待它们,您实际上可以检查任何Twitter用户。为什么不,它不会造成伤害。
所以我为自己创建了一个文件夹:/ _ / changed / jflamman。在该文件夹中,每个正在运行的会话都有几个文件夹(多个设备在检查时表示不同的会话和不同的结果)。
.htaccess检查用户名是否为现有目录,如果会话有效,然后使用当前会话的index.html进行响应:
RewriteEngine On
#apply only to /_/changed/<username>/
RewriteCond %{REQUEST_URI} ^/_/changed/([a-zA-Z0-9]+)/$ [NC]
#get session id to check against current session only
RewriteCond %{HTTP_COOKIE} (PHPSESSID=)([^;]+) [NC]
#make sure folder /_/changed/<username>/<PHPSESSID>/ exists
RewriteCond %{REQUEST_FILENAME}%2/ -d
#rewrite to /_/changed/<username>/<PHPSESSID>/index.html
RewriteRule ^([a-zA-Z0-9]+)/$ /_/changed/$1/%2/index.html [L]
这要么返回'+'(是的,有新活动),' - '(没有新活动)或'x'(用户/会话不存在 - 某些脚本开玩笑试图破解? );
注意:不要为真实的公共场所复制/粘贴上面的内容 - 它包含一个主要的安全风险。必须使用正则表达式验证PHPSESSID。如果有人会更改PHPSESSID cookie,比如'../../../etc/passwd',根据您服务器的设置,这可能会变成灾难。这项工作正在进行中。
在客户端,一个简单的ajax调用每10秒检查一次(它还没有做任何其他事情)
function servercall() {
$.ajax({
url: '/_/changed/jflamman/',
success: function(data) {
console.log(data);
setTimeout(servercall, 10000);
}
});
}
响应时间:12毫秒。我自己的名字将被当前用户替换:-P(@todo:上面的示例将在没有服务器响应或任何其他类型的错误时失败 - 页面将刷新,直到刷新为止)
在服务器端,新帖子存储在数据库和文件系统中。我正在使用符号链接。每个用户都有一个文件夹。每个帖子都存储为单独的json文件。如果用户1&amp;用户2成为朋友,用户1获得用户2的文件夹的符号链接,反之亦然。这样他们就可以访问彼此的帖子而无需复制它们,当用户编辑现有帖子时,所有同伴都会立即看到更新后的版本。
我还在尝试更快的事情:数据库查询或遍历文件系统。但我认为当应用程序变得更复杂时,连接一些预先格式化的json文件将比充满连接的数据库查询,循环遍历结果集等更快。
当我关注的人或谁是我的朋友,发布新评论或更新,或编辑现有评论时,在发布时检查哪些用户符号链接。它将所有这些用户的会话文件夹'index.html更新为“+”。
这将触发servercall()
函数启动另一个函数,找出新的函数。
我将最后一次检查时间存储在临时文件中:
touch --date "2015-02-15 18:46:59" /tmp/u.1.s
(@ todo:会话尚未合并 - 's'将成为会话ID)当我们想要检查新内容时,我们使用先前保存的时间戳来查找任何新的或修改过的json文件(可能编辑,后缀从-published更改为-deleted)。有点像(这个是我的头顶,它可能无法正常工作 - 忘了保存它):
find /some/path/to/jflamman -mindepth=1 -maxdepth=2 -type f -newer /tmp/u.1.s
将返回自上次检查后修改的文件(包括符号链接文件!)。我使用“cat”将各个帖子连接到一个有效的json响应对象。此示例返回按日期排序的所有个人帖子(每个json对象存储在带有逗号的尾随逗号的文件系统中 - 文件名以时间戳开头)并创建个人时间轴的“缓存”版本:
echo '{"status": [' > ~/domains/some/public/folder/jflamman.json && find . .* -type f -exec cat {} + | sort -u | sed 's/^\(.*\),$/\1/'>> ~/domains/some/public/folder/jflamman.json && echo ']}' >> ~/domains/some/public/folder/jflamman.json
我现在只是将它存储在公共文件夹中以查看输出。在现实生活中,这不会存储在公共文件夹中。
当然,当这一切都失败时,新的数据库查询将成为后备。
我的主要观点/总结:我的应用程序使用第三方库和中间件。例如Bolt as CMS,Apigility as API和Laravel以获得其他功能。所有这些都有他们的开销。即使我喜欢Bolt,Apigility&amp; Laravel我尽量减少使用它们。如果可以在不涉及PHP,第三方库和使用Linux&amp;相反,Apache本机功能可以增加应用程序的整体灵活性。