使用非阻塞流来并行化PHP中的REST-Api请求?

时间:2011-07-29 12:30:16

标签: php api http rest stream

考虑以下情况:

  • http://www.restserver.com/example.php会在我的网络应用程序中返回一些我想要使用的内容。

  • 我不想使用ajax(SEO问题等)加载它。

  • 我的页面生成需要100ms,REST资源也需要100ms才能加载。

  • 我们假设在开始使用REST资源之前,我网站的100ms生成时间出现了。之后发生的事情可以忽略不计。

示例代码:

我网站的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
?>

网站将需要约200毫秒来生成。

我想把它变成:

<?
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
?>

网站将需要约100毫秒才能生成。

为了完成这一点,我想到了使用这样的东西:

(我很确定这段代码不起作用,因为这个问题都是关于如何实现这一点,以及它是否可能。我只是想一些天真的代码可以最好地证明它)

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资源有效吗?

  • 任何输入都是适当的!

我希望我解释它是可以理解的。如果有什么不清楚,请发表评论,所以我可以改写它!

1 个答案:

答案 0 :(得分:3)

As&#34;感谢任何输入&#34;,这是我的:

  • 你想要的是什么称为异步(你希望在完成其他事情的时候做点什么&#34;在后台&#34;)。

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

  1. 在两个不同的PHP脚本中分隔do_some_heavy_mysql_stuffget_rest_resource

  2. 使用cURL&#34; multi&#34;能够同时执行请求。请检查:

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

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