php代碼優化及php相關問題總結

php代碼優化及php相關問題總結

轉自:http://hi.baidu.com/ere%5F/blog/item/95a87e8d8e9c4312b21bbaf3.html

1,在函數中,傳遞數組時
使用 return 比使用 global 要高效
比如

function userloginfo($usertemp){
$detail=explode("|",$usertemp);
return $detail;
}
$login=userloginfo($userdb);



function userloginfo($usertemp){
global $detail;
$detail=explode("|",$usertemp);
}
userloginfo($userdb);


要高效
2,(這個代碼用於得到程序目錄對應的網址,推薦使用)
$urlarray=explode('/',$HTTP_SERVER_VARS['REQUEST_URI']);
$urlcount=count($urlarray);unset($urlarray[$urlcount-1]);
$ofstarurl='http://'.$HTTP_SERVER_VARS['HTTP_HOST'].implode('/',$urlarray);

這段代碼比
$pre_urlarray=explode('/',$HTTP_SERVER_VARS['HTTP_REFERER']);
$pre_url=array_pop($pre_urlarray);
要高效
3,在循環中判斷時,數值判斷使用恆等要比等於高效
$a=2;$b=2;
比如
if($a==$b)$c=$a;

if($a===$b)$c=$a;
高效
4,mysql 查詢時儘量使用where in 少用 limit 
limit查多記錄的前幾條, 速度很快, 但是查詢最面幾條就會慢
使用in .在查詢連續性記錄,非常快, 非連續性記錄第一次運行會稍微慢一點,但是之後將比較快!
5,NT服務器數據操作穩定性不及unix/linux

6,輸出前使用盡量使用 ob_start(); 可以加快輸出速度,適用NT或nuli/linux,對unlix類服務器 如果使用 ob_start('ob_gzhandler');輸出效率將更高

7,判斷的時候儘量使用if($a==他的值) 否定的時候儘量使用if(empty($a)),因爲這樣程序運行更快速

8,使用不等時 != 與 <> 效率相當

9,個人經驗得 使用 $a="11111111111111"; 的效率和 $a='11111111111111'; 相當.並不象書本說的相差很大

10,使用規範的SQL語句, 會有利於MySQL的解析

11,使用

if($online){
$online1=$online;
setcookie('online1',$online,$cookietime,$ckpath,$ckdomain,$secure);
}


COOKIE將馬上生效
使用

if($online)
setcookie('online1',$online,$cookietime,$ckpath,$ckdomain,$secure);

COOKIE需要再刷新一次才能生效
12,使用
$handle=fopen($filename,wb);
flock($handle,LOCK_SH);
$filedata=fread($handle,filesize($filename));
fclose($handle);



file($filename);
無論在速度還是穩定上都要優秀
13,截斷字符串優化函數(可避免?字符出現)
function substrs($content,$length) {
if(strlen($content)>$length){
$num=0;
for($i=0;$i<$length-3;$i++) {
if(ord($content[$i])>127)$num++;
}
$num%2==1 ? $content=substr($content,0,$length-4)content=substr($content,0,$length-3);
$content.=' ...';
}
return $content;
}

比如$newarray[1]=substrs($newarray[1],25);

