찾다
백엔드 개발PHP 튜토리얼控制PHP的输出:缓存并压缩动态页面_PHP教程

控制PHP的输出:缓存并压缩动态页面_PHP教程

Jul 21, 2016 pm 03:06 PM
apachegzipmodphp사용기능동적압축제어기준 치수~의은닉처산출페이지

mod_gzip是一个Apache模块,其功能是使用Gzip压缩静态的html页面,遵循IETF标准的浏览器可以接受gzip编码(IE, Netscape等)。mod_gzip可以将页面的下载时间提高4-5倍。我强烈建议你在你的web服务器上使用mod_gzip。然而,我们还必须用PHP建立我们自己的压缩引擎。在这篇文章里,我将要介绍如何使用PHP的输出控制函数来大幅加速页面载入速度。

介绍PHP的输出控制函数

PHP4中最令人满意的事是——你可以让PHP缓存所有由脚本生成的输出,在你决定把它们送出之前,浏览器方是不会收到任何内容的。在脚本程序中你能用这些函数来设置header、cookies,然而这只是强大的输出函数的一小部分功能。

复制代码 代码如下:

void ob_start(void);
?>

告诉PHP处理器把所有的输出重定向到一个内部的缓存(buffer)中。在调用ob_start之前,没有输出会被送到浏览器去。

复制代码 代码如下:

string ob_get_contents(void);
?>

该函数将“输出缓存”(output buffer)以字符串的形式返回。你可以调用该函数把积累下来的输出送到浏览器中。(仅在把buffering功能关闭之后!!)

复制代码 代码如下:

int ob_get_length(void);
?>

返回缓存中的字符串的长度。

复制代码 代码如下:

void ob_end_clean(void);
?>

清空输出缓存,并将输出缓存关闭。在缓存中的内容输出到浏览器之前,必须使用这个函数。
void 501([int flag])
用来打开/关闭隐含的flush动作开关(默认是关)。如果flush是开的,每次调用print/echo或是其它输出命令的时候,输出的内容会被立即送到浏览器端。

使用输出控制来压缩PHP输出
你必须使用PHP4里编译的Zlib扩展包来压缩输出。如果需要的话,可以查看PHP文档中有关Zlib包的安装指导。
首先,初始化输出缓存:

复制代码 代码如下:

ob_start();
ob_implicit_flush(0);
?>

之后,用print, echo, 或其他你喜欢的方法生成所有输出内容,例如:

复制代码 代码如下:

print("Hey this is a compressed output!");
?>

页面生成后,我们取回输出内容:

复制代码 代码如下:

$contents = ob_get_contents();
ob_end_clean();
?>

之后,必须检测浏览器是否支持压缩数据。如果支持,浏览器会发给服务器端一个ACCEPT-ENCODEING HTTP头。我们只需检查$HTTP_ACCEPT_ENCODING变量中是否有“gzip,deflate”字串。

复制代码 代码如下:

if(ereg('gzip, deflate',$HTTP_ACCEPT_ENCODING)) {
// 在这里生成 Gzip 压缩的内容
} else {
echo $contents;
}
?>

这种方法使用起来既简单又结构清晰。下面让我们看看如何生成压缩的输出:

复制代码 代码如下:

//告诉浏览器将要收到的是gzip数据
//当然在此之前,你已经检查了它们是否支持gzip,x-gzip数据格式
//如果支持的是x-gzip,那么下面的头就要用z-gzip来代替
header("Content-Encoding: gzip");

//显示gzip文件的头
//只需显示一次
echo "x1fx8bx08x00x00x00x00x00";

//计算出文件的大小和CRC码
$Size = strlen($contents);
$Crc = crc32($contents);

//压缩数据
$contents = gzcompress($contents, 9);

//我们不能就这样输出,因为CRC码是混乱的。
//如果我在这里使用“echo $contents”,压缩的数据会被送出,
//但是却不完整。文件最后的四个字节是CRC校验码,可是只发出去了三个字节。
//最后一个字节被丢掉了。我不知道这个bug在4.0.2版中解决了没有,
//不过最好避免错误的方法是把正确的CRC校验码加到压缩的数据的末尾。
//
//把旧的CRC校验码剥离
$contents = substr($contents, 0, strlen($contents) - 4);

