考虑以下情形:使用非阻塞流来在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!
我希望我解释它是可以理解的。如果有什么不清楚的地方,请留下评论,所以我可以重新修改!
是否在开始时调用fgets()(作为非阻塞),然后在脚本结尾处以循环方式调用它(作为非阻塞),直到您需要的所有内容都已返回,工作?从PHP文档看来,fgets()(在非阻塞模式下)将返回已经从文件中读取的任何内容,或者如果它仍然从文件中读取,则返回任何内容。因此,在一个循环中做最后应该给你的数据... –