考虑以下情况:
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资源有效吗?
任何输入都是适当的!
我希望我解释它是可以理解的。如果有什么不清楚,请发表评论,所以我可以改写它!
答案 0 :(得分:3)
As&#34;感谢任何输入&#34;,这是我的:
为了解决你的问题,我想到了这一点:
在两个不同的PHP脚本中分隔do_some_heavy_mysql_stuff
和get_rest_resource
。
使用cURL&#34; multi&#34;能够同时执行请求。请检查:
这样,您可以同时执行这两个脚本。使用cURL多功能,您可以同时拨打http://example.com/do_some_heavy_mysql_stuff.php
和http://example.com/get_rest_resource.php
,然后在结果可用时立即播放。
这是我的第一个想法,Iim与你分享。也许有不同的,更有趣的方法......祝你好运!