php如何设置静态内容缓存时间(php文件缓存)

php如何设置静态内容缓存时间,php文件缓存内容导航:PHP中的输出缓冲控制关于php如何实现静态缓存问题如下如何解决WordPress403ForbiddenError错误如何设置JSCSS图片等

php如何设置静态内容缓存时间,php文件缓存

内容导航:

  • PHP中的输出缓冲控制
  • 关于php如何实现静态缓存问题如下
  • 如何解决 WordPress 403 Forbidden Error 错误
  • 如何设置JS CSS 图片等静态资源的缓存过期时间
  • 一、PHP中的输出缓冲控制

    在 PHP 中,我们直接进行 echo 、 或者 print_r
    的时候,输出的内容就会直接打印出来。但是,在某些情况下,我们并不想直接打印,这个时候就可以使用输出缓冲控制来进行输出打印的控制。当然,这一套功能并不仅限出针对打印的内容,我们还可以做其它一些操作,这个我们放到最后再说。

    清除输出

    首先,我们先来看看不让 echo 之类的内容打印输出。

    ob_start();echo111,PHP_EOL;echoaaaa,PHP_EOL;ob_end_clean();
    

    相信有不少小伙伴应该见过 ob_start() 这个函数,它的作用就是开始一段输出缓冲控制。在 ob_start()
    之后的代码中的输出语句都会进入输出缓冲区,这个时候,如果我们调用了 ob_end_clean() 、 ob_clean() 或者
    ob_get_clean() ,则不会有任何输出了。它们三个的作用都是清除输出缓冲区的内容。具体的区别大家可以参考文章最后给出的函数说明或者官方文档。

    获得输出缓冲区的内容

    ob_start();echo111,PHP_EOL;echoaaaa,PHP_EOL;$v=ob_get_contents();ob_end_clean();echo$v;
    

    上面说过,使用了 ob_end_clean() 就会清除输出缓冲区里面的内容,但是在这段代码中,我们使用 ob_get_contents()
    函数直接将缓冲区的内容赋值给了变量 \$v 。这时候,$v 中就有了前面两段 echo
    中的内容,也就是说,这个一套操作我们就拿到了本身应该输出的内容,并将它保存在了变量中。这样做有什么用呢?我们可以获得类似于 phpinfo() 、
    var_dump() 这些直接输出函数的内容了,并且不会打印在客户端屏幕上。比如:

    ob_start();php_info();$v=ob_get_contents();ob_end_clean();echo$v;
    

    在 $v 中的内容就是 php_info() 的内容了。这就是输出缓冲控制的第二个能力。

    刷新(输出)缓冲区内容

    ob_start();echo111,PHP_EOL;echoaaaa,PHP_EOL;flush();ob_flush();
    

    类似的,我们在缓冲区中想要再次直接输出内容,使用 flush() 、ob_flush() 、 ob_end_flush() 及 ob_get_flush()
    就可以了,其实就是相当于让 ob_start() 之后的 echo 这类输出语句重新生效并正常输出。

    另外,我们还可以使用一个函数进行自动的刷新。

    ob_implicit_flush();ob_start();echo111,PHP_EOL;echoaaaa,PHP_EOL;
    

    使用 ob_implicit_flush() 之后,我们就不需要手动地调用 ob_flush() 之类的函数来刷新缓冲区内容了。

    一些检测函数

    ob_start();ob_start();echo123,PHP_EOL;echoob_get_length(),PHP_EOL;//3echoob_get_level(),PHP_EOL;//2print_r(ob_get_status(true));//Array//(//[0]=>Array//(//[name]=>defaultoutputhandler//[type]=>0//[flags]=>112//[level]=>0//[chunk_size]=>0//[buffer_size]=>//[buffer_used]=>0//)//[1]=>Array//(//[name]=>defaultoutputhandler//[type]=>0//[flags]=>112//[level]=>1//[chunk_size]=>0//[buffer_size]=>//[buffer_used]=>17//)//)ob_get_flush();
    

    ob_get_length() 会返回当前缓冲区里面内容的长度,这里我们只打印了一个 123 ,在缓冲区中保存了3个字符,所以输出的正是 3
    。ob_get_level() 返回的是当前缓冲区的层级,请注意,我们在上面调用了两次 ob_start()
    ,也就是有两层的缓冲区,这个缓冲区是可以嵌套的。ob_get_status() 函数是缓冲区的状态信息,字段的说明可以查看官方文档,这里不再赘述。

    使用 ob_start() 的回调函数来进行输出缓冲区的内容替换

    这是一个例子,但是可以推广到其他很功能,比如我们可以用来进行全局的输出过滤、可以做 CSS 或 JS 文件的压缩优化等等。

    ob_start(function($text){return(str_replace(apples,oranges,$text));});echoIt'slikecomparingapplestooranges,PHP_EOL;ob_get_flush();//It'slikecomparingorangestooranges
    

    最后的输出结果就是将 apples 内容替换成了 oranges 内容。

    添加 URL 重写器

    output_add_rewrite_var('var','value');//somelinksecho'<ahref=>link</a><ahref=>link2</a>';//<ahref=?var=value>link</a>//<ahref=>link2</a>//aformecho'<formaction==post><inputtype=textname=var2/></form>';//<formaction==post>//<inputtype=hiddenname=varvalue=value/>//<inputtype=textname=var2/>//</form>
    

    上面的代码看出什么端倪了嘛?没错,使用 output_add_rewrite_var() 函数,我们可以在 PHP 输出的时候为 HTML
    的链接或者表单代码增加一个参数。有没有想到什么使用场景?POST 表单的 CSRF 攻击的防范。

    这个函数会根据 文件中的 url_ 配置项来进行添加,在默认情况下这个配置项只支持 from 表单,同时,它还可以支持 a 标签的href 、
    area标签的href 、 frame标签的src 、 input标签的src
    等等。也就是说,会在这些标签相对应的属性中自动添加字段。当然,它也有一个反函数 output_reset_rewrite_vars()
    用于取消之前增加的这个参数。

    总结

    关于输出缓冲控制这块还有很多好玩的东西,不过限于篇幅我们先介绍到这里,将来踫到什么好的功能的应用我们再单独讲解。现在基于 Swoole
    的应用越来越多,当我们需要将 TP 、 Laravel 这类传统框架转换成支持 Swoole
    的时候,往往就需要在入口文件使用输出缓冲控制来进行修改。因为传统框架基本都是直接进行 echo 之类的输出的,而在 Swoole 中,echo
    这类的内容是直接打印在控制台的,这就需要我们通过 ob_get_contents() 能力获得全部的输出再通过 response->end()
    来进行实际的响应。另外,还有一些其他的场景也会用到输出缓冲控制:

    • 1.在PHP中,像header(), session_start(), setcookie() 等这样的发送头文件的函数前,不能有任何的输出,而利用输出缓冲控制函数可以在这些函数前进行输出而不报错
    • 2.对输出的内容进行处理,例如生成静态缓存文件、进行gzip压缩输出,这算是较常用的功能了
    • 3.捕获一些不可获取的函数输出,例如phpinfo(), var_dump() 等等,这些函数都会将运算结果显示在浏览器中,而如果我们想对这些结果进行处理,则用输出缓冲控制函数是个不错的方法。说的通俗点,就是这类函数都不会有返回值,而要获取这些函数的输出数据,就要用到输出缓冲控制函数
    • 4.对一些数据进行实时的输出

    最后,再给出输出缓冲控制相关的函数说明,具体内容大家还是要多看官方文档的介绍。

    • flush — 刷新输出缓冲
    • ob_clean — 清空(擦掉)输出缓冲区
    • ob_end_clean — 清空(擦除)缓冲区并关闭输出缓冲
    • ob_end_flush — 冲刷出(送出)输出缓冲区内容并关闭缓冲
    • ob_flush — 冲刷出(送出)输出缓冲区中的内容
    • ob_get_clean — 得到当前缓冲区的内容并删除当前输出缓。
    • ob_get_contents — 返回输出缓冲区的内容
    • ob_get_flush — 刷出(送出)缓冲区内容,以字符串形式返回内容,并关闭输出缓冲区。
    • ob_get_length — 返回输出缓冲区内容的长度
    • ob_get_level — 返回输出缓冲机制的嵌套级别
    • ob_get_status — 得到所有输出缓冲区的状态
    • ob_gzhandler — 在ob_start中使用的用来压缩输出缓冲区中内容的回调函数。ob_start callback function to gzip output buffer
    • ob_implicit_flush — 打开/关闭绝对刷送
    • ob_list_handlers — 列出所有使用中的输出处理程序。
    • ob_start — 打开输出控制缓冲
    • output_add_rewrite_var — 添加URL重写器的值(Add URL rewriter values)
    • output_reset_rewrite_vars — 重设URL重写器的值(Reset URL rewriter values)

    测试代码:

    /zhangyue0503/dev-/source/%E8%BF%98%E6%90%9E%E4%B8%8D%E6%87%82PHP%E4%B8%AD%E7%9A%84%E8%BE%93%E5%87%BA%E7%BC%93%E5%86%B2%E6%8E%A7%E5%88%B6%EF%BC%

    参考文档:

    /manual/zh/

    /manual/zh/#

    二、关于php如何实现静态缓存问题如下

    楼主,你所说的这个的实现则是+根据文件来判断的,每个文件在生成的时候都有一个创建时间,+而在数据库的设计中,则是存在这一个修改时间,+也就是用数据库来存储和计算这两个值的差值或者是是否相同,+再来判断是否要重新生成实质性的HTML文件..根据楼主的描述,大致的解决思路如上..而有关ob_start的理解,则是:+ob_start先将数据放入ob缓存+ob_flush再将缓存数据输出到程序缓存中+ob_end_clean清空缓存并且关闭缓存+程序输出而在页面静态化中,缓存的方法有:+ob缓存+smarty缓存+ThinkPHP缓存+模版缓存静态化又分为:+实质的静态化+伪静态化这是本人的理解,楼主可以在此基础上加强,形成自己的理解..

    三、如何解决 WordPress 403 Forbidden Error 错误

    1、重建dns缓存对于一些常规的403 forbipen错误,马海祥建议大家首先要尝试的就是重建dns缓存,在运行中输入cmd,然后输入ipconfig
    /flushdns即可。
    如果不行的话,就需要在hosts文件里把主页解析一下了。
    同时,查看是否在网站虚拟目录中添加默认文档,一般默认文档为:;;;;;等,如下图所示: 403 Forbipen错误的原因和解决方法-
    马海祥博客2、修改文件夹安全属性用以下命令修改文件夹安全属性 chcon -R -t httpd_user_content_t public_html/
    所用命令解析: ls -Z -d public_html/ #显示文件/目录的安全语境-Z, –context Display security
    context so it fits on most displays. Displays only mode, user, group, security
    context and file name.-d, –directory list directory entries instead of
    contents, and do not dereference symbolic links chcon -R -t
    httpd_user_content_t public_html/ #修改文件/目录的安全语境-R, –recursive change files and
    directories recursively-t, –type set type TYPE in the target security
    context3、关于apache导致的403 forbipen错误的解决办法打开apache的配置文件,找到这段代码: Options
    FollowSymLinks AllowOverride None Order deny,allow Deny from all
    有时候由于配置了php后,这里的“Deny from all”已经拒绝了一切连接。
    把该行改成“allow from all”,修改后的代码如下,问题解决。
    Options FollowSymLinks AllowOverride None Order deny,allow Allow from all
    之所以会出现错误,是因为大多数的国外主机在配置Apache的时候启用了mod_security,也就是开启了安全检查,如果提交的信息中包含select ,
    % , bin等关键字,Apache就会禁止,并给出403,404,500等错误。
    4、关于HawkHost空间出现403 Forbipen错误的解决方法有的时候在共享服务器上安装了Mod
    security,当网址包含有“%”号等其它敏感字符时,就会被Mod security阻止,马海祥博客曾经也出现过此情况。
    解决HawkHost 403 Forbipen 错误的方法: 在.htaccess文件里添加如下代码: SecFilterEngine Off
    SecFilterScanPOST Off 直接放在网站的根目录或者程序运行的目录下。
    5、关于WordPress导致的403
    Forbipen错误解决方法对于一些使用WordPress管理程序搭建的博客来说,就需要修改.htaccess文件,在后面添加上如下内容即可,其实就是disable
    mod_security SecFilterEngine Off SecFilterScanPOST Off
    另外dedecms的可能还需要再加一条,以让默认访问的是文件的DirectoryIndex 。
    修改.htaccess文件,将文件上传之后,再重新打开之前出现403 Forbipen的URL就没有再出现错误,直接可以打开了。
    首先和浏览器没有任何关系————————–
    这个原因是因为你的域名虽然解析到了这个空间地址上,但是这个空间的服务器上并没有绑定(添加)你的域名.一般免费空间不提供域名绑定功能.这几天刚接手一批新做的网站,在访问网站的时候,会时不时的出现403
    Forbipen错误,浏览器会给出403 Forbipen错误提示,在打开Access Error中列出的URL之后, 出现以下错误:403
    Forbipen Access to this resource on the server is denied! Powered By LiteSpeed
    Web Server LiteSpeed Technologies is not responsible for administration and
    contents of this web site!403错误是网站访问过程中,常见的错误提示。
    资源不可用,服务器理解客户的请求,但拒绝处理它。
    通常由于服务器上文件或目录的权限设置导致,比如IIS或者apache设置了访问权限不当这几天刚接手一批新做的网站,在访问网站的时候,会时不时的出现403
    Forbipen错误,浏览器会给出403 Forbipen错误提示,在打开Access Error中列出的URL之后, 出现以下错误:403
    Forbipen Access to this resource on the server is denied! Powered By LiteSpeed
    Web Server LiteSpeed Technologies is not responsible for administration and
    contents of this web site!403错误是网站访问过程中,常见的错误提示。
    资源不可用,服务器理解客户的请求,但拒绝处理它。
    通常由于服务器上文件或目录的权限设置导致,比如IIS或者apache设置了访问权限不当

    四、如何设置JS CSS 图片等静态资源的缓存过期时间

    答:在header中给静态内容添加一个较长的过期时间,这样可以使用户今后访问只读取缓存中的文件,而不会与服务器产生任何的交互。不过这样做也存在一些问题,当图片、CSS和js文件更新时,用户如果不刷新浏览器,就无法获得此更新。这样,我们在对图片、css和js文件修改时,必须要进行重命名,才能保证用户访问到最新的内容。这可能会给开发造成不小的麻烦,因为这些文件可能被站点中的许多文件所引用。flickr提出的解决办法是通过urlrewrite使不同版本号的URL事实上指向同一个文件,这是一个聪明的办法,因为url级别的操作效率是很高的,可以给开发过程提供不少便利。要理解为什么这样做,必须要了解浏览器访问url时的工作机制:a.第一次访问url时,用户从服务器段获取页面内容,并把相关的文件(images,css,js…)放在高速缓存中,也会把文件头中的expiredtime,lastmodified,ETags等相关信息也一同保留下来。b.用户重复访问url时,浏览器首先看高速缓存中是否有本站同名的文件,如果有,则检查文件的过期时间;如果尚未过期,则直接从缓存中读取文件,不再访问服务器。c.如果缓存中文件的过期时间不存在或已超出,则浏览器会访问服务器获取文件的头信息,检查lastmodifed和ETags等信息,如果发现本地缓存中的文件在上次访问后没被修改,则使用本地缓存中的文件;如果修改过,则从服务器上获取最新版本。

    版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请发送邮件至 55@qq.com 举报,一经查实,本站将立刻删除。转转请注明出处:https://www.szhjjp.com/n/102348.html

    (0)
    robot
    上一篇 2022-04-14
    下一篇 2022-04-14

    相关推荐

    • 描写的古诗春天(描写春天的古诗词句有哪些)

      俗话说一年之计在于春,春天是季节,也是心情,在内心里发生。所以春天不仅是万物的梦醒,也是心灵的醒悟。因此,春天自古就成了很多文人墨客笔下经常描写的对象,今天就跟大家一起分享一些脍炙人口的诗句。《钱塘湖春行》〔唐代〕白居易孤山寺北贾亭西,

      2021-11-26 技术经验
      0
    • 如何在Couchbase中实现数据模型设计和规范化

      在Couchbase中实现数据模型设计和规范化需要考虑以下几个方面:使用适当的数据结构:在Couchbase中,数据以JSON格式存储,因此需要设计合适的数据结构来存储数据。这包括确定哪些字段需要存储在一个文档中,以及如何组织文档之间的关系。使用适当的键设计:在Couchbase中,每个文档都有一个唯一键,用于检索和更新文档。因此,在设计数据模型时,需要考虑如何设计键来支持高效的数据检索和更新操作

      2024-03-30
      0
    • sqlserver怎么重新生成索引

      要重新生成索引,可以使用以下步骤:找到需要重新生成的索引:首先,使用SQL Server Management Studio(SSMS)或者查询系统视图来查看当前的索引状态,找到需要重新生成的索引。删除旧索引:在重新生成索引之前,可以选择删除旧索引。可以使用以下SQL语句删除索引:DROP INDEX index_name ON table_name;重新生成索引:可以使用以下SQL语句重新生成索

      2024-03-05
      0
    • 微博有什么靠谱的推广(微博推广真的有用吗)

      微博有什么靠谱的推广,微博推广真的有用吗 内容导航: 有什么好的微博推广平台推荐的 微博营销推广具体有哪些 利用微博求职靠谱吗有一家叫职微博的的求职微博,在上面找工作效果怎么样 哪…

      2022-08-25
      0
    • dede如何做两个模板(dede模板)

      dede如何做两个模板,dede模板内容导航:织梦模型怎么添加两个文章模板如何将word一页分成两个版面dede中dedearclist两个标记type下面所有底层模板变量如何做一个一个模板只有两张图片两个链接一、织梦模型怎么添加两个文章模

      2022-05-05
      0
    • 如何免费做推广方案(怎么做推广方案)

      如何免费做推广方案,怎么做推广方案内容导航:免费推广的方式有哪些请问免费推广怎么做更有效果免费推广的100个方案网络推广推行的方案怎样做一、免费推广的方式有哪些免费推广对于一些企业来说还是十分有必要的,因为,在创业初期会涉及到

      2022-04-14
      0