14,程序中屏蔽大小寫
for ($asc=65;$asc<=90;$asc++)
{ //strtolower() 此函數在一些服務器會產生亂碼!
if (strrpos($regname,chr($asc))!==false)
{
$error="爲了避免用戶名混亂,用戶名中禁止使用大寫字母,請使用小寫字母";
$reg_check=0; 



15,不使用 file();和不使用 fget();(不穩定或速度慢) 取一數組函數

function openfile($filename,$method="rb")
{
[email=$handle=@fopen($filename,$method]$handle=@fopen($filename,$method[/email]);
@flock($handle,LOCK_SH);
@$filedata=fread($handle,filesize($filename));
@fclose($handle);
$filedata=str_replace("/n","/n<ofstar:>",$filedata);
$filedb=explode("<ofstar:>",$filedata);
//array_pop($filedb);
$count=count($filedb);
if($filedb[$count-1]==''){unset($filedb[$count-1]);}
return $filedb;
}
//這個函數雖然代碼比較多,不過在速度和穩定性上優勢很大!

PHP應用程序的性能優化
放出來,不知有多少人會去看完,但好東西一定要分享出來自己才覺得有價值.
by soola

使用PHP編程的最大好處是學習這種編程語言非常容易以及其豐富的庫。即使對需要使用的函數不是十分了解,我們也能夠猜測出如何完成一個特定的任務。
儘管PHP非常簡單易學,但我們仍然需要花費一點時間來學習PHP的一些編程技巧,尤其是與性能和內存佔用相關的技巧。在PHP中,有許多小技巧能夠使我們減少內存的佔用,並提高應用程序的性能。在本篇文章中,我們將對PHP應用程序的分析、如何改變腳本代碼以及比較優化前後的各種參數值進行簡要的介紹。

通過在程序中設置計時的程序,並反覆執行這些代碼,我們可以獲得有關程序執行速度的一組數據,這些數據可以可以用來發現程序中的瓶頸,以及如何進行優化,提高應用程序的性能。

也許讀者曾經聽說過PEAR庫吧。我們將使用PEAR庫創建在分析時需要使用的例子,這也是對現有的代碼進行分析的最簡單的方法,它使我們無需使用商用產品就能對代碼進行分析。
我們要使用的庫的名字是PEAR::Benchmark,它對於對代碼進行分析和性能測試非常有用。這個庫提供一個名字爲Benchmark_Timer()的類,能夠記錄一個函數調用和下一個函數調用之間的時間。在對代碼的性能進行測試時,我們可以得到一個詳細的腳本執行結果,它非常簡單,如下所示:
<?php
include_once("Benchmark/Timer.php");
  $bench = new Benchmark_Timer; $bench->start();
  $bench->setMarker('Start of the script'); 現在處於睡眠狀態幾分鐘
  sleep(5); $bench->stop(); // 從計時器中獲得分析信息
  print_r($bench->getProfiling());
?>


上面代碼執行後的輸出如下所示:


Array
  (
  [0] => Array
  (
  [name] => Start
  [time] => 1013214253.05751200
  [diff] => -
  [total] => 0
  )
[1] => Array
  (
  [name] => Start of the script
  [time] => 1013214253.05761100
  [diff] => 9.8943710327148E-05
  [total] => 9.8943710327148E-05
  )
[2] => Array
  (
  [name] => Stop
  [time] => 1013214258.04920700
  [diff] => 4.9915959835052
  [total] => 4.9916949272156
  )
  )
上面的數字似乎是一組雜亂無章的數字,但如果程序的規模更大,這些數字就十分地有用了。
也許廣大讀者也能猜測到,數組的第一個表目是實際調用Benchmark_Timer()類的方法,例如
$bench->start()、$bench->setMarker()和$bench->stop(),與這些表目有關的數字是相當簡單的,現在我們來仔細地研究這些數字:

[0] => Array
  (
  [name] => Start
  [time] => 1013214253.05751200
  [diff] => -
  [total] => 0
  )

time表目指的是何時對Benchmark_Timer()的start()方法調用的UNIX的timestamp,diff表目表示這次調用和上次調用之間的時間間隔,由於這裏沒有上一次,因此顯示出了一個破折號,total表目指的是自測試開始到這一特定的調用之前代碼運行的總的時間。下面我們來看看下一個數組的輸出:

[1] => Array
  (
  [name] => Start of the script
  [time] => 1013214253.05761100
  [diff] => 9.8943710327148E-05
  [total] => 9.8943710327148E-05
  )

從上面的數字我們可以看出,在調用$bench->start()之後,程序運行了9.8943710327148E-05秒(也就是 
>0.0000989秒)後開始調用$bench->setMarker(....)。
一次真實的性能測試經歷
儘管上面的例子不錯,但在對於決定如何優化你的站點代碼設計方面,它真的不能算是一個好例子。下面我將用我自己作爲網站技術人員的一段親身經歷來說明如何解決性能方面存在的問題。
我並不大理解網站使用的代碼,因爲它是根據特殊的需求,歷經多年開發而成的━━其中的一個模塊包括網站轉換代碼,另一個模塊記錄網站的使用情況,其他的模塊也各有各的作用。我和網站的主要開發者都意識到網站的代碼需要優化,但又不清楚問題出在哪兒。
爲了儘快地完成任務,我開始研究網站的主要腳本代碼,並在全部腳本代碼以及其包含文件中添加了一些$bench->setMarker()命令,然後分析$bench->getProfiling()的輸出,並對得到的結果大吃一驚,原來問題出在一個與獲得特定語言名字(例如en代表english)的轉換代碼的函數調用中,該函數在每個頁面上都會被使用數百次。每次調用該函數時,腳本代碼都會對一個MySQL數據庫進行查詢,從一個數據庫表中獲得真正的語言名字。
於是我們這一類的信息創建了一個緩衝系統。經過短短2天時間的工作,我們使系統的性能得到了很大的提高,第一週內頁面的瀏覽量也因此而增加了40%。當然了,這只是一個有關分析代碼能夠提高互聯網應用或互聯網網站性能的例子。 

性能測試函數調用

在分析一個腳本或網頁(以及其包含文件)時,儘管Benchmark_Timer()特別有用,但它並不科學,因爲要獲得分析的數據我們必須多次加載腳本,而且它也不是針對某個類或函數調用的。

PEAR::Benchmark庫中的另一個被稱作Benchmark_Iterator的類能夠很好地解決這一個問題,它能夠針對特定的函數或類的方法,顯示其分析信息。它的用途是能夠能夠從測試中獲得一致的結果,因爲我們知道,如果運行一段腳本一次,其運行時間爲10秒,並不意味着它每次的運行時間總是10秒。

In any case, let's see some examples: 

// 連接數據庫的代碼

  include_once("DB.php");
  $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:B
  $created_date = $dbh->getOne($stmt);
  if ((PEAR::isError($created_date)) || 
  (empty($created_date))) {
  return false;
  } else {
  return $created_date;
  }
  }include_once 'Benchmark/Iterate.php';
  $bench = new Benchmark_Iterate; // 運行getDate函數10次
  $bench->run(10, 'getCreatedDate', 1);// 打印分析信息
  print_r($bench->get());
  ?> 

運行上面的代碼能夠產生與下面相似的結果:
Array
  (
  [1] => 0.055413007736206
  [2] => 0.0012860298156738
  [3] => 0.0010279417037964
  [4] => 0.00093603134155273
  [5] => 0.00094103813171387
  [6] => 0.00092899799346924
  [7] => 0.0010659694671631
  [8] => 0.00096404552459717
  [9] => 0.0010690689086914
  [10] => 0.00093603134155273
  [mean] => 0.0064568161964417
  [iterations] => 10
  )


上面的這些數字很好理解,mean條目表示getCreatedDate()函數10次運行的平均時間。在進行實際測試時,應該至少運行1000次,但這個例子得出的結果已經足夠說明問題了。


結束語

希望廣大讀者能夠通過本篇文章掌握如何迅速地對PHP代碼進行分析的基本方法。在這裏我還還要提醒廣大讀者的是,對代碼進行分析不是一件簡單的事兒,因爲我們必須掌握大量的有關該種語言的特性。在代碼中添加計時用的代碼有助於找出運行速度緩慢的函數,利用多次重複的方法使我們能夠發現對代碼進行正確優化的方法。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章