很多站长朋友们都不太清楚phpob缓存乱码,今天小编就来给大家整理phpob缓存乱码,希望对各位有所帮助,具体内容如下:
本文目录一览: 1、 PHP中出现乱码怎么办 2、 php网站如何更新缓存 3、 加入ob_clean()或者header('content-type:image/jpeg')也还是显示乱码 4、 怎样解决PHP中文乱码问题 5、 php页面解决乱码问题 6、 PHP中文乱码怎么解决? PHP中出现乱码怎么办是执行后的出现乱码还是执行前。
如果是PHP文件本身有乱码,有可能是加密了。如果是执行后,有可能是字符集的问题。
php网站如何更新缓存每个程序使用的缓存,可能都不一样,你最好找程序作者问一下
PHP 输出缓存详解
作者: 字体:[增加 减小] 类型:转载
Output Control
函数可以让你自由控制脚本中数据的输出。它非常地有用,特别是对于:当你想在数据已经输出后,再输出文件头的情况。
输出控制函数不对使用 header() 或 setcookie(),
发送的文件头信息产生影响,只对那些类似于 echo() 和 PHP 代码的数据块有作用。
我们先举一个简单的例子,让大家对Output
Control有一个大致的印象:
Example 1.
复制代码
代码如下:
<?php
ob_start(); //打开缓冲区
echo
\"Hellon\"; //输出
header(“location:index.php”); //把浏览器重定向到index.php
ob_end_flush();//输出全部内容到浏览器
?>
所有对header()函数有了解的人都知道,这个函数会发送一段文件头给浏览器,但是如果在使用这个函数之前已经有了任何输出(包括空输出,比如空格,回车和换行)就会提示出错。如果我们去掉第一行的ob_start(),再执行此程序,我们会发现得到了一条错误提示:“Header
had all ready send
by”!但是加上ob_start,就不会提示出错,原因是当打开了缓冲区,echo后面的字符不会输出到浏览器,而是保留在服务器,直到你使用
flush或者ob_end_flush才会输出,所以并不会有任何文件头输出的错误!
一、 相关函数简介:
1、Flush:刷新缓冲区的内容,输出。
函数格式:flush()
说明:这个函数经常使用,效率很高。
2、ob_start :打开输出缓冲区
函数格式:void ob_start(void)
说明:当缓冲区激活时,所有来自PHP程序的非文件头信息均不会发送,而是保存在内部缓冲区。为了输出缓冲区的内容,可以使用ob_end_flush()或flush()输出缓冲区的内容。
3 、ob_get_contents :返回内部缓冲区的内容。
使用方法:string
ob_get_contents(void)
说明:这个函数会返回当前缓冲区中的内容,如果输出缓冲区没有激活,则返回 FALSE 。
4、ob_get_length:返回内部缓冲区的长度。
使用方法:int
ob_get_length(void)
说明:这个函数会返回当前缓冲区中的长度;和ob_get_contents一样,如果输出缓冲区没有激活。则返回
FALSE。
5、ob_end_flush :发送内部缓冲区的内容到浏览器,并且关闭输出缓冲区。
使用方法:void ob_end_flush(void)
说明:这个函数发送输出缓冲区的内容(如果有的话)。
6、ob_end_clean:删除内部缓冲区的内容,并且关闭内部缓冲区
使用方法:void
ob_end_clean(void)
说明:这个函数不会输出内部缓冲区的内容而是把它删除!
7、ob_implicit_flush:打开或关闭绝对刷新
使用方法:void
ob_implicit_flush ([int flag])
说明:使用过Perl的人都知道$|=x的意义,这个字符串可以打开/关闭缓冲区,而ob_implicit_flush函数也和那个一样,默认为关闭缓冲区,打开绝对输出后,每个脚本输出都直接发送到浏览器,不再需要调用
flush()
二、深入了解:
1. 关于Flush函数:
这个函数在PHP3中就出现了,是一个效率很高的函数,他有一个非常有用的功能就是刷新browser的cache.我们举一个运行效果非常明显的例子来说明flush.
Example 2.
复制代码
代码如下:
<?php
for($i = 1; $i <= 300; $i++
) print(“ “);
// 这一句话非常关键,cache的结构使得它的内容只有达到一定的大小才能从浏览器里输出
//
换言之,如果cache的内容不达到一定的大小,它是不会在程序执行完毕前输出的。经
//
过测试,我发现这个大小的底限是256个字符长。这意味着cache以后接收的内容都会
// 源源不断的被发送出去。
For($j = 1; $j
<= 20; $j++) {
echo $j.”
”;
flush();
//这一部会使cache新增的内容被挤出去,显示到浏览器上
sleep(1); //让程序“睡”一秒钟,会让你把效果看得更清楚
}
?>
具体效果你可以到这里看看
PHP2000的最新的PHP聊天室就是用的这个技术,可惜的是源代码未公开 L
注:如果在程序的首部加入ob_implicit_flush()打开绝对刷新,就可以在程序中不再使用flush(),这样做的好处是:提高效率!
2. 关于ob系列函数:
我想先引用我的好朋友y10k的一个例子:
Example 3.
比如你用得到服务器和客户端的设置信息,但是这个信息会因为客户端的不同而不同,如果想要保存phpinfo()函数的输出怎么办呢?在没有缓冲区控制之前,可以说一点办法也没有,但是有了缓冲区的控制,我们可以轻松的解决:
复制代码
代码如下:
<?php
ob_start(); //打开缓冲区
phpinfo(); //使用phpinfo函数
$info=ob_get_contents(); //得到缓冲区的内容并且赋值给$info
$file=fopen(\'info.txt\',\'w\'); //打开文件info.txt
fwrite($file,$info);
//写入信息到info.txt
fclose($file); //关闭文件info.txt
?>
用以上的方法,就可以把不同用户的phpinfo信息保存下来,这在以前恐怕没有办法办到!其实上面就是将一些“过程”转化为“函数”的方法!
或许有人会问:“难道就这个样子吗?还有没有其他用途?”当然有了,比如笔者论坛的PHP
语法加亮显示就和这个有关(PHP默认的语法加亮显示函数会直接输出,不能保存结果,如果在每次调用都显示恐怕会很浪费CPU,笔者的论坛就把语法加亮函数显示的结果用控制缓冲区的方法保留了),大家如果感兴趣的话可以来看看!
可能现在大家对ob_start()的功能有了一定的了解,上面的一个例子看似简单,但实际上已经掌握了使用ob_start()的要点。
<1>.使用ob_start打开browser的cache,这样可以保证cache的内容在你调用flush(),ob_end_flush()(或程序执行完毕)之前不会被输出。
<2>.现在的你应该知道你所拥有的优势:可以在任何输出内容后面使用header,setcookie以及session,这是
ob_start一个很大的特点;也可以使用ob_start的参数,在cache被写入后,然后自动运行命令,比如
ob_start(\"ob_gzhandler\");而我们最常用的做法是用ob_get_contents()得到cache中的内容,然后再进行处理……
<3>.当处理完毕后,我们可以使用各种方法输出,flush(),ob_end_flush(),以及等到程序执行完毕后的自动输出。当然,如果你用的是ob_get_contents(),那么就要你自己控制输出方式了。
来,让我们看看能用ob系列函数做些什么……
一、 静态模版技术
简介:所谓静态模版技术就是通过某种方式,使得用户在client端得到的是由PHP产生的html页面。如果这个html页面不会再被更新,那么当另外的用户再次浏览此页面时,程序将不会再调用PHP以及相关的数据库,对于某些信息量比较大的网站,例如sina,163,sohu。类似这种的技术带来的好处是非常巨大的。
我所知道的实现静态输出的有两种办法:
<1>.通过y10k修改的phplib的一个叫template.inc.php类实现。
<2>.使用ob系列函数实现。
对于第一种方法,因为不是这篇文章所要研究的问题,所以不再赘述。
我们现在来看一看第二种方法的具体实现:
Example 4.
<?php
ob_start();//打开缓冲区
?>
php页面的全部输出
<?
$content =
ob_get_contents();//取得php页面输出的全部内容
$fp = fopen(“output00001.html”, “w”);
//创建一个文件,并打开,准备写入
fwrite($fp, $content);
//把php页面的内容全部写入output00001.html,然后……
fclose($fp);
?>
这样,所谓的静态模版就很容易的被实现了……
二、 捕捉输出
以上的Example
4.是一种最简单的情况,你还可以在写入前对$content进行操作……
你可以设法捕捉一些关键字,然后去对它进行再处理,比如Example
3.所述的PHP语法高亮显示。个人认为,这个功能是此函数最大的精华所在,它可以解决各种各样的问题,但需要你有足够的想象力……
Example 5.
<?
Function run_code($code) {
If($code) {
ob_start();
eval($code);
$contents = ob_get_contents();
ob_end_clean();
}else {
echo “错误!没有输出”;
exit();
}
return $contents;
}
以上这个例子的用途不是很大,不过很典型$code的本身就是一个含有变量的输出页面,而这个例子用eval把$code中的变量替换,然后对输出结果再进行输出捕捉,再一次的进行处理……
Example 6. 加快传输
<?
/*
** Title.........: PHP4 HTTP
Compression Speeds up the Web
** Version.......: 1.20
** Author........:
catoc <catoc@163.net>
** Filename......: gzdoc.php
** Last
changed..: 18/10/2000
** Requirments...: PHP4 >= 4.0.1
** PHP was
configured with --with-zlib[=DIR]
** Notes.........: Dynamic Content
Acceleration compresses
** the data transmission data on the fly
** code
by sun jin hu (catoc) <catoc@163.net>
** Most newer browsers since
1998/1999 have
** been equipped to support the HTTP 1.1
** standard
known as \"content-encoding.\"
** Essentially the browser indicates to the
** server that it can accept \"content encoding\"
** and if the server
is capable it will then
** compress the data and transmit it. The
**
browser decompresses it and then renders
** the page.
**
** Modified
by John Lim (jlim@natsoft测试数据.my)
** based on ideas by Sandy McArthur, Jr
** Usage........:
** No space before the beginning of the first
\'<?\' tag.
** ------------Start of file----------
** |<?
** |
include(\'gzdoc.php\');
** |? >
** |<HTML>
** |... the page
...
** |</HTML>
** |<?
** | gzdocout();
** |? >
** -------------End of file-----------
*/
ob_start();
ob_implicit_flush(0);
function CheckCanGzip(){
global
$HTTP_ACCEPT_ENCODING;
if (headers_sent() || connection_timeout() ||
connection_aborted()){
return 0;
}
if (strpos($HTTP_ACCEPT_ENCODING,
\'x-gzip\') !== false) return \"x-gzip\";
if
(strpos($HTTP_ACCEPT_ENCODING,\'gzip\') !== false) return \"gzip\";
return
0;
}
/* $level = compression level 0-9, 0=none, 9=max */
function
GzDocOut($level=1,$debug=0){
$ENCODING = CheckCanGzip();
if ($ENCODING){
print \"n<!-- Use compress $ENCODING -->n\";
$Contents =
ob_get_contents();
ob_end_clean();
if ($debug){
$s = \"<p>Not
compress length: \".strlen($Contents);
$s .= \"
Compressed length:
\".strlen(gzcompress($Contents,$level));
$Contents .= $s;
}
header(\"Content-Encoding: $ENCODING\");
\"x1fx8bx08x00x00x00x00x00\";
$Size = strlen($Contents);
$Crc =
crc32($Contents);
$Contents = gzcompress($Contents,$level);
$Contents =
substr($Contents, 0, strlen($Contents) - 4);
print $Contents;
pack(\'V\',$Crc);
print pack(\'V\',$Size);
exit;
}else{
ob_end_flush();
exit;
}
}
?>
这是catoc的一段很早以前的代码,是在weblogs测试数据看到的,他利用了zlib的函数,对传输的内容进行了压缩,测试表明,对于10k以上的页面,会产生效果,而且页面越大,效果越明显……
加入ob_clean()或者header('content-type:image/jpeg')也还是显示乱码你程序里面是这样写的imagejpeg($image);
参考
imagejpeg -- 以 JPEG 格式将图像输出到浏览器或文件
程序会把JPEG图片内容输出到浏览器,你应该先保存成图片文件,然后再根据显示图片文件,比如修改成如下代码
<?php
$image=imagecreate(200,100);
$black=imagecolorallocate($image,0,0,0);
$white=imagecolorallocate($image,255,255,255);
for($i=0;$i<9;$i++)
{
imageline($image,rand(0,200),rand(0,100),rand(0,200),rand(0,100),$white);
}
for($i=0;$i<150;$i++)
{
imagesetpixel($image,rand(0,200),rand(0,100),$white);
}
{
switch(rand(1,3))
{
case'1':
$ch=rand(0,9);
break;
case'2':
$ch=sprintf('%c',rand(97,122));
break;
$ch=sprintf('%c',rand(65,90));
break;
}
$str.=$ch;
}
imagettftext($image,32,rand(0,15),20,70,$white,'C:\windows\fonts\mingliu.ttc',$str);
imagejpeg($image,'/data/upload/help/202303/10/14a53cac5a312f3d1ad4980fec051d42.jpeg');
?>
<img src='/data/upload/help/202303/10/14a53cac5a312f3d1ad4980fec051d42.jpeg'></img>
怎样解决PHP中文乱码问题乱码指的是计算机系统不能显示正确的字符,而显示其他无意义的字符或空白,如一堆ASCII
Code。所显示出来的文字统称为乱码。乱码是因为所使用的字符的源码在本地计算机上使用了错误的显示字库,或在本地计算机的字库中找不到相应于源码所指代的字符所致。
通俗点讲:
乱码就是你打开王页或邮箱,里面的字不是全中文的,而是一些乱七八糟莫名其妙的无意义的字符组合在一起。主要是计算机的字库出错所致。
1一般出现在网页,用网页上面的查看——编码——简体中文即可解决。
2
出现乱码一般是Windows系统字库的问题,可能是系统错误或不正常关机造成的,也可能是某些软件需要使用操作系统以外的字库造成的。解决办法得看具体的问题,一般情况下的Windows乱码可以通过以下三种方法解决。
第一种方法是下载
解决Windows
XP
SP2乱码补丁
V1.00
(华军软件园)
第二种是解决Windows系统错误造成的乱码问题,重启后用F8键激活系统菜单,进入安全模式。等系统检查完毕,硬盘没有响应后再重新正常退出并重新启动计算机,正常进入Windows,字体一般就能自动恢复。这是因为Windows在进入安全模式时会重新索引字库及整理菜单。
第三种解决方法用于修正软件造成的注册表中关于字体部分设置出错的问题。运行“Regedit”启动注册表编辑器。在“HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\fontassoc”键下有
“Associated
CharSet”和“Associated
DefaultFonts”
两个键。当出现汉字乱码时,这两个键中的内容就可能不正确甚至不完整。它们的正确内容应该是“Associated
CharSet”内有“(默认)、ANSI(00)、GB2312(86)、OEM(FF)、SYMBOL(02)”几项串值,键值分别为“(未设置键值)、Yes、Yes、Yes、No”,而“Associated
DefaultFonts”内有“(默认)、AssocSystemFont、FontPackegeDecorative、FontPackegeDontCare、FontPackegeModern、FontPackegeRoman、FontPackegeScript、FontPackegeSwiss”几项串值,键值分别为“(未设置键值)、simsun.ttf、宋体、宋体、宋体、宋体、宋体、宋体”。重新启动系统后汉字就应该显示正确了。建议您在修改前先备份注册表,以防修改错误使系统出现问题。
php页面解决乱码问题1、文件编码:指的是页面文件(.html,.php等)本身是以何种编码来保存的。记事本和Dreamweaver在打开页面时候会自动识别文件编码因而不太会出问题。而ZendStudio却不会自动识别编码,它只会根据首选项的配置固定以某种编码打开文件,如果工作时候一不注意,用错误编码打开文件,做了修改之后一保存,乱码就出现了(我深有体会)。
2、页面申明编码:在HTML代码HEAD里面,可以用<meta http-equiv="Content-Type" content="text/html; charset="XXX" />来告诉浏览器网页采用了什么编码,目前中文网站开发中XXX主要用的是GB2312和UTF-8两种编码。
3、数据库连接编码:指的是进行数据库操作时候以哪种编码与数据库传输数据,这里需要注意的是不要与数据库本身的编码混淆,比如MySQL内部默认是latin1编码,也就是说Mysql是以latin1编码来存储数据,以其他编码传输给Mysql的数据会被转换成latin1编码。
知道了WEB开发中哪些地方涉及到了编码,也就知道了PHP页面乱码产生的原因:上述3项编码设置不一致,由于各种编码绝大部分是兼容ASCII的,所以英文符号不会出现,中文就倒霉了。下面是一些常见的错误情况与解决:
1、数据库采用UTF8编码,而页面申明编码是GB2312,这是最常见的产生乱码的原因。这时候在PHP脚本里面直接SELECT数据出来的就是PHP页面乱码,需要在查询前先使用:
mysql_query("SET NAMES GBK"); 来设定MYSQL连接编码,保证页面申明编码与这里设定的连接编码一致(GBK是GB2312的扩展)。如果页面是UTF-8编码的话,可以用:
mysql_query("SET NAMES UTF8"); 注意是UTF8而不是一般用的UTF-8。假如页面申明的编码与数据库内部编码一致可以不设定连接编码。
注:事实上MYSQL的数据输入输出比上面讲的更复杂一些,MYSQL配置文件my.ini中定义了2个默认编码,分别是[client]里的default-character-set和[mysqld]里的default-character-set来分别设定默认时候客户端连接和数据库内部所采用的编码。我们上面指定的编码其实是MYSQL客户端连接服务器时候的命令行参数character_set_client,来告诉MYSQL服务器接受到的客户端数据是什么编码的,而不是采用默认编码。
2、页面申明编码与文件本身编码不一致,这种情况很少发生,因为如果编码不一致美工做页面时候在浏览器看到的就是乱码了。更多时候是发布以后修改一些小BUG,以错误编码打开页面然后保存导致的。或者是用某些FTP软件直接在线修改文件,比如CuteFTP,由于软件编码配置错误而导致转换错了编码。
3、一些租用虚拟主机的朋友,明明上述3项编码都设置正确了还是有PHP页面乱码。比方说网页是GB2312编码的,IE等浏览器打开却总是识别成UTF-8,网页HEAD里面已经申明是GB2312了,手动修改浏览器编码为GB2312后页面显示正常。产生原因是服务器Apache设定了服务器全局的默认编码,在httpd.conf里面加了AddDefaultCharset UTF-8。这时候服务器会首先发送HTTP头给浏览器,其优先级比页面里申明编码高,自然浏览器就识别错了。解决办法有2个,请管理员在配置文件自己的虚机里加上一条AddDefaultCharset GB2312来覆盖全局配置,或者在自己目录的.htaccess里配置。
PHP中文乱码怎么解决?最好最快的解决办法就是使页面申明的编码与数据库内部编码一致,如果页面申请的编码与数据库内部的编码不一致时,那就设定连接编码。Mysql_query(“set
names
***”).
php文件本身的编码与网页的编码应匹配,如果欲使用gb2312编码,那么php要输出头
代码如下:
header(“Content-type:text/html;charset=gb2312”)
静态页面添加
代码如下:
<meta
http-equiv=”Content-type”content=”text/html;
charset=gb2312”>,所有文件的编码格式为ANSI,可用记事本打开,另存为选择编码为ANSI,覆盖源文件。
如果欲使用uft-8编码,那么php要输出头
代码如下:
header(“Content-type:text/html;
charset=utf-8”),
静态页面添加
代码如下:
<meta
http-equiv=”Content-type”content=”text/html;
charset=utf-8”>,
所有文件的编码格式为utf-8.保存为utf-8可能会有点麻烦,一般utf-8开头会有BOM,如果使用
Session就会出现问题,可用editplus软件来保存。
我也是从这里得知:
关于phpob缓存乱码的介绍到此就结束了,不知道本篇文章是否对您有帮助呢?如果你还想了解更多此类信息,记得收藏关注本站,我们会不定期更新哦。
查看更多关于phpob缓存乱码 php缓存数据到内存的详细内容...