PHP - 输出缓存 - 关于ob系列函数和flush函数

    偶然机会看到了flush()。知道他的神奇功能可以用在异步传输的comet 模式之后,于是我去试了试这个方法。然后翻手册去看了看什么意思。发现它神奇的和ob类函数在一起。有点好奇,先放一放,来说flush的作用。

    手册上面这样说:

 flush() may not be able to override the buffering scheme   of your web server and it has no effect on any client-side buffering in the   browser.  It also doesn't affect PHP's userspace output buffering mechanism.   This means you will have to call both  ob_flush() and    flush() to flush the ob output buffers if you are using   those.  

     我蹩脚地翻译一下

     flush()函数可能无法覆盖您的Web服务器的缓冲方案,它也不能影响任何客户端浏览器中的缓存。它也不会影响PHP的用户态输出缓冲机制,这意味着,如果你使用ob,你将不得不同时ob_flush()和flush()来刷新OB输出缓冲区。

     好,现在可能暂时并不是很理解这个到底是神马意思,没关系。先来看flush函数。

     访问如下代码

<?php
$i = 0;
for($i;$i<10;$i++){
   echo $i;
   flush();
   sleep(2);
}

我用的firefox访问的,尽然一直转,没有输出,一直运行了二十秒,我擦,不是说直接输出么。 好吧,我又蛋疼了。。然后打开firebug 看下network,继续刷页面,神奇的事情就发生了,居然一刷就有响应,并且响应是一步一步出来的每隔2秒钟多一个数字,看来PHP没坑我们。同时回顾他手册上说的 : 它也不能影响任何客户端浏览器中的缓存。恩,大概也就明白了,firefox也是有一定的缓存机制,没有遇到响应结束符号的时候是不会输出的。同样:函数可能无法覆盖您的Web服务器的缓冲方案。这个也能够明白一点点,也就是如果web服务器存在缓冲区的话应该也是不能够这样响应的。

     OK,flush这个神奇的函数就搞定了。

     突发奇想,不如用ob_flush来试一试行不行。

1 <?php
2 $i = 0;
3 for($i;$i<10;$i++){
4    echo $i;
5    ob_flush();
6    sleep(2);
7 }

     发现屁用没有,直接就输出了。不都是输出缓冲区么。

     继续看一看手册,ob全在那里,确实让人蛋疼。在ob_start里面明确说明了一点:

This function will turn output buffering on. While output buffering is   active no output is sent from the script (other than headers), instead the   output is stored in an internal buffer.  

     翻译一下:

此功能将开启输出缓冲。虽然输出缓冲区是存活的将不会有任何信息从脚本输出,而不是从脚本(标头以外)的输出被存储在内部缓冲器中。

     经过他这么一说貌似好像ob的output buffering好像和那个并不是一个东西。 据我理解,本身php就是用缓冲的,比如无论我们是最开始的时候还是最后的时候echo something,总是到了脚本执行完了之后才会输出。这一点自己求证过。然而这种系统级别的缓冲并不能满足我们的需要,比如蛋疼的生成静态,好了伤心事不提。所以提供了一个ob的函数库来管理,(备注:ob是可以堆栈调用的。也就是嵌套)。当然只是猜想。运行如下代码:

 1 <?php
 2 $i = 0;
 3 ob_start();
 4 for($i;$i<10;$i++){
 5    echo $i;
 6    $content .= ob_get_contents();
 7    ob_flush();
 8    flush();
 9    sleep(2);
10 }
11 echo '<br />';
12 echo $content;

      这样的代码应该就可以说明一些问题了。结果输出前十个数慢慢输出,最后十个脚本执行完成后输出,一次性。结果和预期一样。说明ob和flush不是在一层。显然也就证明了手册上面的:它也不会影响PHP的用户态输出缓冲机制,这意味着,,你将不得不同时ob_flush()和flush()来刷新OB输出缓冲区。如果你只使用了flush,如果你的浏览器返回 重载页面以获取资源的话那么说明你的flush被web server缓存了,也就是说你必须同时使用ob_flush()和flush()才能获取到

转载于:https://www.cnblogs.com/maxmys/p/3327189.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这里是 `evaluate-hand` 函数的实现: ``` (defn evaluate-hand [hand community-cards] (let [all-cards (concat hand community-cards) sorted-cards (sort-by :rank all-cards) flush-suit (->> all-cards (group-by :suit) (sort-by #(count (val %))) last first :suit) straight (some #(apply = (map :rank %)) (partition 5 1 sorted-cards)) straight-flush (and flush-suit straight)] (cond->> {:hand all-cards} straight-flush (assoc :rank :straight-flush) flush-suit (assoc :rank :flush) straight (assoc :rank :straight) :else (let [by-rank (group-by :rank all-cards) counts (map count by-rank) max-count (apply max counts)] (cond->> {:rank :high-card} (= max-count 2) (assoc :rank :pair) (= max-count 3) (assoc :rank :three-of-a-kind) (= max-count 4) (assoc :rank :four-of-a-kind) (and (= max-count 2) (= (count (distinct counts)) 2)) (assoc :rank :two-pair) :else (let [sorted-counts (reverse (sort counts)) kickers (map first (filter #(= (second %) 1) (partition-all 2 sorted-counts)))] (cond (= max-count 1) (assoc :rank :high-card :kickers kickers) (= max-count 3) (assoc :rank :full-house :kickers kickers) :else (assoc :rank :three-of-a-kind :kickers kickers))))))) ``` 该函数接收两个参数,一个是表示手牌的列表 `hand`,一个是表示公共牌的列表 `community-cards`。在该函数中,首先将手牌和公共牌合并成一副牌,并将其按照牌面大小排序。 然后,通过一系列判断,可以判断出当前牌型的大小,并将其保存在一个字典中,其中包括了牌型和可能的“踢牌”(如果有的话)。最终,这个字典会被返回。 这个函数并不是最优的实现方法,但是足以用于简单的德州扑克游戏。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值