phper必知必會(二)

1.說說你對進程,線程以及協程的理解php

進程:是系統進行資源分配和調度的基本單位,是基本操做系統結構的基礎。進程是程序基本執行的實體。進程與進程之間是獨立的,擁有徹底獨立的地址空間,進程的切換隻發生在內核態,由操做系統調度。html

線程:線程是操做系統進行運算調度的最小單位。它被包含在進程之中,是進程中實際運做的運行單位。一條線程指的是進程中一個單一順序的控制流,一個進程中能夠併發多個線程,每條線程並行執行不一樣的任務。mysql

協程:是一種用戶態的輕量級線程,協程的調度徹底由用戶控制。攜程擁有本身的寄存器上下文和棧。協程調度切換時,將寄存器上下文和棧保存在其它地方,在切回來的時候,恢復以前保存的寄存器上下文和棧,直接操做棧則基本沒有內核切換的開銷,能夠不加鎖的訪問全局變量,因此上下文切換的很是快,執行協程只須要極少的棧內存。redis

 

2.請比較下memcached,redis,並說明下redis的常見應用場景sql

1.redis支持的數據類型比較多不只支持常見k/v類型還支持list,set,hash等類型,它比memcached更像數據庫數據庫

2.memcached只是簡單的key/value的緩存,被用來作常規的緩存處理編程

3.memcached不支持持久化存儲,它把所有數據存儲在內存中,斷電或重啓時數據會掉緩存

4.redis支持數據持久化,因此斷電或者重啓後以前落地的數據還能夠找到安全

5.redis支持數據的備份,即master-slave模式的數據備份,memcached可使用一致性hash作分佈式服務器

6.redis使用的是單線程模型,保證了數據按順序提交,memcached使用的是cas保證數據一致性。cas(check and set)是一個確保併發一致性的機制,屬於「樂觀鎖」範疇;原理就是拿版本號,操做對比版本號,若是一致就操做不一致就放棄。

redis常見應用場景:

排行榜:若是使用傳統的關係型數據庫來作這個事兒,仍是有點麻煩的,若是使用redis的sortSet數據結構可以很是方便搞定。

計數器/限速器:redis中原子性的強悍的自增操做,能夠用來統計點贊數,文章的閱讀數,以及電商活動中的秒殺搶購中房子用戶瘋狂點擊所帶來的沒必要要的壓力

好友關係:使用集合的求交集,並集,差集能夠方便處理共同好友,相同愛好等一些功能

簡單的消息隊列:若是使用mysql來作無疑會對db產生一些壓力,若是針對不是特別大隊列任務處理的話,可使用redis的消息隊列功能,將一些需求和任務寫到redis隊列,異步處理

session共享:這個實際上是針對分佈式部署來講的,session通常是保存在服務器中的,若是流量請求分攤到多臺服務器後,這樣用戶的會話就會產生問題,這個時候能夠經過php的配置來將session統一存儲在redis中來報錯session的統一性。

 

3.mysql中的myisam和innodb數據庫存儲引擎的區別

一、存儲結構

myisam:存儲數據落在三個文件。.FRM文件存儲表定義,.MYD數據文件,.MYI索引文件。

innodb:存儲在兩個文件,.frm存儲表定義,.ibd其它數據

二、存儲空間

myisam:可被壓縮,存儲空間較小

innod:須要更多的內存和存儲空間

三、可移植性、備份及恢復

myisam:數據是以文件形式存儲,可移植性強,直接拷貝文件便可。

innodb:使用binlog,mysqldump備份,數據過大就比較費時比較痛苦

四、事務支持

myisam:強調性能查詢速度快,不支持事務

innodb:支持事務,外鍵等功能

五、AUTO_INCRMENT

myisam:能夠和其它字段創建聯合索引

innodb:具備自動增加的字段索引必須是獨立的,若是和其它字段組合必須排在第一列

六、鎖

myisam:只支持表級鎖

innodb:支持事務和行級鎖。可是innodb的行鎖,只是在where的主鍵是有效的,非主鍵where會鎖全表

七、全文索引

myisam:支持FULLTEXT類型的全文索引

innodb:不支持FULLTEXT全文索引,不過可使用其它第三方的引擎支持好比sphinx

八、表主鍵

myisam:容許沒有任何索引和主鍵的存在,索引都是保持行的地址

innod:若是沒有設置主鍵,會自動建立一個用戶不可見6直接的主鍵,數據是主索引的一部分,附加索引保存的是主索引的值

九、表的具體行數

myisam:保存有表的總行數,若是select count,會直接取出快速

innodb:沒有直接保持總行數,查詢全部須要遍歷整個表,若增長where條件後跟myisam處理方式同樣

十、CURD操做

myisam:大量查詢適合使用該引擎

innod:大量的insert,update適合使用該引擎。

十一、外鍵

myisam:不支持外鍵

innodb:支持外鍵功能

 

4.闡釋數據庫事務的ACID的四個特性

原子性(Atomicity):一個事務必須被視爲一個不可分割的最小工做單元,整個事務中的全部操做要麼所有提交完成,要麼所有失敗回滾,對於一個事務來講,不可能只執行其中的一部分操做。

一致性(Consistency):數據庫老是從一個一致性的狀態轉換到另外一個一致性的狀態。

隔離性(Isolation):一個事務所作的修改在最終提交以前,對其它事務是不可見的。

持久性(Durability):一旦事務提交,則其修改會永遠的保存在數據庫中。

 

5.闡述mysql的4種隔離級別

讀未提交(read-uncommitted):事務能夠讀取未提交的數據,這也被稱爲髒讀

讀提交(read-committed):一個事務從開始直到事務提交以前,所作的任何修改對其餘事務都是不可見的。

