2011-07-29 29 views
2

考虑以下情形:使用非阻塞流来在PHP中并行处理REST-Api请求?

  • http://www.restserver.com/example.php返回一些内容,我想在我的web应用程序的工作。

  • 我不想用ajax(SEO问题等)

  • 我的页面需要100毫秒,产生加载它,剩下的资源也需要被装载100毫秒。

  • 我们开始使用REST资源之前,我们假定我的网站的100ms生成时间是occour。之后会发生什么可以忽略。

示例代码:

我的网站的

的index.php

<? 
do_some_heavy_mysql_stuff(); // takes 100 ms 
get_rest_resource(); // takes 100 ms 
render_html_with_data_from_mysql_and_rest(); // takes neglectable amount of time 
?> 

网站将采取〜200ms的产生。

我想变成这样:

<? 
Restclient::initiate_rest_loading(); // takes 0ms 
do_some_heavy_mysql_stuff(); // takes 100 ms 
Restclient::get_rest_resource(); // takes 0 ms because 100 ms have already passed since initiation 
render_html_with_data_from_mysql_and_rest(); // takes neglectable amount of time 
?> 

网站将采取〜100ms的产生。

要既成事实这个我想过用这样的事情:

(我敢肯定此代码将无法工作,因为这个问题是所有关于询问如何做到这一点,无论是它的可能,我只是想一些。天真的代码可以表现出最好的话)

class Restclient { 
    public static $buffer; 
    public static function initiate_rest_loading() { 
     // open resource 
     $handle = fopen ("http://www.restserver.com/example.php", "r"); 
     // set to non blocking so fgets will return immediately 
     stream_set_blocking($handle,0); 
     // initate loading, but return immediately to continue website generation 
     fgets($handle, 40960); 
    } 
    public static function get_rest_resource() { 
     // set stream to blocking again because now we really want the data 
     stream_set_blocking($handle,1); 
     // get the data and save it so templates can work with it 
     self::$buffer = fgets($handle, 40960); templates 
    } 
} 

那么最后一个问题:

  • 这是可能的,如何?

  • 我有什么要留意(内部缓冲区溢出,流长度等)

  • 有没有更好的方法呢?

  • 这是否适用于http资源?

  • 任何输入appriciated!

我希望我解释它是可以理解的。如果有什么不清楚的地方,请留下评论,所以我可以重新修改!

+0

是否在开始时调用fgets()(作为非阻塞),然后在脚本结尾处以循环方式调用它(作为非阻塞),直到您需要的所有内容都已返回,工作?从PHP文档看来,fgets()(在非阻塞模式下)将返回已经从文件中读取的任何内容,或者如果它仍然从文件中读取,则返回任何内容。因此,在一个循环中做最后应该给你的数据... –

回答

3

为“任何输入赞赏”,这里是我的:

  • 你想叫什么异步(你想要的东西,而别的东西正在做“后台”)。在两个不同的PHP脚本

    1. 独立do_some_heavy_mysql_stuffget_rest_resource

为了解决你的问题,我想这一点。

  • 使用cURL“多”能力来执行同时请求。请检查:

  • 这样一来,就可以在同一时间执行两个脚本。使用cURL多功能,您可以同时拨打http://example.com/do_some_heavy_mysql_stuff.phphttp://example.com/get_rest_resource.php,然后在结果可用时立即播放。

    这些是我的第一想法,Iim与你分享。也许有不同和更有趣的方法...祝你好运!

    +0

    看起来像我想要的确切! +1。我只需要弄清楚在请求运行时我是否可以处理“其他”php代码,但是应该从我迄今为止看到的实例中找到。因为它们会循环访问。所以我可以在请求运行时执行内部的“heavy_mysql_stuff”。 –