PHP一些有意思的小區別_php技巧
來源:互聯網
上載者:User
單引號'和雙引號"的區別:
首先是單引號要比雙引號執行效率要高,因為雙引號會對內容進行預先處理。
例如:'$value' 輸出字元 $value ; "$value"輸出變數$value的值。
char和varchar的區別:
char是定長而varchar是變長,char的主要特點是儲存方式預分配,varchar當它的資料長度發生變化時會影響其儲存的頁分配。
char與varchar2是一對矛盾的統一體,兩者是互補的關係.
varchar2比char節省空間的,在效率上比 char會稍微差一些,即要想獲得效率,就必須犧牲一定的空間,這也就是我們在資料庫設計上常說的‘以空間換效率'。
varchar2 雖然比 char節省空間的,但是如果一個varchar2列經常被修改,而且每次被修改的資料的長度不同,這會引起‘行遷移'(Row Migration)現象,而這造成多餘的I/O,是資料庫設計和調整中要儘力避免的,在這種情況下用 char代替varchar2會更好一些。
mysql_connect和mysql_pconnect的區別
引用exceed php club論壇上的朋友原話:
php中mysql_pconnect()的實現方式:
其實mysql_pconnect()本身並沒有做太多的處理, 它唯一做的只是在php運行結束後不主動close掉mysql的串連.
mysql_pconnect()與此同時mysql_connect()的區別:
cgi方式下:
在php經cgi方式運行時pconnect和connect是基本沒有區別的, 因為cgi方式是每一個php訪問起一個進程, 訪問結束後進程也就結束了, 資源也全釋放了.
apache模組方式下:
區別在於當php以apache模組方式運行時, 由於apache有使用進程池, 一個httpd進程結束後會被放回進程池, 這也就使得用pconnect開啟的的那個mysql串連資源不被釋放, 於是有下一個串連請求時就可以被複用.
這就使得在apache並發訪問量不大的時候, 由於使用了pconnect, php節省了反覆串連db的時間, 使得訪問速度加快. 這應該是比較好理解的.
但是在apache並發訪問量大的時候, 如果使用pconnect, 會由於之前的一些httpd進程佔用的mysql串連沒有close, 則可能會因為mysql已經達到最大串連著, 使得之後的一些請求永遠得不到滿足.
例如:
若mysql最大串連數設為500, 而apache的最大同時訪問數設為2000
假設所有訪問都會要求訪問db, 而且操作時間會比較長
當前500個請求的httpd都沒有結束的時候...之後的httd進程都是無法串連到mysql的(因已經達到mysql最大串連數). 只有當前500個httpd進程結束或被複用才可以串連得到了mysql.
其實這個也很好解釋了xgy_p的測試中若操作比較簡單, pconnect比connect效率高很多, 而且跟使用jsp的串連池的速度比較接近. 因為這個時候httpd進程可以不斷的給複用.
而 當DB操作複雜, 耗時較長時, 因httpd會fork很多並發進程處理, 而先產生的httpd進程不釋放db串連, 使得後產生的httpd進程無法連上db. 因為這樣沒有複用其它httpd進程的mysql串連. 於是會就產生很多連線逾時, 像一開始的1000個並發串連測試說幾乎都是連線逾時就是這個原因.
---
(反進來看jsp用的如果是純粹的db串連池, 則不會有因為達到mysql串連上限而連不上的問題, 因為jsp的串連池會使得可以等待其它串連使用完畢並複用. )
因此在並發訪問量不高時,使用pconnect可以簡單提高訪問速度, 但在並發量增大後, 是否再使用pconnect就要看程式員的選擇了..
就我個人認為, php現在對mysql的串連並沒有真正用到串連池, pconnect也只是相當於借了apache的進程池來用, 所以在並發訪問量大的時候pconnect並不能很好的提高訪問DB效率. 在這一點上. php的確比不上jsp.
就目前的這種情況, 如果並發量大的話, 我個人建議最好還用mysql_connect.
include和require的區別
以下取自phpchina.cn
php的require()效能與include()相類似。不同之處在於,對include()來說,在include()執行時檔案每次都要進行讀 取和評估;而對於require()來說,檔案只處理一次(實際上,檔案內容替換了require()語句)。這就意味著如果有包含這些指令之一的代碼和 可能執行多次的代碼,則使用require()效率比較高。另一方面,如果每次執行代碼時相讀取不同的檔案,或者有通過一組檔案疊代的迴圈,就使用 include(),因為可以給想要包含的檔案名設定一個變數,當參數為include()時使用這個變數。
include 在執行時,如果 include 進來的檔案發生錯誤的話,不會立刻停止;而 require 則會立刻終止程式,不再往下執行。
include 可以用在迴圈; require 不行。
以下取自ricky
1,require是無條件包含也就是如果一個流程裡加入require,無論條件成立與否都會先執行require
這個已經不適用了,因為require 可以包含變數指向的檔案如
if($a = 1){
$file = '1.php';
}else{
$file = '2.php';
}
require($file);
2,包含檔案不存在或者語法錯誤的時候require是致命的, include不是
3,include有傳回值,而require沒有(可能因為如此require的速度比include快)
$login = include('test.php');
if(!empty($login)){
echo "檔案包含成功";
}else{
echo "檔案包含失敗";
}
引用檔案的方法有兩種:require 及 include。兩種方式提供不同的使用彈性。
require 的使用方法如 require("MyRequireFile.php"); 。這個函數通常放在 PHP 程式的最前面,PHP 程式在執行前,就會先讀入 require 所指定引入的檔案,使它變成 PHP 程式網頁的一部份。常用的函數,亦可以這個方法將它引入網頁中。
include 使用方法如 include("MyIncludeFile.php"); 。這個函數一般是放在流程式控制制的處理部分中。PHP 程式網頁在讀到 include 的檔案時,才將它讀進來。這種方式,可以把程式執行時的流程簡單化。
isset()和empty()的區別
兩者都是測試變數用的,但是isset()是測試變數是否被賦值,而empty()是測試一個已經被賦值的變數是否為空白。
如果一個變數沒被賦值就引用在php裡是被允許的,但會有notice提示,如果一個變數被賦空值,$foo=""或者$foo=0或者 $foo=false,那麼empty($foo)返回真,isset($foo)也返回真,就是說賦空值不會登出一個變數。
要登出一個變數,可以用 unset($foo)或者$foo=NULL