使用HTTP_IF_MODIFIED_SINCE缓存提高php执行效率
作者:admin 时间:2012-5-22 21:38:49 浏览:3147在php编程过程中,使用HTTP_IF_MODIFIED_SINCE缓存的技术我其实很少有用过,今天我突然有种感觉,用HTTP_IF_MODIFIED_SINCE缓存是否能在个别地方提高php的脚本执行效率呢。于是对个别代码进行修改。
下文中第一段脚本被每个用户通过AJAX请求调用多次,它调用不同服务器里另外一段脚本,用途是获得文本文件的最后一行,但是我认为还有很大的提升空间,进一步优化和提高效率。
AJAX 提交请求
- <?php session_start();
- $fileName = $_POST['textFile'];
- $result = file_get_contents($_SESSION['serverURL']."fileReader.php?textFile=$fileName");
- echo $result;
- ?>
它对外部脚本发出请求读取一个文本文件
- <?php
- $fileName = $_GET['textFile'];
- if (file_exists('text/'.$fileName.'.txt')) {
- $lines = file('text/'.$fileName.'.txt');
- echo $lines[sizeof($lines)-1];
- }
- else{
- echo 0;
- }
- ?>
下面给出了几种优化方法
脚本1我做了如下优化:
- <?php
- session_start();
- // added basic argument filtering
- $fileName = preg_replace('/[^A-Za-z0-9_]/', '', $_POST['textFile']);
- $fileName = $_SESSION['serverURL'].'text/'.$fileName.'.txt';
- if (file_exists($fileName)) {
- // script 2 could be pasted here
- //for the entire file
- //readfile($fileName);
- //for just the last line
- $lines = file($fileName);
- echo $lines[count($lines)-1];
- exit(0);
- }
- echo 0;
- ?>
脚本2可以通过缓存进行优化,但那样比较复杂。
- <?php
- $lastModifiedTimeStamp filemtime($fileName);
- if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
- $browserCachedCopyTimestamp = strtotime(preg_replace('/;.*$/', '', $_SERVER['HTTP_IF_MODIFIED_SINCE']));
- if ($browserCachedCopyTimestamp >= $lastModifiedTimeStamp) {
- header("HTTP/1.0 304 Not Modified");
- exit(0);
- }
- }
- header('Content-Length: '.filesize($fileName));
- header('Expires: '.gmdate('D, d M Y H:i:s \G\M\T', time() + 604800)); // (3600 * 24 * 7)
- header('Last-Modified: '.date('D, d M Y H:i:s \G\M\T', $lastModifiedTimeStamp));
- ?>
但是对于上述第2个脚本优化,如果是在内存读整个文件看似需要点额外开销,如果文件较小,这个优化方法还是不错的。但是如果文件较大,可能使用 fopen() 、 fseek() 、fread()更好些。
- $filePointer = fopen($fileName, 'r');
- $i = 1;
- $chunkSize = 200;
- do {
- fseek($filePointer, -($i * $chunkSize), SEEK_END);
- $line = fread($filePointer, $i++ * $chunkSize);
- } while (($pos = strrpos($line, "\n")) === false);
- return substr($line, $pos + 1);
本次优化主要是使用了HTTP_IF_MODIFIED_SINCE缓存的技术,通过这样优化后,程序的执行效率有没有提高呢,而服务器的性能是否也会因此而受到影响呢?虽然目前我还没有正式试验,但从程序分析上来看,优化效果肯定不错。