//仅显示压缩的数据
echo $contents;

//输出CRC,和原来数据的大小(字节)
gzip_PrintFourChars($Crc);
gzip_PrintFourChars($Size);

function gzip_PrintFourChars($Val) {
for ($i = 0; $i echo chr($Val % 256);
$Val = floor($Val / 256);
}
}

?>
//好了,你还可以按此方式附加上更多的压缩数据。

要想进行实际的测试,所有的脚本代码如下:

复制代码 代码如下:

ob_start();
ob_implicit_flush(0);

print("I'm compressed!n");

$contents = ob_get_contents();
ob_end_clean();

header("Content-Encoding: gzip");

echo "x1fx8bx08x00x00x00x00x00";

$Size = strlen($contents);
$Crc = crc32($contents);

$contents = gzcompress($contents, 9);

$contents = substr($contents, 0, strlen($contents) - 4);

echo $contents;

gzip_PrintFourChars($Crc);
gzip_PrintFourChars($Size);

function gzip_PrintFourChars($Val) {
for ($i = 0; $i echo chr($Val % 256);
$Val = floor($Val / 256);
}
}
?>

缓存PHP输出

当PHP4还没问世,我不得不使用PHP3的时候,我对开发一些缓存机制来减少数据库的载入、对文件系统的存取十分感兴趣。在PHP3中没有什么特别好的方法,但是有了输出缓存之后,在PHP4中一切变得容易多了。
这有一个简单的例子:

复制代码 代码如下:

//为请求的URI构造一个文件名
$cached_file=md5($REQUEST_URI);

if((!file_exists("/cache/$cached_file"))||(!is_valid("/cache/$cached_file"))) {
//is_valid函数验证缓存,你可以用这个函数检查Cache是否过期或其他特定的条件。
//如果文件不在Cache中或者不可用则生成输出
ob_start();
ob_implicit_flush(0);
//在此输出……

$contents = ob_get_contents();
ob_end_clean();
$fil=fopen($cached_file,"w+");
fwrite($fil,$contents,$strlen($contents));
fclose($fil);
}

/如果请求的文件在缓存中且可用,则:
readfile($cached_file);

?>

这是一个简单的例子,使用输出缓存,你可以建立一个复杂的内容生成系统,对不同的块或程序使用不同的缓存机制,等等……

结论

PHP输出控制函数对把脚本生成的输出重定向到缓存中十分有用。为支持gzip的浏览器输出压过的缓存数据可以减少载入时间。也可作为缓存机制来减少对数据源的存取(数据库或文件),这对使用XML意义重大。
如果我们用PHP建立一个引擎,缓存从数据源得到的数据(xml文档和数据库),并且动态的生成XML格式的内容(没有外观-presentation)我们可以得到这些XML的输出,并使用XSLT转换成任意一种我们想要的外观格式(html, wap, palm, pdf等)。使用PHP4的输出缓存和Sablotron XSLT扩展可以很好地完成这个任务。

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/327582.htmlTechArticlemod_gzip是一个Apache模块,其功能是使用Gzip压缩静态的html页面,遵循IETF标准的浏览器可以接受gzip编码(IE, Netscape等)。mod_gzip可以将页面的...
성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
PHP 세션이 이미 시작되었는지 어떻게 확인할 수 있습니까?PHP 세션이 이미 시작되었는지 어떻게 확인할 수 있습니까?Apr 30, 2025 am 12:20 AM

PHP에서는 session_status () 또는 session_id ()를 사용하여 세션이 시작되었는지 확인할 수 있습니다. 1) session_status () 함수를 사용하십시오. php_session_active가 반환되면 세션이 시작되었습니다. 2) session_id () 함수를 사용하십시오. 비어 있지 않은 문자열이 반환되면 세션이 시작되었습니다. 두 방법 모두 세션 상태를 효과적으로 확인할 수 있으며 사용할 방법을 선택하면 PHP 버전 및 개인 선호도에 따라 다릅니다.

웹 응용 프로그램에서 세션을 사용하는 것이 필수적인 시나리오를 설명하십시오.웹 응용 프로그램에서 세션을 사용하는 것이 필수적인 시나리오를 설명하십시오.Apr 30, 2025 am 12:16 AM

SessionSareVitalInWebApplications, 특히 상수도가 포함되어 있습니다.

