Deprecated
: htmlspecialchars(): Passing null to parameter #1 ($string) of type string is deprecated in
/www/wwwroot/testblog.58heshihu.com/var/Widget/Archive.php
on line
1057
首页
关于
Search
1
给你10个市场数据调研报告的免费下载网站!以后竞品数据就从这里找!
182 阅读
2
php接口优化 使用curl_multi_init批量请求
144 阅读
3
《从菜鸟到大师之路 ElasticSearch 篇》
107 阅读
4
2024年备考系统架构设计师
104 阅读
5
PHP 文件I/O
92 阅读
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
登录
Search
标签搜索
php函数
php语法
性能优化
安全
错误和异常处理
问题
vue
Composer
Session
缓存
框架
Swoole
api
并发
异步
正则表达式
php-fpm
mysql 索引
开发规范
协程
dafenqi
累计撰写
786
篇文章
累计收到
28
条评论
首页
栏目
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
副业
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
页面
关于
搜索到
10
篇与
的结果
2023-08-10
PHP 进阶之路 - 亿级 pv 网站架构实战之性能优化
PHP 进阶之路 - 亿级 pv 网站架构实战之性能压榨缘起PV和PU(数据分析—业务指标)PV即访问次数——用户每访问一次可以看作一次PV。PU即访问人数——在同一天内,一个用户无论访问了多少次都算一个访客。通过PV和PU可以分析出用户喜欢产品哪个功能,不喜欢哪个功能,从而根据用户行为来优化产品。为什么过早的优化是万恶之源?在进行优化之前,应该先测试代码的性能,确定是否存在性能问题。同时,也应该优先考虑代码的可读性、可维护性和可扩展性,避免过度优化。使用XHProf查找PHP性能瓶颈XHProf是facebook 开发的一个测试php性能的扩展,本文记录了在PHP应用中使用XHProf对PHP进行性能优化,查找性能瓶颈的方法。性能优化的原则性能优化是建立在对业务的理解之上的性能优化与架构、业务相辅相成、密不可分的性能优化的引入我们先看一张简单的 web 架构图从上到下从用户的浏览器到最后的数据库,那么我们说先前端的优化。前端优化雅虎军规:http://www.cnblogs.com/paul-3... 减少 http 请求数图片、css、script等等这些都会增加http请求数,减少这些元素的数量就能减少响应时间。把多个JS、CSS在可能的情况下写进一个文件,页面里直接写入图片也是不好的做法,应该写进CSS里,小图拼合后利用 background 来定位。现在很多 icon 都是直接做成字体,矢量高清,也减少网络请求数现在的前端框架都会通过组件的方式开发,最后打包生成一个 js 或者 两个 js 文件 + 一个 css 或者两个 css 文件。利用浏览器缓存expires,cache-control,last-modified,etag http://blog.csdn.net/eroswang... 防止缓存,比如资源更新了,原来的做法是?v=xxxx 现在前端的打包工作可以能会生成 /v1.2.0/xxx.js使用分布式存储前端资源接地气利用 cdn 存储前端资源多域名访问资源原因一:浏览器对同一域名的并行请求数有上限,多个域名则支持更多并行请求原因二:使用同一域名的时候无用的 cookie 简直是噩梦数据压缩开启gzip前端资源本身的压缩,js/css 打包编译(去掉空格,语意简化)图片资源的压缩等。优化首屏展示速度资源的按需加载,延时加载 https://blog.csdn.net/m0_64346035/article/details/125131432图片的懒加载,淘宝的商品介绍太多图,用户点击进来又有多少人一直往下看图的呢? 前端懒加载nginx 优化分为下面三个部分来nginx 本身配置的优化worker_processes auto 设置多少子进程worker_cpu_affinity 亲缘性绑定worker_rlimit_nofile 65535 worker 进程打开的文件描述符的最大数worker_connections 65535 子进程最多处理的连接数epoll 多路复用sendfile on 是对文件I/O的系统调用的一个优化,系统api如果是反向代理web服务器,需要配置fastcgi相关的参数数据返回开启gzip压缩静态资源使用 http 缓存协议开启长连接 keepalive_timeout fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; fastcgi_buffer_size 64k; fastcgi_buffers 4 64k; fastcgi_busy_buffers_size 128k; fastcgi_temp_file_write_size 256k; gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_http_version 1.0; gzip_comp_level 2; gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/json; gzip_vary on; gzip_proxied expired no-cache no-store private auth; gzip_disable "MSIE \[1-6\]\\."; location ~ .*\\.(gif|jpg|jpeg|png|bmp|swf)$ { expires 30d; }worker_connections和worker_rlimit_nofile有什么区别tcp/ip 网络协议配置的优化/proc/sys/net/ipv4/tcp_tw_recycle 1 开启TCP连接中TIME-WAIT sockets的快速回收,保证tcp_timestamps = 1/proc/sys/net/ipv4/tcp_tw_reuse 1 允许将TIME-WAIT sockets重新用于新的TCP连接/proc/sys/net/ipv4/tcp_syncookies 0 是否需要关闭洪水抵御 看自己业务,比如秒杀,肯定需要关闭了/proc/sys/net/ipv4/tcp_max_tw_buckets 180000 否则经常出现 time wait bucket table overflowtcp_nodelay on 小文件快速返回,我之前通过网络挂载磁盘出现找不到的情况tcp_nopush ontcp_tw_recycle 快速回收可能导致丢包的问题 https://www.im050.com/posts/435linux 系统的优化除了上面的网络协议配置也是在系统基础之外,为了配合nginx自己里面的设定需要做如下修改/proc/sys/net/core/somaxconn 65535ulimit -a 65535Nginx配置性能优化的方法php 优化升级到 php7注意有很多函数和扩展被废弃,比如mysql相关的,有风险,做好测试再切换。opcode 缓存php 5.5 之后好像就内置了吧,需要在php.ini里添加如下配置opcache.revalidate_freq=60 opcache.validate_timestamps=1 opcache.max_accelerated_files=1000 opcache.memory_consumption=512 opcache.interned_strings_buffer=16 opcache.fast_shutdown=1opcache.revalidate_freq这个选项用于设置缓存的过期时间(单位是秒),当这个时间达到后,opcache会检查你的代码是否改变,如果改变了PHP会重新编译它,生成新的opcode,并且更新缓存。opcache.validate_timestamps当这个选项被启用(设置为1),PHP会在opcache.revalidate_freq设置的时间到达后检测文件的时间戳(timestamp)。opcache.max_accelerated_files这个选项用于控制内存中最多可以缓存多少个PHP文件。opcache.memory_consumption你可以通过调用opcachegetstatus()来获取opcache使用的内存的总量opcache.interned_strings_buffer字符串opcache的复用,单位为MBopcache.fast_shutdown=1开启快速停止续发事件,依赖于Zend引擎的内存管理模块php7 hugepage 的使用Hugepage 的作用:间接提高虚拟地址和内存地址转换过程中查表的TLB缓存命中率opcache.huge_code_pages=1鸟哥博客详细介绍:http://www.laruence.com/2015/...代码伪编译以thinkphp为例,它会把框架基础组件(必须用到的组件)合并压缩到一个文件中,不仅减少了文件目录查找,文件打开的系统调用。 通过stracephp-fpm子进程,可以清楚系统调用的过程,在我上面例子中有打开一个文件有12次系统调用(只是举例,我这里相对路径设置的原因导致多了两次文件查找)。如果有10个文件,那就是120次,优化的效果可能不是那么明显,但是这是一种思路。 顺便说下 set_include_path能不用就不要用,上面的demo的截图里面找不到目录就是证明。模板编译模板把它们自定义的语法,最后转换成php语法,这样方便解析。而不是每次都解析一遍。xhprof 查找性能瓶颈xhprof 查找性能瓶颈业务优化非侵入式扩展开发比如原来有一个model,叫问答,现在需要开发一个有奖问答,需要支持话题打赏,里面多了很多功能。这个时候应该利用面向对象的继承的特性。而不是做下面的开发<?php class AskModel { public function detail($id){ $info = 从数据库查询到该问题的信息; // 逻辑1 // 逻辑2 } }<?php class AskModel { public function detail($id){ $info = 从数据库查询到该问题的信息; // 逻辑1 if($info\['type'\] == 2){ //... }else{ } // 逻辑2 if($info\['type'\] == 2){ //... }else{ } } }这样逻辑多了,子类型多了,逻辑判断就非常重复,程序运行起来低效可能是一方面,更多的是不可维护性。业务和架构不分家,架构是建立在对业务的理解之上的。异步思想举例:处理邮件发送。gearman 图片裁剪。页面上 ajax 加载动态数据。图片的懒加载,双击图片看大图。sf 上通过websocket 通知你有新的消息,但是并没有告诉你有什消息,点击消息图标才会去异步请求具体的消息。这些都是异步的思想。能分步走就分步走,能不能请求的就不请求。静态化专题页面,比如秒杀页面,为了应对更大的流量、并发。而且更新起来也比较方便。业务解耦比如刚刚上面说的专题页面,还有必要走整个框架的一套流程吗?进来引用一大堆的文件,初始化一大堆的东西?是不是特别低效呢?所以需要业务解耦,专题页面如果真要框架(可以首次访问之后生成静态页面)也应该是足够轻量级的。不能与传统业务混为一谈。分布式以及 soa说业务优化,真的不得不提架构方面的东西,业务解耦之后,就有了分布式和soa。 说下 soa 自定义 socket 传输协议。 最重要的就是在自定义头里面强调body_len,注意设置为紧凑型,才能保证跨平台性Mysql 优化数据索引相关的文章网上很多了,不足的地方大家补充。表设计 - 拥抱 innodb现在大多数情况都会使用innodb类型了。具体原因是 mysql 专家给的意见。 我自己对 mysql 的优化不了解,每一个细分领域都是一片汪洋,每个人的时间精力是有限的,所以大家也不用什么都非要深入去研究,往往是一些计算机基础更为重要。 参考这份ppt MySQL秘籍.pdf表设计 - 主键索引innodb 需要一个主键,主键不要有业务用途,不要修改主键。主键最好保持顺序递增,随机主键会导致聚簇索引树频繁分裂,随机I/O增多,数据离散,性能下降。举例: 之前项目里有些索引是article_id + tag_id 联合做的主键,那么这种情况下,就是业务了属性了。主键也不是顺序递增,每插入新的数据都有可能导致很大的索引变动(了解下数据库b+索引的原理)表设计 - 字段选择能选短整型,不选长整型。比如一篇文章的状态值,不可能有超过100种吧,不过怎么扩展,没必要用int了。能选 char 就避免 varchar,比如图片资源都有一个hashcode,固定长度20位,那么就可以选char了。当使用 varchar 的时候,长度够用就行,不要滥用。大文本单独分离,比如文章的详情,单独出一张表。其他基本信息放在一张表里,然后关联起来。冗余字段的使用,比如文章的详情字段,增加一个文章markdown解析之后的字段。索引优化大多数情况下,索引扫描要比全表扫描更快,性能更好。但也不是绝对的,比如需要查找的数据占了整个数据表的很大比例,反而使用索引更慢了。没有索引的更新,可能会导致全表数据都被锁住。所以更新的时候要根据索引来做。联合索引的使用explain 的使用联合索引“最左前缀”,查询优化器还会帮你调整条件表达式的顺序,以匹配组合索引的要求。CREATE TABLE `test` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `a` int(10) unsigned NOT NULL, `b` int(10) unsigned NOT NULL, `c` int(10) unsigned NOT NULL, PRIMARY KEY (`id`), KEY `index_abc` (`a`,`b`,`c`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;能使用到索引explain select * from test where a=1; explain select * from test where a=1 and b=2; explain select * from test where a=1 and b=2 and c=3; explain select * from test where a=1 and b in (2,3) and c=3; explain select * from test where a=1 and b=2 order by c desc;不能使用索引explain select * from test where a=1 and b in (2,3) order by c desc; explain select * from test where b=2;explain 搜到一篇不错的: http://blog.csdn.net/woshiqjs... 很重要的参数type,key,extratype 最常见的system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALLextra如果有Using filesort或者Using temporary的话,就必须要优化了收集慢查询my.ini 配置里增加long_query_time=2 log-slow-queries=/data/var/mysql_slow.log使用 nosqlredis 丰富的数据类型,非常适合配合mysql 做一些关系型的查询。比如一个非常复杂的查询列表可以将其插入zset 做排序列表,然后具体的信息,通过zset里面的纸去mysql 里面去查询。缓存优化多级缓存请求内缓存static 变量存储,比如朋友圈信息流,在一次性获取20条信息的时候,有可能,点赞的人里面20条里面有30个人是重复的,他们点赞你的a图片也点赞了你的b图片,所以这时,如果能使用static数组来存放这些用户的基本信息就高效了些。本地缓存请求结束了,下拉更新朋友圈,里面又出现了上面的同样的好友,还得重新请求一次。所以本地常驻内存的缓存就更高效了。分布式缓存在A服务器上已经查询过了,在下拉更新的时候被分配到B服务器上了,难道同样的数据再查一次再存到B服务器的本地缓存里面吗,弄一个分布式缓存吧,这样防止了重复查询。但是多了网络请求这一步。很多时候是三者共存的。避免缓存的滥用案例分析用户积分更新比如用户的基本信息和积分混在一起,当用户登录的时候赠送积分。则需要更新用户的积分,这个时候更新整个用户的基本信息缓存么?所以这里也可以运用下面 hashes 分片的原则去更新礼物和主题绑定缓存为了取数据方便把多个数据源混合缓存了,这种情况,相比大家可能都见过,这是灾难性的设计。{id:x,title:x,gift:{ id:x, name:x, img:x, }}如果需要更新礼物的图片,那么所有用到过这个礼物的话题的缓存都要更新。redis 优化多实例化,更高效地利用服务器 cpu内存优化,官方意见 https://redis.io/topics/memor... 有点老尽可能的使用 hashes ,时间复杂度低,查询效率高。同时还节约内存。Instagram 最开始用string来存图片id=>uid的关系数据,用了21g,后来改为水平分割,图片id 1000 取模,然后将分片的数据存在一个hashse 里面,这样最后的内容减少了5g,四分之一基本上。每一段使用一个Hash结构存储,由于Hash结构会在单个Hash元素在不足一定数量时进行压缩存储,所以可以大量节约内存。这一点在String结构里是不存在的。而这个一定数量是由配置文件中的hash-zipmap-max-entries参数来控制的。服务器认知的提升下面的内容,只能是让大家有一个大概的认识,了解一个优化的方向,具体的内容需要系统学习很多很多的知识。多进程的优势多进程有利于 CPU 计算和 I/O 操作的重叠利用。一个进程消耗的绝大部分时间都是在磁盘I/O和网络I/O中。 如果是单进程时cpu大量的时间都在等待I/O,所以我们需要使用多进程。减少上下文切换为了让所有的进程轮流使用系统资源,进程调度器在必要的时候挂起正在运行的进程,同时恢复以前挂起的某个进程。这个就是我们常说的“上下文切换”。无限制增加进程数,则会增多 cpu 在各个进程间切换的次数。 如果我们希望服务器支持较大的并发数,那么久要尽量减少上下文切换的次数,比如在nginx服务上nginx的子进程数不要超过cpu的核数。 我们可以在压测的时候通过vmstat,nmon来监控系统上下文切换的次数。IOwait 不一定是 I/O 繁忙# top top - 09:40:40 up 565 days, 5:47, 2 users, load average: 0.03, 0.03, 0.00 Tasks: 121 total, 2 running, 119 sleeping, 0 stopped, 0 zombie Cpu(s): 8.6%us, 0.3%sy, 0.0%ni, 90.7%id, 0.2%wa, 0.0%hi, 0.2%si, 0.0%st一般情况下IOwait代表I/O操作的时间占(I/O操作的时间 + I/O和CPU时间)的比例。 但是也时候也不准,比如nginx来作为web服务器,当我们开启很多nginx子进程,IOwait会很高,当再减少进程数到cpu核数附近时,IOwait会减少,监控网络流量会发现也增加。多路复用 I/O 的使用只要是提供socket服务,就可以利用多路复用 I/O 模型。减少系统调用strace 非常方便统计系统调用# strace -c -p 23374Process 23374 attached - interrupt to quit ^CProcess 23374 detached % time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ---------------- 30.68 0.000166 0 648 poll 12.01 0.000065 0 228 munmap 11.65 0.000063 0 228 mmap 10.54 0.000057 0 660 recvfrom 10.35 0.000056 0 708 fstat 7.76 0.000042 0 252 open 6.10 0.000033 1 36 write 5.73 0.000031 0 72 24 access 5.18 0.000028 0 72 read 0.00 0.000000 0 276 close 0.00 0.000000 0 13 13 stat 0.00 0.000000 0 269 240 lstat 0.00 0.000000 0 12 rt_sigaction 0.00 0.000000 0 12 rt_sigprocmask 0.00 0.000000 0 12 pwrite 0.00 0.000000 0 48 setitimer 0.00 0.000000 0 12 socket 0.00 0.000000 0 12 connect 0.00 0.000000 0 12 accept 0.00 0.000000 0 168 sendto 0.00 0.000000 0 12 shutdown 0.00 0.000000 0 48 fcntl 0.00 0.000000 0 12 flock 0.00 0.000000 0 156 getcwd 0.00 0.000000 0 24 chdir 0.00 0.000000 0 24 times 0.00 0.000000 0 12 getuid ------ ----------- ----------- --------- --------- ---------------- 100.00 0.000541 4038 277 total通过strace查看“系统调用时间”和“调用次数”来定位问题strace:跟踪进程的系统调用 、ltrace:跟踪进程调用库函数自己构建web服务器要想理解web服务器优化的原理,最好的办法是了解它的来龙去脉,实践就是最好的方式,我分为以下几个步骤:用 PHP 来实现一个动态 Web 服务器 简单静态 web 服务器(循环服务器)的实现 多进程并发的面向连接 Web 服务器的实践简单静态 Select Web 服务器的实现I/O 多路复用上面是我的学习笔记,图片资源丢失了,大家可以根据相关关键词去搜搜相关的文章和书籍,更推荐大家去看书。
2023年08月10日
26 阅读
0 评论
0 点赞
2023-08-10
PHP控制缓存输出之ob系列函数详解
PHP控制缓存输出之ob系列函数详解ob,输出缓冲区,是output buffering的简称,而不是output cache。ob用对了,是能对速度有一定的帮助,但是盲目的加上ob函数,只会增加CPU额外的负担ob的基本原则:如果ob缓存打开,则echo的数据首先放在ob缓存。如果是header信息,直接放在程序缓存。当页面执行到最后,会把ob缓存的数据放到程序缓存,然后依次返回给浏览器。基本作用下面我说说ob的基本作用:1)防止在浏览器有输出之后再使用setcookie()、header()或session_start()等发送头文件的函数造成的错误。其实这样的用法少用为好,养成良好的代码习惯。2)捕捉对一些不可获取的函数的输出,比如phpinfo()会输出一大堆的HTML,但是我们无法用一个变量例如$info=phpinfo();来捕捉,这时候ob就管用了。3)对输出的内容进行处理,例如进行gzip压缩,例如进行简繁转换,例如进行一些字符串替换。4)生成静态文件,其实就是捕捉整页的输出,然后存成文件。经常在生成HTML,或者整页缓存中使用。对于刚才说的第三点中的GZIP压缩,可能是很多人想用,却没有真用上的,其实稍稍修改下代码,就可以实现页面的gzip压缩。代码如下:ob_start(ob_gzhandler);要缓存的内容没错,加一个ob_gzhandler这个回调函数就可以了,不过这么做有些小问题,一是需要zlib支持,二是没有判断浏览器是否支持gzip(现在好像都支持,iphone浏览器好像都支持了)。以前的做法是判断一下浏览器是否支持gzip,然后用第三方的gzip函数来压缩ob_get_contents() 的内容,最后echo。';ob_start();echo 'level 2';ob_start();echo 'level 3';ob_end_flush();ob_end_flush();ob_end_flush();很明显,结果为:level 1level 2level 3当程序修改一下,修改一个ob_end_flush() 变成 ob_end_clean() 成为以下这个,你觉得结果会是怎样呢?附上这几个函数的讲解:ob_clean — 清空(擦掉)输出缓冲区ob_end_clean — 清空(擦除)缓冲区并关闭输出缓冲ob_end_flush — 冲刷出(送出)输出缓冲区内容并关闭缓冲ob_flush — 冲刷出(送出)输出缓冲区中的内容ob_start — 打开输出控制缓冲';ob_start();echo 'level 2';ob_start();echo 'level 3';ob_end_clean();//修改处ob_end_flush();ob_end_flush();结果:level 1level 2可能你会认为ob_end_clean()会清除与他最近的ob_start()的输出;其实这个说法不是很全面,看下面的例子';ob_start();echo 'level 2';ob_start();echo 'level 3';ob_end_clean(); //第一次修改ob_end_flush();ob_end_clean(); //第二次修改这次,什么都没有输出来。中间不是有一个ob_flush()吗?按理来说应该是输出 level2 的。其实造成这样的主要原因是输出的多级缓冲机制。这个程序例子有三个ob_start(),就意味着他有3个缓冲区A,B,C,而其实php程序本身也有一个最终输出的缓冲区,我们就把他叫做F。在这个程序中他这几个缓冲区是有一定层次的,C->B->A->F,F层次最高,是程序最终的输出缓冲,我们按上面的程序来进行讲解。刚开始。 F:nullob_start();新建缓冲区A。 A: null -> F:nullecho 'level 1';程序有输出,输出进入最低的缓冲区A A: 'level 1' -> F:nullob_start();新建缓冲区B 。 B:null -> A: 'level 1' -> F:nullecho 'level 2';程序有输出,输出进入最低的缓冲区B B:'level 2' -> A: 'level 1' ->F:nullob_start();新建缓冲区C C:null B:'level 2' A: 'level 1' -> F:nullecho 'level 3';程序有输出,输出进入最低的缓冲区C C:'level 3' -> B:'level 2' -> A: 'level 1' -> F:nullob_end_clean(); //第一次修改缓冲区C被清空并关闭。 B:'level 2' -> A: 'level 1' -> F:nullob_end_flush();缓冲区B输出到上一级的缓冲区A并关闭。 A: 'level 1level 2' -> F:nullob_end_clean(); //第二次修改缓冲区A被清空并关闭。 此时缓冲区A的东西还没真正输出到最终的F中,因此也就整个程序也就没有任何的输出了。ob其他的函数还有很多,但只要能懂得这些机理应该也是不难懂的。附上其余函数ob_start(); //打开一个输出缓冲区,所有的输出信息不再直接发送到浏览器,而是保存在输出缓冲区里面。ob_clean(); //删除内部缓冲区的内容,不关闭缓冲区(不输出)。ob_end_clean(); //删除内部缓冲区的内容,关闭缓冲区(不输出)。ob_get_clean(); //返回内部缓冲区的内容,关闭缓冲区。相当于执行 ob_get_contents() and ob_end_clean()ob_flush(); //发送内部缓冲区的内容到浏览器,删除缓冲区的内容,不关闭缓冲区。ob_end_flush(); //发送内部缓冲区的内容到浏览器,删除缓冲区的内容,关闭缓冲区。ob_get_flush(); //返回内部缓冲区的内容,并关闭缓冲区,再释放缓冲区的内容。相当于ob_end_flush()并返回缓冲区内容。flush(); //将ob_flush释放出来的内容,以及不在PHP缓冲区中的内容,全部输出至浏览器;刷新内部缓冲区的内容,并输出。ob_get_contents(); //返回缓冲区的内容,不输出。ob_get_length(); //返回内部缓冲区的长度,如果缓冲区未被激活,该函数返回FALSE。ob_get_level(); //Return the nesting level of the output buffering mechanism.ob_get_status(); //Get status of output buffers.ob_implicit_flush(); //打开或关闭绝对刷新,默认为关闭,打开后ob_implicit_flush(true),所谓绝对刷新,即当有输出语句(e.g: echo)被执行时,便把输出直接发送到浏览器,而不再需要调用flush()或等到脚本结束时才输出。ob_gzhandler //ob_start回调函数,用gzip压缩缓冲区的内容。ob_list_handlers //List all output handlers in useoutput_add_rewrite_var //Add URL rewriter valuesoutput_reset_rewrite_vars //Reset URL rewriter values这些函数的行为受php_ini设置的影响:output_buffering //该值为ON时,将在所有脚本中使用输出控制;若该值为一个数字,则代表缓冲区的最大字节限制,当缓存内容达到该上限时将会自动向浏览器输出当前的缓冲区里的内容。output_handler //该选项可将脚本所有的输出,重定向到一个函数。例如,将 output_handler 设置为 mb_output_handler() 时,字符的编码将被修改为指定的编码。设置的任何处理函数,将自动的处理输出缓冲。implicit_flush //作用同ob_implicit_flush,默认为Off。1、使 header() 函数前可以有echo代码Output Control 函数可以让你自由控制脚本中数据的输出。它非常地有用,特别是对于:当你想在数据已经输出后,再输出文件头的情况。输出控制函数不对使用 header() 或 setcookie(),发送的文件头信息产生影响,只对那些类似于 echo() 和 PHP 代码的数据块有作用。ob_start(); //打开缓冲区echo "Hello\n"; //输出header(“location:index.php”); //把浏览器重定向到index.phpob_end_flush(); //输出全部内容到浏览器所有对header()函数有了解的人都知道,这个函数会发送一段文件头给浏览器,但是如果在使用这个函数之前已经有了任何输出(包括空输出,比如空格,回车和换行)就会提示出错。如果我们去掉第一行的ob_start(),再执行此程序,我们会发现得到了一条错误提示:"Header had all ready send by"!但是加上ob_start,就不会提示出错,原因是当打开了缓冲区,echo后面的字符不会输出到浏览器,而是保留在服务器,直到你使用flush或者ob_end_flush才会输出,所以并不会有任何文件头输出的错误!2、保存 phpinfo() 函数的输出ob_start(); //打开缓冲区phpinfo(); //使用phpinfo函数$info = ob_get_contents(); //得到缓冲区的内容并且赋值给$info$file = fopen('info.txt', 'w'); //打开文件info.txtfwrite($file, $info); //写入信息到info.txtfclose($file); //关闭文件info.txt3、静态模版技术所谓静态模版技术就是通过某种方式,使得用户在client端得到的是由PHP产生的html页面。如果这个html页面不会再被更新,那么当另外的用户再次浏览此页面时,程序将不会再调用PHP以及相关的数据库,对于某些信息量比较大的网站,例如sina、163、sohu。类似这种的技术带来的好处是非常巨大的。ob_start(); //打开缓冲区php页面的全部输出$content = ob_get_contents(); //取得php页面输出的全部内容$fp = fopen("output00001.html", "w"); //创建一个文件,并打开,准备写入fwrite($fp, $content); //把php页面的内容全部写入output00001.html,然后……fclose($fp);注意事项:1、一些Web服务器的output_buffering默认是4069字符或者更大,即输出内容必须达到4069字符服务器才会flush刷新输出缓冲,为了确保flush有效,最好在ob_flush()函数前有以下语句:print str_repeat("", 4096); //以确保到达output_buffering值2、ob_* 系列函数是操作PHP本身的输出缓冲区,所以ob_flush只刷新PHP自身的缓冲区,而flush是刷新apache的缓冲区。所以,正确使用俩者的顺序是:先ob_flush,然后flush。ob_flush是把数据从PHP的缓冲中释放出来,flush是把缓冲内/外的数据全部发送到浏览器。3、不要误认为用了ob_start()后,脚本的echo/print等输出就永远不会显示在浏览器上了。因为PHP脚本运行结束后,会自动刷新缓冲区并输出内容。
2023年08月10日
17 阅读
0 评论
0 点赞
2023-08-08
php修改代码不生效的问题 opcache缓存
php修改代码不生效的问题 opcache缓存大伙应该都知道,php是动态语言,每次运行时,都会重新编译,这会很耗性能的。而Zend OPcache 则是通过 opcode 缓存和优化提供更快的 PHP 执行过程。它将预编译的脚本文件存储在共享内存中供以后使用,从而避免了从磁盘读取代码并进行编译的时间消耗。同时,它还应用了一些代码优化模式,使得代码执行更快。简单的了解了Zend OPcache作用后,那么就去php配置文件看看了,果真,在配置文件的最下方返现这么写配置信息[opcache]zend_extension = /usr/local/php/lib/php/extensions/no-debug-non-zts-20121212/opcache.so ;OPcache 的共享内存大小,以兆字节为单位。 opcache.memory_consumption=64 ;用来存储临时字符串的内存大小,以兆字节为单位。 ;PHP 5.3.0 之前的版本会忽略此配置指令。 opcache.interned_strings_buffer=8 ;OPcache 哈希表中可存储的脚本文件数量上限。 ;真实的取值是在质数集合 ;{ 223, 463, 983, 1979, 3907, 7963, 16229, 32531, 65407, 130987 } ;中找到的第一个比设置值大的质数。 设置值的取值范围是 200 到 100000 之间。 opcache.max_accelerated_files=4000 ;如果缓存处于非激活状态,等待多少秒之后计划重启。 ;如果超出了设定时间,则 OPcache 模块将杀除持有缓存锁的进程, 并进行重启。 ;如果选项 opcache.log_verbosity_level 设置为 3 或者 3 以上的数值, ;当发生重启时将在日志中记录一条错误信息。 opcache.force_restart_timeout=180 ;检查脚本时间戳是否有更新的周期,以秒为单位。 ;设置为 0 会导致针对每个请求, OPcache 都会检查脚本更新。 ;如果 opcache.validate_timestamps 配置指令设置为禁用,那么此设置项将会被忽略。 opcache.revalidate_freq=60 ;如果启用,则会使用快速停止续发事件。 ;所谓快速停止续发事件是指依赖 Zend 引擎的内存管理模块 ;一次释放全部请求变量的内存,而不是依次释放每一个已分配的内存块。 opcache.fast_shutdown=1 ;仅针对 CLI 版本的 PHP 启用操作码缓存。 通常被用来测试和调试。 opcache.enable_cli=1配置文件里的“opcache.revalidate_freq=60”是说明,会每隔一分钟检测一次脚本文件是否更新,那么就找到问题的根本了,改为0,也就是每次运行时都去检测一下,重新启动php,搞定。
2023年08月08日
20 阅读
0 评论
0 点赞
2023-08-07
php里设置浏览器缓存
php里设置浏览器缓存$lastModified = time() + 30;header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $lastModified) . ' GMT'); 此行设置后,会去服务器检查是否过期(文件是否修改过),如果没过期,就取本地文件(服务器需要返回header)header('Expires: ' . gmdate('D, d M Y H:i:s', $lastModified) . ' GMT'); 此行设置后,不再去服务器检查是否过期,直接取本地文件。header('Cache-Control: max-age=1'); (相对于本地时间 )还有一个Etag,是比较字符串,而不是时间。下面这段代码是禁止点后退后,缓存.header('Expires: Thu, 01 Jan 1970 00:00:00 GMT');// HTTP/1.1header('Cache-Control: private, no-store, no-cache, must-revalidate');header('Cache-Control: post-check=0, pre-check=0, max-age=0', false);psheader("Content-Type: application/json");//有时要加上这句,不然不起作用(看nginx配置)<?php// 这是一个缓存测试 $cache_time = 60*10; //十分钟缓存$modified_time = @$_SERVER['HTTP_IF_MODIFIED_SINCE']; if( strtotime($modified_time)+$cache_time > time() ){header("HTTP/1.1 304"); exit; } header("Last-Modified: ".gmdate("D, d M Y H:i:s", time() )." GMT"); header("Content-Type: application/json");//有时要加上这句,不然不起作用(看nginx配置) echo ""; echo date('Y-m-d H:i:s',time()); echo 222222; ?>
2023年08月07日
13 阅读
0 评论
0 点赞
2023-08-07
PHP文件型缓存解决方案secache
PHP文件型缓存解决方案secache注: 前两天发现的东西, 不同于一般的PHP文件缓存实现手法. 写得不错.类似Memcahced, 单文件实现, 支持并发, 比传统分离小文件缓存方式性能提高一倍.由于缓存文件只有一个,PHP最大寻址能力是2G,过大会指针溢出, 所以只能支持1G的缓存.以下是官方网站的介绍secache是一个PHP编写的文件型缓存解决方案纯php实现, 无须任何扩展,支持php4 / 5使用lru算法自动清理过期内容可以安全用于多进程并发最大支持1G缓存文件使用hash定位,读取迅速项目及下载地址 : http://code.google.com/p/secache/secache使用方法require('../secache/secache.php');$cache = new secache;$cache->workat('cachedata');$key = md5('test'); //必须自己做hash,前4位是16进制0-f,最长32位。$value = '值数据'; //必须是字符串$cache->store($key,$value);if($cache->fetch($key,$return)){echo ''.$key.'=>'.$return.'';}else{echo 'Data get failed! '.$key.'';}
2023年08月07日
11 阅读
0 评论
0 点赞
1
2