技術(shù)頻道導(dǎo)航
HTML/CSS
.NET技術(shù)
IIS技術(shù)
PHP技術(shù)
Js/JQuery
Photoshop
Fireworks
服務(wù)器技術(shù)
操作系統(tǒng)
網(wǎng)站運(yùn)營(yíng)

贊助商

分類目錄

贊助商

最新文章

搜索

使用HTTP_IF_MODIFIED_SINCE緩存提高php執(zhí)行效率

作者:admin    時(shí)間:2012-5-22 21:38:49    瀏覽:

在php編程過程中,使用HTTP_IF_MODIFIED_SINCE緩存的技術(shù)我其實(shí)很少有用過,今天我突然有種感覺,用HTTP_IF_MODIFIED_SINCE緩存是否能在個(gè)別地方提高php的腳本執(zhí)行效率呢。于是對(duì)個(gè)別代碼進(jìn)行修改。

下文中第一段腳本被每個(gè)用戶通過AJAX請(qǐng)求調(diào)用多次,它調(diào)用不同服務(wù)器里另外一段腳本,用途是獲得文本文件的最后一行,但是我認(rèn)為還有很大的提升空間,進(jìn)一步優(yōu)化和提高效率。

AJAX 提交請(qǐng)求

<?php session_start();
$fileName = $_POST['textFile'];
$result = file_get_contents($_SESSION['serverURL']."fileReader.php?textFile=$fileName");
echo $result;
?>

它對(duì)外部腳本發(fā)出請(qǐng)求讀取一個(gè)文本文件

<?php
$fileName = $_GET['textFile'];
if (file_exists('text/'.$fileName.'.txt')) {
    $lines = file('text/'.$fileName.'.txt');
    echo $lines[sizeof($lines)-1];
}
else{
    echo 0;
}
?>

下面給出了幾種優(yōu)化方法

腳本1我做了如下優(yōu)化:

<?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可以通過緩存進(jìn)行優(yōu)化,但那樣比較復(fù)雜。

<?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));
?>

但是對(duì)于上述第2個(gè)腳本優(yōu)化,如果是在內(nèi)存讀整個(gè)文件看似需要點(diǎn)額外開銷,如果文件較小,這個(gè)優(yōu)化方法還是不錯(cuò)的。但是如果文件較大,可能使用 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);

本次優(yōu)化主要是使用了HTTP_IF_MODIFIED_SINCE緩存的技術(shù),通過這樣優(yōu)化后,程序的執(zhí)行效率有沒有提高呢,而服務(wù)器的性能是否也會(huì)因此而受到影響呢?雖然目前我還沒有正式試驗(yàn),但從程序分析上來看,優(yōu)化效果肯定不錯(cuò)。

標(biāo)簽: 緩存  
相關(guān)文章
    x
    • 站長(zhǎng)推薦
    /* 左側(cè)顯示文章內(nèi)容目錄 */