Welcome to WebmasterWorld Guest from 107.20.110.201

Forum Moderators: coopster & jatar k

Message Too Old, No Replies

gziped my own php programs?

     

irock

7:43 pm on Nov 3, 2002 (gmt 0)

WebmasterWorld Senior Member 10+ Year Member



I have recomplied PHP for my server, and I was wondering how to enable gzip for my own php programs? Is there some script I have to attach to my existing programs to do this task?

I check gzip status using this program...

[leknor.com...]

andreasfriedrich

8:23 pm on Nov 3, 2002 (gmt 0)

WebmasterWorld Senior Member 10+ Year Member



Sending the output of your php scripts gzipped is fairly easy. Just enable output buffering, do whatever your script does just as you did before, then get your scripts output and pack it.

ob_start(); 
ob_implicit_flush(0);
// your script goes here
$contents = ob_get_contents();
ob_end_clean();
$contents = gzencode($contents, 9);

Be sure to use a fairly new version of php since there used to be problems with gzencode in earlier releases.

Andreas

irock

8:53 pm on Nov 3, 2002 (gmt 0)

WebmasterWorld Senior Member 10+ Year Member



Thanks. Do you know why this script returns a blank page on Netscape 7?

I notice some websites using gzip also suffer from this 'blank page' problem. Among them are SitePoint.

andreasfriedrich

12:55 am on Nov 4, 2002 (gmt 0)

WebmasterWorld Senior Member 10+ Year Member



I believe this to be due to the aforementioned problems with gzencode. The following code should do the trick:

if (phpversion() >= '4.2') { 
$contents = gzencode($contents, 9);
} else {
$gzdata = "\x1f\x8b\x08\x00\x00\x00\x00\x00";
$size = strlen($contents);
$crc = crc32($contents);
$gzdata .= gzcompress($contents, 9);
$gzdata = substr($gzdata, 0, strlen($gzdata) - 4);
$gzdata .= pack("V",$crc) . pack("V", $size);
$contents = $gzdata;
}

BTW I donīt know whether said problem was fixed with version 4.2 (Perhaps php.net would help?). However I run one server with PHP 4.1.2 which has the empty page problem when using gzencode and one running PHP 4.2.3 which works just fine. The above code works on both servers.

Andreas

irock

1:08 am on Nov 4, 2002 (gmt 0)

WebmasterWorld Senior Member 10+ Year Member



Will turning on gzip php affect google spidering? Will Google see a blank page in some rare situations where ob_start is acting up.

andreasfriedrich

1:21 am on Nov 4, 2002 (gmt 0)

WebmasterWorld Senior Member 10+ Year Member



You need to make sure to send the gzipped output only to those UAs that indicate that they accept it. Check the Accept-Encoding field in the HTTP request header.

$ACCEPT_ENCODING = $_SERVER['HTTP_ACCEPT_ENCODING']; 
if (strpos($ACCEPT_ENCODING, 'gzip')!== false) $enc = 'gzip';
if (strpos($ACCEPT_ENCODING, 'x-gzip')!== false) $enc = 'x-gzip';

I donīt know whether Google accepts gzipped output. I would think they donīt since that would increase the load on their servers.

Andreas

andreasfriedrich

2:03 am on Nov 4, 2002 (gmt 0)

WebmasterWorld Senior Member 10+ Year Member



BTW if you are implementing sending gziped output it might be a good time to think about implementing caching and 304 Not Modified handling as well.

It is really easy.

<?php 
/*
A simple caching, zipping and If-Modified
handling script by Andreas Friedrich
$Id: cache.php,v 1.1 2002/07/16 14:45:06 af Exp $
$Name: $
*/
#
$WEB_DEV_CACHE_DIR = '/var/www/html/www.ecotur.de//cache';
Packing and Caching

Check whether the UA sending the request supports gzip.

$ACCEPT_ENCODING = $_SERVER['HTTP_ACCEPT_ENCODING']; 
if (strpos($ACCEPT_ENCODING, 'gzip')!== false) $enc = 'gzip';
if (strpos($ACCEPT_ENCODING, 'x-gzip')!== false) $enc = 'x-gzip';
Build a unique filename for the requested file. You can use caching for slightly dynamic pages as well. Just include the variables that determine what is output in the array below.

