Php 有没有标准的方法来更新使用mysql数据库的提要?

Php 有没有标准的方法来更新使用mysql数据库的提要?,php,ios,mysql,xcode,feed,Php,Ios,Mysql,Xcode,Feed,我有一个iOS应用程序,人们可以加入主题和发布内容,所有内容都存储在mysql数据库中。当他们加入一个主题时,有一个帖子提要(如iMessage或WhatsApp),需要在有新帖子时立即更新 我知道的唯一方法是设置一个计时器,每秒钟检查一次,看是否有新帖子。如果我的应用程序越来越大,并且每秒都有大量用户向服务器请求数据,这似乎会使服务器过载。有没有一种更有效或标准的方法来保持feed的最新状态,或者这就是常规应用程序所做的?任何建议都将不胜感激。您不想轮询网络。这对用户的数据使用以及您的系统来说

我有一个iOS应用程序,人们可以加入主题和发布内容,所有内容都存储在mysql数据库中。当他们加入一个主题时,有一个帖子提要(如iMessage或WhatsApp),需要在有新帖子时立即更新


我知道的唯一方法是设置一个计时器,每秒钟检查一次,看是否有新帖子。如果我的应用程序越来越大,并且每秒都有大量用户向服务器请求数据,这似乎会使服务器过载。有没有一种更有效或标准的方法来保持feed的最新状态,或者这就是常规应用程序所做的?任何建议都将不胜感激。

您不想轮询网络。这对用户的数据使用以及您的系统来说都是非常困难的

相反,当用户有新消息时,您希望向他们发出通知

您可能不想为此使用Apple的推送通知服务,因为用户可以禁用应用程序的推送通知,并且:

如果要向同一设备发送多个通知,或 计算机在短时间内,推送服务将发送 只有最后一个

相反,考虑使用不具有这些限制的第三方推送服务,或者创建自己的推送服务。基本上,从客户端与服务器建立TCP连接并等待,或者通过UDP从服务器向客户端发送通知


通常,推送通知中不发送实际数据。相反,您只需告诉客户机从服务器检索数据。

我一直在开发我的应用程序(这是一个自学项目),最后采用了以下解决方案:

检查应尽可能减少开销。我注意到Twitter的支票没有经过认证。如果有新内容等着你,你实际上可以检查任何Twitter用户。为什么不呢,它不会有什么害处

所以我(为自己)创建了一个文件夹:/\uu/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]
响应时间:12毫秒。要用当前用户替换的我自己的名称:-P(@todo:上面的示例将在没有服务器响应或任何其他类型的错误时失败-页面将呈现死区,直到刷新)

在服务器端,新帖子存储在数据库和文件系统中。我正在使用符号链接。每个用户都有一个文件夹。每个帖子都存储为一个单独的json文件。如果用户1和用户2成为朋友,则用户1将获得指向用户2文件夹的符号链接,反之亦然。这样,他们就可以访问彼此的帖子,而无需复制它们。当用户编辑现有帖子时,所有对等方都会立即看到更新版本

我仍在尝试更快的方法:数据库查询或遍历文件系统。但我假设,当应用程序变得更复杂时,连接一些预先格式化的json文件将比一个充满连接的数据库查询、循环结果集等更快

当我关注的人或我的朋友发布新评论或更新,或编辑现有评论或更新时,在发布时会检查哪些用户被符号链接。它将所有这些用户的会话文件夹的index.html更新为“+”

这将触发
servercall()
函数来启动另一个查找新功能的函数

我将上次检查的时间存储在临时文件中:

touch --date "2015-02-15 18:46:59" /tmp/u.1.s
(@todo:session尚未合并-s将成为session id),当我们想要检查新内容时,我们使用先前保存的时间戳来查找任何新的或修改的json文件(可能编辑,将后缀从-published更改为-deleted)。类似这样的东西(这一个我不知道,它可能不起作用-忘记保存它):

将返回自上次检查以来修改的文件(包括符号链接文件!)。我使用“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作为CMS,Apigility作为API,Laravel作为附加功能。所有这些都有它们的开销。尽管我喜欢博尔特、Apigility和Laravel,我还是尽量减少它们的使用。如果可以在不涉及PHP、第三方库和使用Linux&Apache本机功能的情况下实现某些功能,我认为这会增加应用程序的总体灵活性。

非常有趣,信息量也非常丰富。非常感谢。套接字路由的缺点是跟踪服务器上的ip,而且整个过程比ajax路由复杂得多。然而,如果我理解正确的话,它将为用户使用更少的单元数据,并且在服务器上更容易。另一方面,ajax类型的请求可能非常小,可以忽略不计,如果Twitter使用这种方法,我认为这可能是一条出路。不幸的是,我不清楚最好的选择。你能详细说明一下缓存的JSON对象将/可能/应该如何存储吗?它不会存储在数据库中,对吗?每个帐户是否都有一个包含该对象的单独文件?
find /some/path/to/jflamman -mindepth=1 -maxdepth=2 -type f -newer /tmp/u.1.s
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