PHP에서 동시 세션 액세스를 어떻게 관리 할 수 ​​있습니까?PHP에서 동시 세션 액세스를 어떻게 관리 할 수 ​​있습니까?Apr 30, 2025 am 12:11 AM

PHP에서 동시 세션 액세스 관리 다음 방법으로 수행 할 수 있습니다. 1. 데이터베이스를 사용하여 세션 데이터를 저장하십시오. 이러한 방법은 데이터 일관성을 보장하고 동시성 성능을 향상시키는 데 도움이됩니다.

PHP 세션 사용의 한계는 무엇입니까?PHP 세션 사용의 한계는 무엇입니까?Apr 30, 2025 am 12:04 AM

phpsessionshaveseverallimitations : 1) StorageConstraintsCanleadToperFormanceIssues; 2) SecurityVulnerabilitiesSessionFixationAtCATACKSEXIST; 3) 확장 성분이 ANCHALLENGINGDUETOSERVERS-SCIFICSTORAGE; 4) SessionExpirationManagementCanbeproblematic; 5) Datapersis

로드 밸런싱이 세션 관리에 어떤 영향을 미치는지 설명하고 해결 방법을 설명하십시오.로드 밸런싱이 세션 관리에 어떤 영향을 미치는지 설명하고 해결 방법을 설명하십시오.Apr 29, 2025 am 12:42 AM

로드 밸런싱은 세션 관리에 영향을 미치지 만 세션 복제, 세션 끈적임 및 중앙 집중식 세션 스토리지로 해결할 수 있습니다. 1. 세션 복제 복사 서버 간의 세션 데이터. 2. 세션 끈은 사용자 요청을 동일한 서버로 안내합니다. 3. 중앙 집중식 세션 스토리지는 Redis와 같은 독립 서버를 사용하여 세션 데이터를 저장하여 데이터 공유를 보장합니다.

세션 잠금의 개념을 설명하십시오.세션 잠금의 개념을 설명하십시오.Apr 29, 2025 am 12:39 AM

SessionLockingIsateChniqueSureDureauser의 SessionLockingSsessionRemainSexclusivetoOneuseratatime.itiscrucialforpreptingdatacorruptionandsecurityBreachesInmulti-userApplications.sessionLockingSogingSompletEdusingserVerver-sidelockingMegynisms, unrasprantlockinj

PHP 세션에 대한 대안이 있습니까?PHP 세션에 대한 대안이 있습니까?Apr 29, 2025 am 12:36 AM

PHP 세션의 대안에는 쿠키, 토큰 기반 인증, 데이터베이스 기반 세션 및 Redis/Memcached가 포함됩니다. 1. Cookies는 클라이언트에 데이터를 저장하여 세션을 관리합니다. 이는 단순하지만 보안이 적습니다. 2. Token 기반 인증은 토큰을 사용하여 사용자를 확인합니다. 이는 매우 안전하지만 추가 논리가 필요합니다. 3. Database 기반 세션은 데이터베이스에 데이터를 저장하여 확장 성이 좋지만 성능에 영향을 줄 수 있습니다. 4. Redis/Memcached는 분산 캐시를 사용하여 성능 및 확장 성을 향상하지만 추가 일치가 필요합니다.

PHP의 맥락에서 '세션 납치'라는 용어를 정의하십시오.PHP의 맥락에서 '세션 납치'라는 용어를 정의하십시오.Apr 29, 2025 am 12:33 AM

SessionHijacking은 사용자의 SessionID를 얻음으로써 사용자를 가장하는 공격자를 말합니다. 예방 방법은 다음과 같습니다. 1) HTTPS를 사용한 의사 소통 암호화; 2) SessionID의 출처를 확인; 3) 보안 세션 생성 알고리즘 사용; 4) 정기적으로 SessionID를 업데이트합니다.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

MinGW - Windows용 미니멀리스트 GNU

MinGW - Windows용 미니멀리스트 GNU

이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

VSCode Windows 64비트 다운로드

VSCode Windows 64비트 다운로드

Microsoft에서 출시한 강력한 무료 IDE 편집기

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

SublimeText3 영어 버전

SublimeText3 영어 버전

권장 사항: Win 버전, 코드 프롬프트 지원!