可重讀(repeatable-read)mysql默認事務級別:當某個事務在讀取某個範圍內的記錄時,另一個事務又在該範圍內插入了新的記錄,當以前的事務再次讀取該範圍的記錄時,會產生幻讀

可串行化(serializable)最高事務級別:避免了前面說的幻讀,即在讀取沒一行數據上都加鎖,因此可能致使大量的超時和鎖爭用的問題。

 

6.select count(*),select count(1),select(column)的區別

1.通常狀況下select count(*)與select count(1)結果和速度是同樣的,即查詢全部

2.count(column)對特定的值具備行數進行計算,不包含空值,因此結果可能會有些不同(可能會比count(*)統計的要少)

3.count(*)對行的數目進行計算,包括null

4.若是沒有主鍵,那麼count(1)要比count(*)快

5.若是表中只有一個字段,count(*)最快

6.通常來講大多狀況下count(*)是最優的選擇

 

7.若是理解oop?

oop即面向對象編程,在面向對象編程中最重要的兩個概念就是類和對象。

時間萬物都有其屬性和特色或者說特性,咱們將這些屬性特性進行整合起來造成一個類,好比具備貓科類的特色和屬性的咱們稱爲貓科類。這個時候貓科類只是具備這類的屬性的抽象模型,若是要具體要是那種貓或者說須要獲得一個具體的實體這個時候就須要對類進行實例化,類在實例化後就是對象了,此時的貓就是一個更加具體存在的對象。

在編程世界裏,就是經過這種思想將具備相同的屬性的和特性進行就行管理,組合生一個類,類中有對應的屬性和實現的方法,經過一些初始化和實例化,或者調用一些方法來達到咱們須要的功能。

面向對象中有三大特色:

1.封裝性

也成爲隱藏性,就是將使用和具體實現分開,只對外開放部分接口和方法與外部聯繫,或者說只公開一部分供開發人員使用的方法和參數。

2.繼承性

子類自動繼承父類的屬性和方法,並能夠經過添加新的屬性和方法來對部分屬性和方法進行重寫,這樣增長了代碼的重用性。

3.多態性

雖說父類只有一個,可是能夠有多個子類,這些子類中雖然調用的相同的屬性或者方法,可是因爲繼承性這個的存在和重寫,實例化後這些子類卻能夠或者徹底不一樣的結果,獲得不一樣形態的東西,這種技術就是多態性。

 

8.請闡述http與https的區別

1.https協議須要到ca申請證書,通常免費證書較少,於是須要必定費用

2.http是超文本傳輸協議,信息是明文傳遞,https則是更具備安全性的ssl加密傳輸協議

3.http和https使用的是徹底不一樣的鏈接方式,用的端口也不同,前者是80後者是443

4.http的鏈接很簡單,是無狀態的,https協議是由http+ssl協議構建的可進行加密傳輸,身份認證的網絡協議,比http協議安全

 

9.使用php的三種方式獲指定取路徑下的文件夾和文件

 方法一:經過opendir獲取資源句柄,再使用readdir函數並遍歷獲取

$dir = "/data/wwwroot/test"; function oneReadDirs($dir){ $handle = opendir($dir); $outStr = ''; while(($item = readdir($handle))!==false){ if($item!='.' && $item!='..' ){ $path = $dir.'/'.$item; if(is_file($path)){ $outStr .= '[文件] '.$item.PHP_EOL; }elseif(is_dir($path)){ $outStr .= '[目錄] '.$item.PHP_EOL; } } } return $outStr; } $dirs = oneReadDirs($dir); echo $dirs;

 

方法二:使用scandir一次性獲取路徑下的全部文件夾和文件再進行處理

function twoReadDirs($dir){
    $dirs = scandir($dir);
    $outStr = '';
    foreach($dirs as $k=>$v){
        $path = $dir.'/'.$v;
        if($v!=='.' && $v!=='..' ){
            if(is_file($path)){
                $outStr .= '[文件] '.$v.PHP_EOL;
            }elseif(is_dir($path)){
                $outStr .= '[目錄] '.$v.PHP_EOL;
            }
        }
    }
    return $outStr;
}

$dirs2 = twoReadDirs($dir);
echo $dirs2;

 

方法三:使用面向對象的dir處理方式獲取

function threeReadDirs($dir){
   $d = dir($dir);
   $outStr = '';
   while(($item = $d->read())!==false){
        if($item!='.' && $item!='..' ){
            $path = $dir.'/'.$item;
            if(is_file($path)){
                $outStr .= '[文件] '.$item.PHP_EOL;
            }elseif(is_dir($path)){
                $outStr .= '[目錄] '.$item.PHP_EOL;
            }
        }
   }
   $d->close();
   return $outStr;
}

$dirs3 = threeReadDirs($dir);
echo ($dirs3);

 

輸出結果爲:

[目錄] app
[文件] index.html
[目錄] cache
[文件] .htaccess
[目錄] .phalcon
[目錄] public

 

10.寫一個函數算出兩個文件的相對路徑

 

$path1 = '/a/b/c/d/e/f/g/h/e.php';
$path2 = '/a/b/1/2/c.php';
function getRelativePath($path1, $path2){  
    $arr1=explode('/',dirname($path1)); 
    $arr2=explode('/',dirname($path2)); 
    for($i=0, $len=count($arr2); $i<$len; $i++ ){
        if($arr1[$i]!=$arr2[$i]){
            break ; 
        } 
    } 
    if($i<$len){
        $return_path=array_fill(0,$len-$i,'..');
    }
    //$path1相對於$path2
    $return_path=array_merge($return_path,array_slice($arr1,$i));
    return implode('/',$return_path);
}
echo getRelativePath($path1,$path2);
//../../c/d/e/f/g/h
相關文章
相關標籤/搜索