最新公告
  • 欢迎您光临波比源码,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入我们
  • 使用static来避免“重复读”

    在较复杂的web程序开发中,由于采用面向对象的数据操作方式,或者业务逻辑太过复杂,开发人员在开发过程中,经常会无意识的重复读取数据。
    比如:
    $result1 = tableobjectPeer::getResult($var1,$var2,$var3);
    开发人员在需要的该table数据的时候,经常直接调用 tableobjectPeer::getResult方法。
    又或者程序在进行forward的时候,也会导致重复调用  tableobjectPeer::getResult 方法,导致“重复读”。

    要避免类似的“重复读”,最主要的办法是,开发人员在代码开发的时候,就要有“避免重复读”的意识。
    其实只要在:
    $result1 = tableobjectPeer::getResult($var1,$var2,$var3);
    之后,需要的地方进行
    $result2 = $result1;
    $result3 = $result1;
    即可。这样子就可以避免掉大量的“重复读”了。
    但是如果开放人员一开始没有这样做,那要进行这方面的重构可能是很大的工作量。
    另外,由于框架中的forward()也容易造成“重复读”。如果“重复读”是forward()造成的,那该方法就不可行了(这点也许和不同的开发语言,不同的开发框架有关,在php的symfony框架中是如此)。

    因此,在采用上面的方法进行优化的同时,对于一些较复杂的情况,决定采用另一种方式:使用static,设置变量为静态变量,来避免重复读取数据

    以下为引用的内容:
    <?php
    //要改写的函数也请加上$is_static=1变量,用来控制是否开启 static。
    function staticFunc ($var1,$var2,$var3,$is_static=1)
    {
    if ( $is_static == 1 )//默认需要缓存函数结果
    {
    static $result_array;//该数组用来保存函数的结果,支持不同参数的结果缓存
    $vars_string = serialize( func_get_args() );

    if ( empty( $result_array ) )//第一次运行需要初始化
    {
    $result_array = array();
    }

    if ( array_key_exists( $vars_string, $result_array ) )//参数已经存在
    {
    return $result_array[$vars_string];//返回静态变量中已经保存的结果
    }else//参数不存在
    {
    $result_array[$vars_string] = ”;//后面会把结果补充进来
    }
    }else//不利用static 缓冲结果
    {
    if ( empty( $result_array ) )
    {
    $result_array = array();
    }
    }

    $result_array[$vars_string] = rand();//获取结果,请把获取的代码放在此处即可
    return $result_array[$vars_string];
    }

    echo staticFunc(1,2,3);
    echo "<br>";
    echo staticFunc(2,2,2);
    echo "<br>";
    echo staticFunc(1,2,3);
    echo "<br>";
    echo staticFunc(2,2,2);
    echo "<br>";
    echo staticFunc(3,3,3);
    echo "<br>";
    echo staticFunc(3,3,3,0);
    echo "<br>";
    ?>

    运行上述代码,产生的结果类似:
    16667
    8888
    16667
    8888
    2193
    1014
    可以看出,第1行和第3行的结果一致,第2行和第4行的结果一致,说明只要函数的参数相同,函数结果就进行了有效的“cache”。
    从第4行和第5行,可以看出,通过设置$is_static变量能有效控制是否开启“cache”。

    补充:上述使用static方法,可以有效的避免在一个线程内,重复读取数据,但是该cache只存在一个线程内,不同线程是相互独立的。虽然只是线程内的函数结果“cache”,但是其原理和其他方式的cache是类似的,就是要针对不同的参数(不同的情况)构造出cache的key。

    转自:http://www.cnblogs.com/rethink/

    波比源码 – 精品源码模版分享 | www.bobi11.com
    1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
    2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
    3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
    4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
    5. 如有链接无法下载、失效或广告,请联系管理员处理!
    6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
    7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!

    波比源码 » 使用static来避免“重复读”

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    波比源码
    一个高级程序员模板开发平台
    升级波友尊享更多特权立即升级