2013-09-25 90 views
0

页面确实需要加载速度很快,但数据库速度很慢,所以我们将它分成两个数据库调用,一个更快,一个更慢,第一个更快,我们可以为页面的一部分提供相当的服务可以自己使用。如何在没有mecache的情况下并行请求PHP?

但是,我们希望第二个请求关闭,并且我们知道每当第一个请求关闭时总会有必要做。所以现在页面的第一部分包含一个脚本,它触发http请求,然后我们进行数据库调用并最终加载。

但这是一个串行操作,这意味着页面加载的第一部分需要完成它的数据库,返回http,在浏览器中渲染,运行脚本,请求http然后等待数据库并最终返回给我们整个页。

你如何解决在PHP中解决这个问题?我们没有memcache,我查看了fifo,但是我们也没有posix_mkfifo函数。

我想在第一个请求上做两个数据库调用,服务第一个请求和页面的一部分,让第二个数据库调用继续运行,当它完成时我想将它保存在/ tmp /或缓冲区或任何地方快速的内存 - 当脚本要求它时 - 也许脚本http req需要等待一些,也许它的幸运,并且会从内存中获得它。

但是,在内存中,你是否保存它,跨请求和php实例?不在全局中,不在会话中,不在memcached中。哪里?套接字?我应该叉和管?

编辑:谢谢大家。我去了两个异步HTTP请求路线。

+0

是什么阻止你发起第二个http请求和第一个请求? – Marek

+0

这不会是最有效的,这意味着1个http请求获取触发2个请求的脚本。咩。这将是一个典型的PHP“解决方案”。丑陋的黑客。 – rapadura

+0

你没有太多空间可以搬到这里。首先,即使你可以fork或者线程 - 你仍然会收到一个请求,你不能对这个请求执行两个回复,除非你要求数据两次。如果您决定将快速和慢速数据库处理分成两个请求 - 您现在处于JS的领域(因为没有其他方法可以解决这个问题)。第一个请求呈现页面,第二个请求会对数据库做出魔术般的变化,并且可以等到数据到达时再发送,如果到达的话。这给了你可靠性(你会知道你成功或失败)。基本上,这是Beniamin在他的回答中提出的建议。 –

回答

1

我想你可以使用AJAX。 首次发送带有2个JavaScript AJAX调用的HTML页面,每个页面加载触发一个sql查询。 然后用这些结果加载页面异步。

+0

我有点像这个想法,因为它将问题移到浏览器远离php。但接下来的问题是我将不得不加载三页,第一页非常渺茫,另外两页请求缓慢。 – rapadura

+0

@rapadura我不认为这是一个问题。除非您可以在用户或请求之间重复使用数据,否则使用共享内存或管道不会更快。只要注意会话没有锁定,如果你使用它。 – Marek

1

问题是你的问题是复杂的解决它没有额外的解决方案,如memcache。使用PHP中的Direkt,您可以将短数据保存在SHM中。但那不是最好的解决方案。

最好的解决方案是构建一个更好的数据库结构,以便从数据库中获得更好的结果和更快的响应。

为了获得更好的数据库性能,您可以查看MySQL内存表。但要注意,重新启动后表格将被清除。所以你可以用表格填充缓存数据。

而且您可以使用Ajax一次发送多个请求。

+0

我不能以任何方式改变或影响数据库,oracle人员已经控制了它们,并且他们不会为性能而烦恼。我想看看共享内存,我想到/ tmp /中的fifo或者/ tmp中的文件,但是没有做到,然后我需要分叉它,而我没有pnctl_fork。呸。 – rapadura

相关问题