Imagine a site that serves output depending on the UA string in the HTTP request header. For requests to a given URL we would need to store a file for each different UA in our cache.

$cached_file = '/var/www/html/www.ecotur.de//cache/' 
. md5(implode('',
array($_SERVER['REQUEST_URI'],
$sessionid,
$QUERY_STRING,
$theme,
($sm? 'true' : 'fals'),
($ns4? 'true' : 'fals'),
($ns6? 'true' : 'fals'),
($moz? 'true' : 'fals'),
($op? 'true' : 'fals'),
($ie? 'true' : 'fals'),
($ie4? 'true' : 'fals'),
($ie5? 'true' : 'fals'),
($ie6? 'true' : 'fals'),
($linux? 'true' : 'fals'),
($mac? 'true' : 'fals'),
$page,
$desired_language,
))) . '_' . $enc;
If the response needs to be handled by the main script as is the case if the UA send a cookie or posted some data or the cached file is invalid or does not exist we start output buffering and run the script. Then we write the output to disk.

if (count($_COOKIE)>0 
or $_SERVER['REQUEST_METHOD']=='POST'
or (!is_valid($cached_file))
or ($info = @stat($cached_file)) == false
) {
/* If there's no file or it's invalid we generate the output */
ob_start();
ob_implicit_flush(0);
#
include($file);
#
write_contents2cache($cached_file, $enc);
}
If-Modified Handling

If the UA sent a conditional request we check whether the cached file was changed since the time the UA supplied. If not we return a 'HTTP/1.0 304 Not Modified' status and exit the script.

/* Send 304 Not Modified if there were no  
changes since last request */
$last = strtotime($info['mtime']);
$cond = isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])?
$_SERVER['HTTP_IF_MODIFIED_SINCE'] : 0;
#
if ($cond and $_SERVER['REQUEST_METHOD'] == 'GET'
and strtotime($cond) >= $last) {
header('HTTP/1.0 304 Not Modified');
exit;
}
Now that we are sure a valid output file exists we send the appropriate header fields and then the actual file.

/* Output the file now that we are sure the file exists */ 
if ($enc) {
header("Content-Encoding: $enc");
$size = filesize($cached_file);
header("Content-Length: $size");
}
#
readfile($cached_file);
After sending the file we decide whether we want to keep the cached version or not. If it is highly dynamic (.i.e. uses cookies or posted data or contains a session id) we delete it.

if (isset($sessionid) 
or isset($_COOKIE['authorid'])
or $_SERVER['REQUEST_METHOD']=='POST'
or count($_COOKIE)>0) @unlink($cached_file);
if ($local) @unlink($cached_file);
#
?>

It might be better to save the file to disk only after we decide we want to keep it. This will eliminate the time to access the hd and write and delete the file.

Hope this helps and is useful.

Andreas

martin

11:02 am on Nov 4, 2002 (gmt 0)

10+ Year Member



In PHP >= 4.0.4 you can use

<?php
ob_start('ob_gzhandler');
?>

It also supports deflated encoding and will check the HTTP headers for you, returning non-compressed pages to browsers which don't support it.

andreasfriedrich

2:53 pm on Nov 4, 2002 (gmt 0)

WebmasterWorld Senior Member 10+ Year Member



And you will suffer from the same problems as using gzencode in PHP versions prior to 4.2.

Andreas

martin

4:48 pm on Nov 4, 2002 (gmt 0)

10+ Year Member



My host is PHP 4.2.3 and I haven't seen any problems.

andreasfriedrich

6:10 pm on Nov 4, 2002 (gmt 0)

WebmasterWorld Senior Member 10+ Year Member



Exactly. 4.2.3 is a later version than 4.2. So everything is working ok. The problem exists with servers running PHP versions prior to 4.2.

Andreas

 

Featured Threads

Hot Threads This Week

Hot Threads This Month