- 論壇徽章:
- 0
|
單引號'和雙引號"的區(qū)別
首先是單引號要比雙引號執(zhí)行效率要高,因為雙引號會對內(nèi)容進行預(yù)處理。例如:'$value' 輸出字符 $value ,"$value"輸出變量$value的值。
char和varchar的區(qū)別
char是定長而varchar是變長,char的主要特點是存儲方式預(yù)分配,varchar當(dāng)它的數(shù)據(jù)長度發(fā)生變化時會影響其存儲的頁分配。
char與varchar2是一對矛盾的統(tǒng)一體,兩者是互補的關(guān)系。varchar2比char節(jié)省空間,在效率上比char會稍微差一些,即要想獲得效率,就必須犧牲一定的空間,這也就是我們在數(shù)據(jù)庫設(shè)計上常說的“以空間換效率”。
varchar2雖然比char節(jié)省空間,但是如果一個varchar2列經(jīng)常被修改,而且每次被修改的數(shù)據(jù)的長度不同,這會引起“行遷移(Row Migration)”現(xiàn)象,而這造成多余的I/O,是數(shù)據(jù)庫設(shè)計和調(diào)整中要盡力避免的,在這種情況下用char代替varchar2會更好一些。
mysql_connect和mysql_pconnect的區(qū)別
引用exceed php club論壇上的朋友原話:
php中mysql_pconnect()的實現(xiàn)方式:其實mysql_pconnect()本身并沒有做太多的處理,它唯一做的只是在php運行結(jié)束后不主動close掉mysql的連接。mysql_pconnect()與mysql_connect()的區(qū)別包括:
cgi方式下:在php經(jīng)cgi方式運行時pconnect和connect是基本沒有區(qū)別的,因為cgi方式是每一個php訪問起一個進程,訪問結(jié)束后進程也就結(jié)束了,資源也全釋放了。
apache模塊方式下:區(qū)別在于當(dāng)php以apache模塊方式運行時,由于apache有使用進程池,一個httpd進程結(jié)束后會被放回進程池,這也就使得用pconnect打開的的那個mysql連接資源不被釋放,于是有下一個連接請求時就可以被復(fù)用。這就使得在apache并發(fā)訪問量不大的時候,由于使用了pconnect,php節(jié)省了反復(fù)連接db的時間,使得訪問速度加快。這應(yīng)該是比較好理解的。但是在apache并發(fā)訪問量大的時候,如果使用pconnect,會由于之前的一些httpd進程占用的mysql連接沒有close,則可能會因為mysql已經(jīng)達到最大連接著,使得之后的一些請求永遠得不到滿足。
例如:若mysql最大連接數(shù)設(shè)為500,而apache的最大同時訪問數(shù)設(shè)為2000,假設(shè)所有訪問都會要求訪問db,而且操作時間會比較長。當(dāng)前500個請求的httpd都沒有結(jié)束的時候,之后的httd進程都是無法連接到mysql的(因已經(jīng)達到mysql最大連接數(shù)),只有當(dāng)前500個httpd進程結(jié)束或被復(fù)用才可以連接得到了mysql。
其實這個也很好解釋了xgy_p的測試中若操作比較簡單,pconnect比connect效率高很多,而且跟使用jsp的連接池的速度比較接近。因為這個時候httpd進程可以不斷的給復(fù)用。而當(dāng)DB操作復(fù)雜,耗時較長時,因httpd會fork很多并發(fā)進程處理,而先產(chǎn)生的httpd進程不釋放db連接,使得后產(chǎn)生的httpd進程無法連上db,因為這樣沒有復(fù)用其它httpd進程的mysql連接,于是會就產(chǎn)生很多連接超時,像一開始的1000個并發(fā)連接測試說幾乎都是連接超時就是這個原因。(反過來看jsp用的如果是純粹的db連接池,則不會有因為達到mysql連接上限而連不上的問題,因為jsp的連接池會使得可以等待其它連接使用完畢并復(fù)用。)
因此在并發(fā)訪問量不高時,使用pconnect可以簡單提高訪問速度,但在并發(fā)量增大后,是否再使用pconnect就要看程序員的選擇了。就我個人認為,php現(xiàn)在對mysql的連接并沒有真正用到連接池,pconnect也只是相當(dāng)于借了apache的進程池來用,所以在并發(fā)訪問量大的時候pconnect并不能很好的提高訪問DB效率。在這一點上,php的確比不上jsp,就目前的這種情況,如果并發(fā)量大的話,我個人建議最好還用mysql_connect。
include和require的區(qū)別
以下取自phpchina.cn
php的require()性能與include()相類似。不同之處在于,對include()來說,在include()執(zhí)行時文件每次都要進行讀取和評估;而對于require()來說,文件只處理一次(實際上,文件內(nèi)容替換了require()語句)。這就意味著如果有包含這些指令之一的代碼和 可能執(zhí)行多次的代碼,則使用require()效率比較高。另一方面,如果每次執(zhí)行代碼時相讀取不同的文件,或者有通過一組文件疊代的循環(huán),就使用include(),因為可以給想要包括的文件名設(shè)置一個變量,當(dāng)參數(shù)為include()時使用這個變量。
include在執(zhí)行時,如果include進來的文件發(fā)生錯誤的話,不會立刻停止;而require則會立刻終止程序,不再往下執(zhí)行。include可以用在循環(huán);require不行。
以下取自ricky
1、require是無條件包含也就是如果一個流程里加入require,無論條件成立與否都會先執(zhí)行require。這個已經(jīng)不適用了,因為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"); 。這個函數(shù)通常放在PHP程序的最前面,PHP程序在執(zhí)行前,就會先讀入require所指定引入的文件,使它變成PHP程序網(wǎng)頁的一部份。常用的函數(shù),亦可以這個方法將它引入網(wǎng)頁中。
include使用方法如include("MyIncludeFile.php"); 。這個函數(shù)一般是放在流程控制的處理部分中。PHP程序網(wǎng)頁在讀到include的文件時,才將它讀進來。這種方式,可以把程序執(zhí)行時的流程簡單化。
isset()和empty()的區(qū)別
兩者都是測試變量用的,但是isset()是測試變量是否被賦值,而empty()是測試一個已經(jīng)被賦值的變量是否為空。
如果一個變量沒被賦值就引用在php里是被允許的,但會有notice提示,如果一個變量被賦空值,$foo=""或者$foo=0或者$foo=false,那么empty($foo)返回真,isset($foo)也返回真,就是說賦空值不會注銷一個變量。
要注銷一個變量,可以用unset($foo)或者$foo=NULL
本文來自ChinaUnix博客,如果查看原文請點:http://blog.chinaunix.net/u1/53398/showart_471983.html |
|