熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> MySQL >> 正文

用PHP連mysql和oracle數據庫性能比較

2013-11-23 21:03:15  來源: MySQL 

  使用PHP編程的最大好處是學習這種編程語言非常容易以及其豐富的庫即使對需要使用的函數不是十分了解我們也能夠猜測出如何完成一個特定的任務
  
  盡管PHP非常簡單易學但我們仍然需要花費一點時間來學習PHP的一些編程技巧尤其是與性能和內存占用相關的技巧在PHP中有許多小技巧能夠使我們減少內存的占用並提高應用程序的性能在本篇文章中我們將對PHP應用程序的分析如何改變腳本代碼以及比較優化前後的各種參數值進行簡要的介紹
  
  通過在程序中設置計時的程序並反復執行這些代碼我們可以獲得有關程序執行速度的一組數據這些數據可以可以用來發現程序中的瓶頸以及如何進行優化提高應用程序的性能
  
  也許讀者曾經聽說過PEAR庫吧我們將使用PEAR庫創建在分析時需要使用的例子這也是對現有的代碼進行分析的最簡單的方法它使我們無需使用商用產品就能對代碼進行分析
  
  我們要使用的庫的名字是PEAR::Benchmark它對於對代碼進行分析和性能測試非常有用這個庫提供一個名字為Benchmark_Timer()的類能夠記錄一個函數調用和下一個函數調用之間的時間在對代碼的性能進行測試時我們可以得到一個詳細的腳本執行結果它非常簡單如下所示
  
  include_once(Benchmark/Timerphp);
  $bench = new Benchmark_Timer;
  
  $bench>start();
  $bench>setMarker(Start of the script);
  
  // 現在處於睡眠狀態幾分鐘
  sleep();
  
  $bench>stop();
  
  // 從計時器中獲得分析信息
  print_r($bench>getProfiling());
  ?>
  
  上面代碼執行後的輸出如下所示
  
  Array
  (
  [] => Array
  (
  [name] => Start
  [time] =>
  [diff] =>
  [total] =>
  )
  
  [] => Array
  (
  [name] => Start of the script
  [time] =>
  [diff] => E
  [total] => E
  )
  
  [] => Array
  (
  [name] => Stop
  [time] =>
  [diff] =>
  [total] =>
  )
  
  )
  
  上面的數字似乎是一組雜亂無章的數字但如果程序的規模更大這些數字就十分地有用了
  
  也許廣大讀者也能猜測到數組的第一個表目是實際調用Benchmark_Timer()類的方法例如
  
  $bench>start()$bench>setMarker()和$bench>stop()與這些表目有關的數字是相當簡單的
  現在我們來仔細地研究這些數字
  [] => Array
  
  (
  
  [name] => Start
  
  [time] =>
  
  [diff] =>
  
  [total] =>
  
  )
  
  time表目指的是何時對Benchmark_Timer()的start()方法調用的UNIX的timestampdiff表目表示這次調用和上次調用之間的時間間隔由於這裡沒有上一次因此顯示出了一個破折號total表目指的是自測試開始到這一特定的調用之前代碼運行的總的時間下面我們來看看下一個數組的輸出
  
  [] => Array
  
  (
  
  [name] => Start of the script
  
  [time] =>
  
  [diff] => E
  
  [total] => E
  
  )
  
  從上面的數字我們可以看出在調用$bench>start()之後程序運行了E秒(也就是
  
  秒)後開始調用$bench>setMarker()
  
  一次真實的性能測試經歷
  盡管上面的例子不錯但在對於決定如何優化你的站點代碼設計方面它真的不能算是一個好例子下面我將用我自己作為網站技術人員的一段親身經歷來說明如何解決性能方面存在的問題
  
  我並不大理解網站使用的代碼因為它是根據特殊的需求歷經多年開發而成的━━其中的一個模塊包括網站轉換代碼另一個模塊記錄網站的使用情況其他的模塊也各有各的作用我和網站的主要開發者都意識到網站的代碼需要優化但又不清楚問題出在哪兒
  
  為了盡快地完成任務我開始研究網站的主要腳本代碼並在全部腳本代碼以及其包含文件中添加了一些
  
  $bench>setMarker()命令然後分析$bench>getProfiling()的輸出並對得到的結果大吃一驚原來問題出在一個與獲得特定語言名字(例如en代表english)的轉換代碼的函數調用中該函數在每個頁面上都會被使用數百次每次調用該函數時腳本代碼都會對一個MySQL數據庫進行查詢從一個數據庫表中獲得真正的語言名字
  
  於是我們這一類的信息創建了一個緩沖系統經過短短天時間的工作我們使系統的性能得到了很大的提高第一周內頁面的浏覽量也因此而增加了%當然了這只是一個有關分析代碼能夠提高互聯網應用或互聯網網站性能的例子
  
  性能測試函數調用
  在分析一個腳本或網頁(以及其包含文件)時盡管Benchmark_Timer()特別有用但它並不科學因為要獲得分析的數據我們必須多次加載腳本而且它也不是針對某個類或函數調用的
  
  PEAR::Benchmark庫中的另一個被稱作Benchmark_Iterator的類能夠很好地解決這一個問題它能夠針對特定的函數或類的方法顯示其分析信息它的用途是能夠能夠從測試中獲得一致的結果因為我們知道如果運行一段腳本一次其運行時間為並不意味著它每次的運行時間總是
  
  In any case lets see some examples:
  
  // 連接數據庫的代碼
  include_once(DBphp);
  $dsn = array(
  phptype => mysql
  hostspec => localhost
  database => database_name
  username => user_name
  password => password
  );
  $dbh = DB::connect($dsn);
  
  function getCreatedDate($id)
  {
  global $dbh;
  
  >$stmt = SELECT created_date FROM users WHERE id=$id;
  // 在這裡使用PEAR::DB
  $created_date = $dbh>getOne($stmt);
  if ((PEAR::isError($created_date)) ||
  (empty($created_date))) {
  return false;
  } else {
  return $created_date;
  }
  }
  
  include_once Benchmark/Iteratephp;
  $bench = new Benchmark_Iterate;
  
  // 運行getDate函數
  $bench>run( getCreatedDate );
  
  // 打印分析信息
  print_r($bench>get());
  ?>
  
  運行上面的代碼能夠產生與下面相似的結果
  
  Array
  (
  [] =>
  [] =>
  [] =>
  [] =>
  [] =>
  [] =>
  [] =>
  [] =>
  [] =>
  [] =>
  [mean] =>
  [iterations] =>
  )
  
  上面的這些數字很好理解mean條目表示getCreatedDate()函數次運行的平均時間在進行實際測試時應該至少運行但這個例子得出的結果已經足夠說明問題了
  
  結束語
  希望廣大讀者能夠通過本篇文章掌握如何迅速地對PHP代碼進行分析的基本方法在這裡我還還要提醒廣大讀者的是對代碼進行分析不是一件簡單的事兒因為我們必須掌握大量的有關該種語言的特性在代碼中添加計時用的代碼有助於找出運行速度緩慢的函數利用多次重復的方法使我們能夠發現對代碼進行正確優化的方法

From:http://tw.wingwit.com/Article/program/MySQL/201311/29504.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.