1. 程式人生 > >【總結】PHP常見面試題彙總(四)。。。

【總結】PHP常見面試題彙總(四)。。。

目錄:
1、如何使用php匯入匯出csv?
2、php接收POST資料的方式有哪些?
3、如何讓json_encode()不轉義斜槓?我在做伺服器返回一些資料時需要返回一些地址,但是預設的json_code是會對 / 轉義成 \/ 的
4、新浪微博、QQ空間、今日頭條PC版、蘑菇街、美麗說等網站是如何實現滾屏載入的?即:無重新整理動態載入資料技術的應用
5、移動瀏覽器的判斷方法(通用)
6、php中如何優化多個 if...elseif...elseif...else...  語句的情況?
7、php如何檢測當前是不是正在使用HTTPS協議?
8、php如何實現在陣列$items的任意位置插入資料?
9、如何快速提取URL中的域名?如下 $url='http://bbs.sijiaomao.com/read.php?tid=942&fid=22';如何快速提取 "bbs.sijiaomao.com"
10、如果用foreach來訪問PHP的陣列, 遍歷的順序是固定的麼? 有什麼規律可循呢 ?

11、php中如何使用file_get_contents()傳送post請求?

12、如何判斷php是執行緒安全還是非執行緒安全的?

13、php執行緒安全與非執行緒安全版本的區別?

14、Windows下的PHP開發環境搭建——PHP執行緒安全與非執行緒安全、Apache版本選擇,及詳解五種執行模式。

15、執行緒與程序的區別

16、FastCgi與PHP-fpm之間是個什麼樣的關係

17、PHP的執行緒安全模式(Thread Safety)

1、如何使用php匯入匯出csv?

<?php 

//讀取csv檔案中資料:使用php內建函式fgetcsv()
function input_csv($handle) { 
    $out = array (); 
    $n = 0; 
    while ($data = fgetcsv($file_handle, 10000)) { 
        $num = count($data); 
        for ($i = 0; $i < $num; $i++) { 
            $out[$n][$i] = $data[$i]; 
        } 
        $n++; 
    } 
    return $out; 
} 


//匯出資料到csv
function export_csv($filename,$data) { 
    header("Content-type:text/csv"); 
    header("Content-Disposition:attachment;filename=".$filename); 
    header('Cache-Control:must-revalidate,post-check=0,pre-check=0'); 
    header('Expires:0'); 
    header('Pragma:public'); 
    echo $data; 
} 

?>

2、php接收POST資料的方式有哪些?

通常情況下使用者使用瀏覽器網頁表單向伺服器post提交資料,我們使用PHP接收使用者POST到伺服器的資料,並進行適當的處理。但有些情況下,如使用者使用客戶端軟體向服務端php程式傳送post資料,而不能用$_POST來識別,那又該如何處理呢?

①$_POST方式接收資料

$_POST方式是通過 HTTP POST 方法傳遞的變數組成的陣列,是自動全域性變數。如使用$_POST['name']就可以接收到網頁表單以及網頁非同步方式post過來的資料,即$_POST只能接收文件型別為Content-Type: application/x-www-form-urlencoded提交的資料。

②$GLOBALS['HTTP_RAW_POST_DATA']方式接收資料

如果用過post過來的資料不是PHP能夠識別的文件型別,比如 text/xml 或者 soap 等等,我們可以用$GLOBALS['HTTP_RAW_POST_DATA']來接收。$HTTP_RAW_POST_DATA 變數包含有原始的POST資料。此變數僅在碰到未識別MIME 型別的資料時產生。$HTTP_RAW_POST_DATA 對於enctype="multipart/form-data" 表單資料不可用。也就是說使用$HTTP_RAW_POST_DATA無法接收網頁表單post過來的資料。

③php://input方式接收資料

如果訪問原始 POST 資料的更好方法是 php://input。php://input 允許讀取 POST 的原始資料。和 $HTTP_RAW_POST_DATA 比起來,它給記憶體帶來的壓力較小,並且不需要任何特殊的php.ini設定,而php://input不能用於 enctype="multipart/form-data"。

例如,使用者使用某個客戶端應用程式post給伺服器一個檔案,檔案的內容我們不管它,但是我們要把這個檔案完整的儲存在伺服器上,我們可以使用如下程式碼:

$input = file_get_contents('php://input'); 
file_put_contents($original, $input); //$original為伺服器上的檔案
以上程式碼使用file_get_contents('php://input')接收post資料,然後將資料寫入$original檔案中,其實可以理解為從客戶端上傳了一個檔案到伺服器上,此類應用非常多,尤其是我們PHP開發要與C,C++等應用程式開發進行產品聯合開發時會用到,例如本站有文章:拍照上傳就是結合flash利用此原理來上傳照片的。

以下是一個小示例,演示了$_POST,$GLOBALS['HTTP_RAW_POST_DATA']和php://input三種不同方式的接收POST資料處理:

a.html

<form name="demo_form" action="post.php" method="post"> 
    <p><label>Name: </label><input type="text" class="input" name="name"></p> 
    <p><label>Address: </label><input type="text" class="input" name="address"></p> 
    <p><input type="submit" name="submit" class="btn" value="Submit"></p> 
</form> 


post.php

header("Content-type:text/html;charset=utf-8"); 
 
echo '$_POST接收:<br/>'; 
print_r($_POST); 
echo '<hr/>'; 
 
echo '$GLOBALS[\'HTTP_RAW_POST_DATA\']接收:<br/>'; 
print_r($GLOBALS['HTTP_RAW_POST_DATA']); 
echo '<hr/>'; 
 
echo 'php://input接收:<br/>'; 
$data = file_get_contents('php://input'); 
print_r(urldecode($data));

輸出結果:

$_POST接收:
Array( [name] => xiaoqiang [address] => huilongguan [submit] => Submit)

$GLOBALS['HTTP_RAW_POST_DATA']接收:
php://input接收:
name=xiaoqiang&address=huilongguan&submit=Submit

3、如何讓json_encode()不轉義斜槓?我在做伺服器返回一些資料時需要返回一些地址,但是預設的json_code是會對 / 轉義成 \/ 的,所以解決辦法有如下兩種:

echo str_replace("\\/", "/",  json_encode("<font color='red'>www.baidu.com<\/font>"));	//第一種方式:正則替換

echo json_encode("<font color='red'>www.baidu.com<\/font>", JSON_UNESCAPED_SLASHES);	//第二種方式:php5.4+

echo json_encode("百度", JSON_UNESCAPED_UNICODE);		//漢字不轉義為\u開頭的UNICODE資料,必須PHP5.4+
4、新浪微博、QQ空間、今日頭條PC版、蘑菇街、美麗說等網站是如何實現滾屏載入的?即:無重新整理動態載入資料技術的應用
//①、首先,我們要獲取瀏覽器可視區域頁面的高度
var winH = $(window).height();
//②、然後,當滾動頁面的時候需要做的事情是:計算頁面總高度(當滾動底部時,頁面新載入資料,所以頁面總高度是動態變化的),計算滾動條位置(滾動條位置也是隨著載入頁面的高度動態變化的),然後構造一個公式,計算相對比例。
$(window).scroll(function () { 
    var pageH = $(document.body).height(); //頁面總高度 
    var scrollT = $(window).scrollTop(); //滾動條top 
    var aa = (pageH-winH-scrollT)/winH;//aa值越小,滾動條越接近底部  理想狀態下:頁面總高度 = 瀏覽器可視區域頁面高度 + 滾動條正好在底部時的top高度
}); 
//③、當滾動條接近頁底時,觸發ajax載入,在本例中我們使用jQuery的getJSON方法,向服務端result.php傳送請求,請求的引數為page,即頁數。
if(aa<0.02){ 
    $.getJSON("result.php",{page:i},function(json){ 
        ..... 
    }); 
 } 
 //④、如果請求響應成功返回JSON資料,則解析JSON資料,並將資料追加到頁面DIV#container後,如果沒有JSON資料返回,則說明資料全部顯示完畢。
 if(json){ 
    var str = ""; 
    $.each(json,function(index,array){ //遍歷 
        var str = "..."; //獲取的JSON資料 
        $("#container").append(str); //追加 
    }); 
    i++;  //頁數+1 
}else{ 
    $(".nodata").show().html("別滾動了,已經到底了。。。"); 
    return false; 
} 
//完整的程式碼
$(function(){ 
    var winH = $(window).height(); //頁面可視區域高度 
    var i = 1; //設定當前頁數 
    $(window).scroll(function () { 
        var pageH = $(document.body).height(); 
        var scrollT = $(window).scrollTop(); //滾動條top 
        var aa = (pageH-winH-scrollT)/winH; 
        if(aa<0.02){ 
            $.getJSON("result.php",{page:i},function(json){ 
                if(json){ 
                    var str = ""; 
                    $.each(json,function(index,array){ 
                        var str = "<div class=\"single_item\"><div class=\"element_head\">"; 
                        var str += "<div class=\"date\">"+array['date']+"</div>"; 
                        var str += "<div class=\"author\">"+array['author']+"</div>"; 
                        var str += "</div><div class=\"content\">"+array['content']+"</div></div>"; 
                        $("#container").append(str); 
                    }); 
                    i++; 
                }else{ 
                    $(".nodata").show().html("別滾動了,已經到底了。。。"); 
                    return false; 
                } 
            }); 
        } 
    }); 
}); 
$(window).scroll(function(){
  var scrollTop = $(this).scrollTop();
  var scrollHeight = $(document).height();
  var windowHeight = $(this).height();
  if(scrollTop + windowHeight == scrollHeight){
    alert("you are in the bottom");
  }
});

5、移動瀏覽器的判斷方法(通用)

<?php
/**
 * 移動瀏覽器判斷
 *
 * @return bool
 */
function browse_is_mobile () {
    return false;

    $user_agent = $_SERVER['HTTP_USER_AGENT'];
    if(preg_match("/iPhone/i", $user_agent) || preg_match("/iPod/i", $user_agent) ||  preg_match("/Android/i", $user_agent)){
        return true;
    }
    else {
        return false;
    }
}

/**
 * 檢測瀏覽器型別
 *
 * @return bool|int
 */
function check_mobile_browse () {
    $user_agent = $_SERVER['HTTP_USER_AGENT'];
    if(preg_match("/iPhone/i", $user_agent) || preg_match("/iPod/i", $user_agent)){
        return 1;
    }
    elseif (preg_match("/Android/i", $user_agent)) {
        return 2;
    }
    else {
        return false;
    }
}
?>

6、php中如何優化多個 if...elseif...elseif...else...  語句的情況?

<?php

//對於很多時候我們需要用N多個if,elseif,elseif…來達到連續判定完後取出某個值的效果,例如:
$data = array();
if("login"==$type){
	$data = array("uid"=>1,"pwd"=>123);
}elseif("register"==$type){
	$data = array("username"=>"max","new_pwd"=>432);
}elseif("put_info"==$type){
	$data = array("something"=>"Hello");
}

//向上面這樣的連續判斷效率較低,有些人會說改成switch case 的寫法,效率會高過if,但是依然是十分的繁瑣,如下:
$data = array();
switch($type){
	case "login":
	$data = array("uid"=>1,"pwd"=>123);
	break;
	case "register":
	$data = array("username"=>"max","new_pwd"=>432);
	break;
	case "put_info":
	$data = array("something"=>"Hello");
	break;
}


//但是這樣寫依然會比較麻煩,且執行效率也不會太高,當資料量較大的時候速度會比較慢,如上程式改成如下樣式:
//優點:在php中陣列使用的是hashtable,時間複雜度是O(1),執行速度遠遠高於以上兩種,另外書寫起來也更簡便的多。即使傳入的引數是未定義的,也不會浪費大量的系統資源
$data_arr = array(
	"login"		=>	array("uid"=>1,"pwd"=>123),
	"register"	=>	array("username"=>"max","new_pwd"=>432),
	"put_info"	=>	array("something"=>"Hello")
);

if(isset($data_arr[$type])){
	$data = $data_arr[$type];
}

?>
7、php如何檢測當前是不是正在使用HTTPS協議?
<?php
function is_HTTPS(){  
    if(!isset($_SERVER['HTTPS']))  return FALSE;  
    if($_SERVER['HTTPS'] === 1){  //Apache  
        return TRUE;  
    }elseif($_SERVER['HTTPS'] === 'on'){ //IIS  
        return TRUE;  
    }elseif($_SERVER['SERVER_PORT'] == 443){ //其他  
        return TRUE;  
    }  
    return FALSE;  
}
?>

8、php如何實現在陣列$items的任意位置插入資料?

<?php

$items= ['蘋果','橘子','梨','菠蘿','香蕉','火龍果'] ;

/*
$items 傳入的陣列
$index 要插入的位置
$value 要插入的資料
*/
function insertAt($items, $index, $value) {
	return $items;
}

$items=insertAt($items, 2 , '橙子'); //執行完成後,結果如下: ['蘋果','橘子','橙子','梨','菠蘿','香蕉','火龍果'] ;

?>
9、如何快速提取URL中的域名?如下 $url='http://bbs.sijiaomao.com/read.php?tid=942&fid=22';如何快速提取 "bbs.sijiaomao.com"
<?php

 echo parse_url($url, PHP_URL_HOST);

?>

10、如果用foreach來訪問PHP的陣列, 遍歷的順序是固定的麼? 有什麼規律可循呢 ?

<?php

//PHP中遍歷陣列的順序, 是和元素的新增先後相關的! 所以不管是索引陣列還是關聯陣列,結果都一樣,新增的順序就是依據!
至於為什麼會這樣,就需要深入探尋陣列的底層實現原理了
$items[2]  = 2015;
$items[1]  = 2014;
$items[0]  = 2013;

foreach ($items as $key => $val) {
    //結果是什麼?
    echo $key,' => ' ,$val, "\n";
}

?>

11、php中如何使用file_get_contents()傳送post請求?

<?php

//我們知道PHP中的file_get_contents無比強大,不僅僅能讀取檔案內容,還能設定超時時間採集網頁資料。那麼,能否用file_get_contents來發送post請求呢,如果能,改如何寫?
$postdata = http_build_query(
    array(
        'username' => '號外',
        'password' => '123456'
    )
);

$opts = array('http' =>
    array(
        'method'  => 'POST',
        'header'  => 'Content-type: application/x-www-form-urlencoded',
        'content' => $postdata
    )
);

$context  = stream_context_create($opts);

$result = file_get_contents('http://www.baidu.com/server.php', false, $context);

?>

13、如何判斷php是執行緒安全還是非執行緒安全的?

什麼是執行緒安全與非執行緒安全?

執行緒安全就是在多執行緒環境下也不會出現資料不一致,而非執行緒安全就有可能出現數據不一致的情況。

執行緒安全由於要確保資料的一致性,所以對資源的讀寫進行了控制,換句話說增加了系統開銷。所以在單執行緒環境中效率比非執行緒安全的效率要低些,但是如果執行緒間資料相關,需要保證讀寫順序,用執行緒安全模式

這個主要是針對web server 而言,在windows環境下,如果你使用的web server 是apchae 或者 iis 7以下版本,則應該選擇執行緒安全的安裝檔案,而如果你使用Fast-cgi模式時,可以選擇非執行緒安全,因為 web sever 本身能保證執行緒安全。
當然還有二進位制檔案編譯時所使用的編譯器:vc9 (vs系列) vc6(gcc)

如樓上所言,是針對web server的,部分web server在處理應用請求的時候是用多執行緒而非多程序的方式處理,執行緒方式因為涉及到共享暫存器和記憶體,所以很容易出錯,這個時候程式就需要花一些額外的經歷去處理暫存器中的資料一致性,即保證執行緒安全。
所以是否採用執行緒安全主要看你的web server所採用的PHP請求處理方式,如果是多執行緒處理,那麼請選擇執行緒安全的,否則選擇非執行緒安全的,如樓上所說Fast-cgi方式可選擇非執行緒安全的

先從字面意思上理解,None-Thread Safe就是非執行緒安全,在執行時不進行執行緒(thread)安全檢查;Thread Safe就是執行緒安全,執行時會進行執行緒(thread)安全檢查,以防止有新要求就啟動新執行緒的 CGI 執行方式耗盡系統資源。

再來看PHP的兩種執行方式:ISAPI和FastCGI。FastCGI執行方式是以單一執行緒來執行操作,所以不需要進行執行緒的安全檢查,除去執行緒安全檢查的防護反而可以提高執行效率,所以,如果是以 FastCGI(無論搭配 IIS 6 或 IIS 7)執行 PHP ,都建議下載、執行 non-thread safe 的 PHP (PHP 的二進位檔有兩種包裝方式:msi 、zip ,請下載 zip 套件)。而執行緒安全檢查正是為ISAPI方式的PHP準備的,因為有許多php模組都不是執行緒安全的,所以需要使用Thread Safe的PHP。

說到這裡,大家應該知道應該如何選擇哪個版本的PHP了。None-Thread Safe or Thread Safe,您會選擇哪個?

Windows下的PHP現在的版本已經是5.3.6,現在的Windows版本可以在PHP官方PHP For Windows(http://windows.php.net/download/)下載,下載的時候同版本有VC9 x86 Non Thread Safe、VC9 x86 Thread Safe、VC6 x86 Non Thread Safe、VC6 x86 Thread Safe等四個版本。那麼這些版本有什麼區別呢?

VC9的版本是用legacy VS 2008編譯的,VC6的版本是用legacy VS6編譯的。

如果你是在windows下使用IIS+PHP的話,你需要下載VC9的版本。
如果你是在windows下使用Apache+PHP的話,你需要下載VC6的版本。

Non Thread Safe是指非執行緒安全,Thread Safe則是指執行緒安全。

如果是使用ISAPI的方式來執行PHP就必須用Thread Safe(執行緒安全)的版本;而用FastCGI模式執行PHP的話就沒有必要用執行緒安全檢查了,用None Thread Safe(NTS,非執行緒安全)的版本能夠更好的提高效率。

如何判斷:


通過phpinfo(); 檢視其中的 Thread Safety 項,這個專案就是檢視是否是執行緒安全,如果是:enabled,一般來說應該是ts版,否則是nts版。

13、php執行緒安全與非執行緒安全版本的區別是什麼?

Windows版的PHP從版本5.2.1開始有Thread Safe(執行緒安全)和None Thread Safe(NTS,非執行緒安全)之分,這兩者不同在於何處?到底應該用哪種?這裡做一個簡單的介紹

從2000年10月20日釋出的第一個Windows版的PHP3.0.17開始的都是執行緒安全的版本,這是由於與Linux/Unix系統是採用多程序的工作方式不同的是Windows系統是採用多執行緒的工作方式。如果在IIS下以CGI方式執行PHP會非常慢,這是由於CGI模式是建立在多程序的基礎之上的,而非多執行緒。

一般我們會把PHP配置成以ISAPI的方式來執行,ISAPI是多執行緒的方式,這樣就快多了。但存在一個問題,很多常用的PHP擴充套件是以Linux/Unix的多程序思想來開發的,這些擴充套件在ISAPI的方式執行時就會出錯搞垮IIS。因此在IIS下CGI模式才是PHP執行的最安全方式,但CGI模式對於每個HTTP請求都需要重新載入和解除安裝整個PHP環境,其消耗是巨大的。

為了兼顧IIS下PHP的效率和安全,微軟給出了FastCGI的解決方案。FastCGI可以讓PHP的程序重複利用而不是每一個新的請求就重開一個程序。同時FastCGI也可以允許幾個程序同時執行。這樣既解決了CGI程序模式消耗太大的問題,又利用上了CGI程序模式不存線上程安全問題的優勢。

因此,如果是使用ISAPI的方式來執行PHP就必須用Thread Safe(執行緒安全)的版本;而用FastCGI模式執行PHP的話就沒有必要用執行緒安全檢查了,用None Thread Safe(NTS,非執行緒安全)的版本能夠更好的提高效率。

PHP官方http://php.net/上關於widows的版本有4個:VC9 x86 Non Thread Safe,VC9 x86 Thread Safe,VC6 x86 Non Thread Safe,VC6 x86 Thread Safe;那麼有什麼區別呢?

1.支援的伺服器不同

VC9版本是針對IIS伺服器的版本,沒有對APACHE的支援,而VC6版本對IIS和apache都提供了支援

VC6 是什麼?VC6 就是 legacy Visual Studio 6 compiler ,就是使用這個編譯器編譯的。
VC9 是什麼?VC9 就是 the Visual Studio 2008 compiler ,就是用微軟的 VS 編輯器編譯的。

那我們如何選擇下載哪個版本的 PHP 呢?

如果你是在 windows 下使用 Apache+PHP 的,請選擇 VC6 版本;
如果你是在 windows 下使用 IIS+PHP 的,請選擇 VC9 版本;

2.執行方式的不同

PHP有2中執行方式:ISAPI和FastCGI。

ISAPI執行方式是以DLL動態庫的形式使用,可以在被使用者請求後執行,在處理完一個使用者請求後不會馬上消失,所以需要進行執行緒安全檢查,這樣來提高程式的執行效率,所以如果是以ISAPI來執行PHP,建議選擇Thread Safe版本;

而FastCGI執行方式是以單一執行緒來執行操作,所以不需要進行執行緒的安全檢查,除去執行緒安全檢查的防護反而可以提高執行效率,所以,如果是以FastCGI來執行PHP,建議選擇Non Thread Safe版本。

對於apache伺服器來說一般選擇isapi方式,而對於nginx伺服器則選擇FastCGI方式。

3.總結

PHP所推出的Thread Safe主要針對的是Windows下以IIS來執行PHP的情況,因為Windows中頻繁申請程序開銷較大,所以在Windows中要以多執行緒方式來運轉PHP,這時候就需要Thread Safe版本。而在Linux系統下,PHP絕大多數情況下都以多程序方式執行,所以直接使用None Thread Safe即可。

如果是使用ISAPI的方式來執行PHP就必須用Thread Safe(執行緒安全)的版本;而用FastCGI模式執行PHP的話就沒有必要用執行緒安全檢查了,用None Thread Safe(NTS,非執行緒安全)的版本能夠更好的提高效率。

如果有多執行緒,就用執行緒安全版;如果只有一個執行緒,就用非執行緒安全版。

14、Windows下的PHP開發環境搭建——PHP執行緒安全與非執行緒安全、Apache版本選擇,及詳解五種執行模式


Windows下的PHP開發環境搭建——PHP執行緒安全與非執行緒安全、Apache版本選擇,及詳解五種執行模式。

今天為在Windows下建立PHP開發環境,在考慮下載何種PHP版本時,遭遇一些讓我困惑的情況,為了解決這些困惑,不出意料地牽扯出更多讓我困惑的問題。

為了將這些困惑一網打盡,我花了一下午加一晚上的時間查閱了大量資料,並做了一番實驗後,終於把這些困惑全都搞得清清楚楚了。

說實話,之所以花了這麼多時間,很大程度上是由於網上的資料幾乎全都是支離破碎、以訛傳訛的。既然我已經搞懂了,就花時間整理出來,即方便自己看,也便於大家閱讀。相信通過這篇文章,可以解答很多在Windows下搭建PHP開發環境的朋友的困惑。

關於從何處下載Apache:

要安裝Apache,你可能想當然地會去Apache官方網站下載適用於Windows的二進位制版本。而這恰恰錯了!

PHP官方不建議在Windows下安裝從apache.org網站下載的Apache二進位制安裝包。原因是如果你使用來自apache.org的安裝包,則由於這些安裝包是基於陳舊的Visual Studio 6編譯的,導致你不得不必須使用同樣陳舊的PHP版本(即VC6的PHP版本。也即使用Visual Studio 6編譯的PHP版本)才能與其配合使用。

要想使用最新版的PHP,應聽從PHP的官方建議。PHP官方的建議是你在Windows下可以使用IIS,或者使用來自Apache Lounge(www.apachelounge.com)的Apache版本。

Apache Lounge所提供的Apache二進位制安裝包是使用VC11建立的。因此可搭配最新版本的PHP使用。

網上很多資料說如果你是在Windows下使用 Apache,則必須使用PHP的VC6版本,只有使用IIS時才能使用VC9及以上版本,完全是沒有搞清情況的以訛傳訛。

如何選擇PHP版本(選擇執行緒安全還是非執行緒安全):

在Windows下安裝PHP,在選擇PHP版本上很有講究。

Windows下的PHP版本分兩種:執行緒安全版本與非執行緒安全版本。

如果你打算使用IIS,則你可以以ISAPI或FastCGI這兩種方式來安裝PHP。CGI的方式因為效率低下,故不予考慮。

如果你要在IIS中以FastCGI方式使用PHP,則你應該使用PHP的非執行緒安全的版本(Non-Thread Safe,NTS)。原因是以FastCGI方式安裝PHP時,PHP擁有獨立的程序,並且FastCGI是單一執行緒的,不存在多個執行緒之間可能引發的相互干擾(這種干擾通常都是由於全域性變數和靜態變數導致的)。由於省去了執行緒安全的檢查,因此使用FastCGI方式比ISAPI方式的效率更高一些。

如果你要在IIS中以ISAPI的方式使用PHP,則你應該使用PHP的執行緒安全版本(Thread Safe,TS)。原因是PHP以ISAPI方式安裝時,PHP沒有獨立的程序,而是作為DLL被IIS載入執行的,即是依附於Web伺服器程序的。當Web伺服器執行在多執行緒模式下(IIS正是這種情況),PHP自然也就執行在多執行緒模式下。只要是在多執行緒模式下執行,就可能存線上程安全問題,因此應選擇PHP的執行緒安全版本。

但在這裡還有必要說明一下,儘管Apache本身是執行緒安全的,同時你也選擇了PHP的執行緒安全版本,但由於一些Apache和PHP下的第三方擴充套件最初是基於Unix的多程序思想開發出來的,在設計開發時沒有考慮執行緒安全的問題,因此,不排除在這種情況下仍然存在IIS被某些第三方擴充套件搞崩潰的可能。

如果你打算使用Apache,則你可以以模組、ISAPI、FastCGI這三種方式來安裝PHP。CGI的方式因為效率低下,故不予考慮。

如果你要在Apache中以模組方式安裝PHP,則你應該使用PHP的執行緒安全的版本。原因是當PHP作為Apache的模組安裝時,PHP沒有獨立的程序,而是作為模組以DLL的形式被載入到Apache中的,是隨Apache的啟動而啟動的,而Windows下的Apache為多執行緒工作模式,因此PHP自然也就執行在多執行緒模式下。因此,這種情況下應使用PHP的執行緒安全版本。

再來看ISAPI的情況。通常認為ISAPI是配合IIS使用的,因為ISAPI最初就是微軟為IIS開發的。但Apache現在也可以通過載入mod_isapi.so模組來實現ISAPI的功能,以允許PHP以ISAPI的方式安裝。.so檔案是Apache自1.3版本後製定的用於Windows下的模組命名規則,對於Windows下的Apache而言,.so與.dll檔案一樣,都是動態連結庫檔案。

當要以ISAPI方式來安裝PHP時,通常是載入一個名如phpXisapi.dll的DLL檔案,其中的X為阿拉伯數字4、5等等這樣子。

但一般不建議在Apache中以ISAPI方式來安裝PHP,原因是到目前為止,Apache通過mod_isapi.so模組來實現的ISAPI功能並不完整,並未完整實現微軟對ISAPI所制定的全部規範。

同樣的,由於以ISAPI方式來安裝PHP時,PHP也沒有獨立的程序,也是作為模組被載入到Apache中的,因此,同樣也需要使用PHP的執行緒安全版本。

如果你要在Apache中以FastCGI方式使用PHP,則同在IIS中使用FastCGI的PHP的情況一樣,你應該使用PHP的非執行緒安全的版本。原因是在Apache中以FastCGI方式安裝PHP時,PHP擁有獨立的程序,並且FastCGI是單一執行緒的,故應使用PHP的非執行緒安全版本以提高效能。


15、執行緒與程序的區別


這麼解釋問題吧:

1。單程序單執行緒:一個人在一個桌子上吃菜。
2。單程序多執行緒:多個人在同一個桌子上一起吃菜。
3。多程序單執行緒:多個人每個人在自己的桌子上吃菜。

多執行緒的問題是多個人同時吃一道菜的時候容易發生爭搶,例如兩個人同時夾一個菜,一個人剛伸出筷子,結果伸到的時候已經被夾走菜了。。。此時就必須等一個人夾一口之後,在還給另外一個人夾菜,也就是說資源共享就會發生衝突爭搶。


1。對於 Windows 系統來說,【開桌子】的開銷很大,因此 Windows 鼓勵大家在一個桌子上吃菜。因此 Windows 多執行緒學習重點是要大量面對資源爭搶與同步方面的問題。


2。對於 Linux 系統來說,【開桌子】的開銷很小,因此 Linux 鼓勵大家儘量每個人都開自己的桌子吃菜。這帶來新的問題是:坐在兩張不同的桌子上,說話不方便。因此,Linux 下的學習重點大家要學習程序間通訊的方法。

--
補充:有人對這個開桌子的開銷很有興趣。我把這個問題推廣說開一下。

開桌子的意思是指建立程序。開銷這裡主要指的是時間開銷。
可以做個實驗:建立一個程序,在程序中往記憶體寫若干資料,然後讀出該資料,然後退出。此過程重複 1000 次,相當於建立/銷燬程序 1000 次。在我機器上的測試結果是:
UbuntuLinux:耗時 0.8 秒
Windows7:耗時 79.8 秒
兩者開銷大約相差一百倍。

這意味著,在 Windows 中,程序建立的開銷不容忽視。換句話說就是,Windows 程式設計中不建議你建立程序,如果你的程式架構需要大量建立程序,那麼最好是切換到 Linux 系統。

大量建立程序的典型例子有兩個,一個是 gnu autotools 工具鏈,用於編譯很多開原始碼的,他們在 Windows 下編譯速度會很慢,因此軟體開發人員最好是避免使用 Windows。另一個是伺服器,某些伺服器框架依靠大量建立程序來幹活,甚至是對每個使用者請求就建立一個程序,這些伺服器在 Windows 下執行的效率就會很差。這"可能"也是放眼全世界範圍,Linux 伺服器遠遠多於 Windows 伺服器的原因。

--
再次補充:如果你是寫伺服器端應用的,其實在現在的網路服務模型下,開桌子的開銷是可以忽略不計的,因為現在一般流行的是按照 CPU 核心數量開程序或者執行緒,開完之後在數量上一直保持,程序與執行緒內部使用協程或者非同步通訊來處理多個併發連線,因而開程序與開執行緒的開銷可以忽略了。

另外一種新的開銷被提上日程:核心切換開銷。

現代的體系,一般 CPU 會有多個核心,而多個核心可以同時執行多個不同的執行緒或者程序。

當每個 CPU 核心執行一個程序的時候,由於每個程序的資源都獨立,所以 CPU 核心之間切換的時候無需考慮上下文。

當每個 CPU 核心執行一個執行緒的時候,由於每個執行緒需要共享資源,所以這些資源必須從 CPU 的一個核心被複制到另外一個核心,才能繼續運算,這佔用了額外的開銷。換句話說,在 CPU 為多核的情況下,多執行緒在效能上不如多程序。

因而,當前面向多核的伺服器端程式設計中,需要習慣多程序而非多執行緒。

--------------------------------------------------------------------------------------------------------

很多人答案說的是作業系統提供的多程序而不是單個程式內的多執行緒。

多執行緒使得程式內部可以分出多個執行緒來做多件事情,而不會造成程式介面卡死。比如迅雷等多執行緒下載工具就是典型的多執行緒。一個下載任務進來,迅雷把檔案平分成10份,然後開10個執行緒分別下載。這時主介面是一個單獨的執行緒,並不會因為下載檔案而卡死。而且主執行緒可以控制下屬執行緒,比如某個執行緒下載緩慢甚至停止,主執行緒可以把它強行關掉並重啟另外一個執行緒。

另外就是一些程式的列印功能,比如記事本、Adobe Reader,列印的時候就只能列印,無法在主介面進行操作,而Word就有“後臺列印”的功能,點了列印命令之後,還可以回到主介面進行修改、儲存等操作。

另外多執行緒除了並行完成一些任務以外,還有生產者-消費者模式。比如Windows命令列下在某個硬碟根目錄執行一個"dir/s | more"命令,前一條顯示硬盤裡的所有檔案,要執行很久才能執行得完,後面那條命令會把前面命令的輸出分屏顯示出來。但是執行整條命令時,會立刻有顯示,也就是說,前面一條命令輸出滿一頁內容到緩衝區,more命令就把緩衝區封死了,等使用者敲了一個鍵顯示下一屏的時候,more命令把緩衝區的內容取出並清空,前面的命令才能輸出下一屏到緩衝區。這樣的多執行緒使得整條命令不用等待前面的命令全部執行完才能執行下一條命令。

多執行緒和多程序的區別。平常指的多程序是作業系統下同時執行多個程序,比如Word和Excel同時開啟,並且可以並行地同時執行一些操作。這種多程序和多執行緒沒什麼好比較的。可以比較的是同一個程式裡的多執行緒和多程序。

多執行緒因為在同一個程序裡,所以可以共享記憶體和其他資源,比如迅雷裡10個執行緒一齊下載一個檔案,這個檔案是由程序開啟的,然後10個執行緒都可以往裡寫入東西。如果是10個程序就不行了,作業系統不允許一個檔案由兩個程序同時寫入。另外,Chrome就是一個典型的多程序程式,裡面每個標籤頁、擴充套件、外掛都是單獨的程序,各自獨佔資源,相互隔離,一個程序出錯死掉只會影響一個頁面或者外掛,再也不會出現Flash外掛出錯崩潰導致整個瀏覽器崩潰的情況了。

--------------------------------------------------------------------------------------------------------

多執行緒最一般的應用是簡化程式的寫法。比如對於IO工作而言,如果底層的API僅提供了同步操作函式,這樣一來,單執行緒的應用很難寫,但是支援多執行緒後,完全可以把IO操作轉入執行緒中執行,主執行緒仍然可以進行正常的訊息迴圈。

舉一個小例子。你用qq郵箱的中轉站功能,上傳一個檔案,在檔案傳輸的時候,你可以最小化上傳視窗,去傳送、檢視郵件,這個就是典型的多執行緒例子。

打個比方:我們寢室洗手檯有2個水龍頭,就是多執行緒。可以滿足2個人刷牙。不然排隊蛋疼。

舉個最最最簡單的例子,程式裡面要幹兩件毫不相干的事情A和B,各費時10分鐘,那單執行緒程式就會這樣:等A完了再執行B,總共耗時20分鐘。但如果將A和B用兩個執行緒來做則如下:等待兩個執行緒結束。如果兩個執行緒被分配到不同的cpu上,則理論耗時共10分鐘。

--------------------------------------------------------------------------------------------------------

同樣以吃飯舉例子,假設很多人需要吃飯吃飯,桌子不夠,那麼桌子就是緊缺資源。單執行緒就是整個餐廳只有一個單人桌,這個人吃完了,下一個人輪上。但大餐館用的可能是八仙桌(好吧我比較喜歡這種古代的方正桌子),同時能容納八個人吃飯,這就是多執行緒:從一次一個變成了一次多個或者多次多個。如何安排吃飯順序對程式設計師來說是個巨大的挑戰,主要問題在於對資源-桌子的安排上,舉例說明:

1.死鎖-大家都在等著吃飯,但需要特定條件才能開吃:桌一等著桌二的碗,桌二等著桌三的筷子,桌三呢,等著桌一的勺。於是這三桌就都不能吃飯。

2.非原子變數更新-空閒桌子的數字是要加以保護的,類似於特定人員才能修改,假如沒有保護,空桌子一會兒是四個,一會兒是五個,最終的數字往往是不正確的,服務員要被玩死-這就是多執行緒的加鎖操作。

還有其他幾種,就不多說了,多執行緒的排程和使用是一個坑,是否能用好是程式設計師水平高低的一個標誌。


16、FastCgi與PHP-fpm之間是個什麼樣的關係

我在網上查fastcgi與php-fpm的關係,查了快一週了,基本看了個遍,真是眾說紛紜,沒一個權威性的定義。

網上有的說,fastcgi是一個協議,php-fpm實現了這個協議; 有的說,php-fpm是fastcgi程序的管理器,用來管理fastcgi程序的; 有的說,php-fpm是php核心的一個補丁; 有的說,修改了php.ini配置檔案後,沒辦法平滑重啟,所以就誕生了php-fpm; 還有的說PHP-CGI是PHP自帶的FastCGI管理器,那這樣的話幹嗎又弄個php-fpm出來,我就更暈了;

發個貼,想聽聽大家的理解,網上的我都已經看了個遍,因為我查了一週了,哈哈,所以想聽聽原創的理解。
-------------------------------------------------------------------------------------------------
剛開始對這個問題我也挺糾結的,看了《HTTP權威指南》後,感覺清晰了不少。

首先,CGI是幹嘛的?CGI是為了保證web server傳遞過來的資料是標準格式的,方便CGI程式的編寫者。

    web server(比如說nginx)只是內容的分發者。比如,如果請求/index.html,那麼web server會去檔案系統中找到這個檔案,傳送給瀏覽器,這裡分發的是靜態資料。好了,如果現在請求的是/index.php,根據配置檔案,nginx知道這個不是靜態檔案,需要去找PHP解析器來處理,那麼他會把這個請求簡單處理後交給PHP解析器。Nginx會傳哪些資料給PHP解析器呢?url要有吧,查詢字串也得有吧,POST資料也要有,HTTP header不能少吧,好的,CGI就是規定要傳哪些資料、以什麼樣的格式傳遞給後方處理這個請求的協議。仔細想想,你在PHP程式碼中使用的使用者從哪裡來的。

    當web server收到/index.php這個請求後,會啟動對應的CGI程式,這裡就是PHP的解析器。接下來PHP解析器會解析php.ini檔案,初始化執行環境,然後處理請求,再以規定CGI規定的格式返回處理後的結果,退出程序。web server再把結果返回給瀏覽器。

好了,CGI是個協議,跟程序什麼的沒關係。那fastcgi又是什麼呢?Fastcgi是用來提高CGI程式效能的。

    提高效能,那麼CGI程式的效能問題在哪呢?"PHP解析器會解析php.ini檔案,初始化執行環境",就是這裡了。標準的CGI對每個請求都會執行這些步驟(不閒累啊!啟動程序很累的說!),所以處理每個時間的時間會比較長。這明顯不合理嘛!那麼Fastcgi是怎麼做的呢?首先,Fastcgi會先啟一個master,解析配置檔案,初始化執行環境,然後再啟動多個worker。當請求過來時,master會傳遞給一個worker,然後立即可以接受下一個請求。這樣就避免了重複的勞動,效率自然是高。而且當worker不夠用時,master可以根據配置預先啟動幾個worker等著;當然空閒worker太多時,也會停掉一些,這樣就提高了效能,也節約了資源。這就是fastcgi的對程序的管理。

那PHP-FPM又是什麼呢?是一個實現了Fastcgi的程式,被PHP官方收了。

    大家都知道,PHP的直譯器是php-cgi。php-cgi只是個CGI程式,他自己本身只能解析請求,返回結果,不會程序管理(皇上,臣妾真的做不到啊!)所以就出現了一些能夠排程php-cgi程序的程式,比如說由lighthttpd分離出來的spawn-fcgi。好了PHP-FPM也是這麼個東東,在長時間的發展後,逐漸得到了大家的認可(要知道,前幾年大家可是抱怨PHP-FPM穩定性太差的),也越來越流行。

好了,最後來回來你的問題。
網上有的說,fastcgi是一個協議,php-fpm實現了這個協議

    對。

有的說,php-fpm是fastcgi程序的管理器,用來管理fastcgi程序的

    對。php-fpm的管理物件是php-cgi。但不能說php-fpm是fastcgi程序的管理器,因為前面說了fastcgi是個協議,似乎沒有這麼個程序存在,就算存在php-fpm也管理不了他(至少目前是)。 有的說,php-fpm是php核心的一個補丁

    以前是對的。因為最開始的時候php-fpm沒有包含在PHP核心裡面,要使用這個功能,需要找到與原始碼版本相同的php-fpm對核心打補丁,然後再編譯。後來PHP核心集成了PHP-FPM之後就方便多了,使用--enalbe-fpm這個編譯引數即可。

有的說,修改了php.ini配置檔案後,沒辦法平滑重啟,所以就誕生了php-fpm

    是的,修改php.ini之後,php-cgi程序的確是沒辦法平滑重啟的。php-fpm對此的處理機制是新的worker用新的配置,已經存在的worker處理完手上的活就可以歇著了,通過這種機制來平滑過度。

還有的說PHP-CGI是PHP自帶的FastCGI管理器,那這樣的話幹嗎又弄個php-fpm出

    不對。php-cgi只是解釋PHP指令碼的程式而已。
----------------------------------------------------------------------------------------------
你(PHP)去和愛斯基摩人(web伺服器,如 Apache、Nginx)談生意

你說中文(PHP程式碼),他說愛斯基摩語(C程式碼),互相聽不懂,怎麼辦?那就都把各自說的話轉換成英語(FastCGI 協議)吧。

怎麼轉換呢?你就要使用一個翻譯機(PHP-FPM)
(當然對方也有一個翻譯機,那個是他自帶的)

我們這個翻譯機是最新型的,老式的那個(PHP-CGI)被淘汰了。不過它(PHP-FPM)只有年輕人(Linux系統)會用,老頭子們(Windows系統)不會擺弄它,只好繼續用老式的那個。
---------------------------------------------------------------------------------------------
Fastcgi是CGI的升級版,一種語言無關的協議,用來溝通程式(如PHP, Python, Java)和Web伺服器(Apache2, Nginx), 理論上任何語言編寫的程式都可以通過Fastcgi來提供Web服務。
Fastcgi的特點是會在一個程序中依次完成多個請求,以達到提高效率的目的,大多數Fastcgi實現都會維護一個程序池。

而PHP-fpm就是針對於PHP的,Fastcgi的一種實現,他負責管理一個程序池,來處理來自Web伺服器的請求。目前,PHP-fpm是內置於PHP的。

但是PHP-fpm僅僅是個“PHP Fastcgi 程序管理器”, 它仍會呼叫PHP直譯器本身來處理請求,PHP直譯器(在Windows下)就是php-cgi.exe.
---------------------------------------------------------------------------------------------
FASTCGI:WEB伺服器與處理程式之間通訊的一種協議,是CGI的改進方案。

CGI程式反覆載入是CGI效能低下的主要原因,如果CGI程式保持在記憶體中並接受FastCGI程序管理器排程,則可以提供良好的效能、伸縮性、Fail-Over特性等。

FASTCGI是常駐型的CGI,它可以一直執行,在請求到達時,不會花費時間去fork一個程序來處理。

FastCGI是語言無關的、可伸縮架構的CGI開放擴充套件,將CGI直譯器程序保持在記憶體中,以此獲得較高的效能。

一般情況下,FastCGI的整個工作流程是這樣的:

1、Web Server啟動時載入FastCGI程序管理器(IIS ISAPI或Apache Module)

2、FastCGI程序管理器自身初始化,啟動多個CGI直譯器程序(可見多個php-cgi)並等待WebServer的連線。

3、當客戶端請求到達Web Server時,FastCGI程序管理器選擇並連線到一個CGI直譯器。 Web server將CGI環境變數和標準輸入傳送到FastCGI子程序php-cgi。

4、FastCGI子程序完成處理後將標準輸出和錯誤資訊從同一連線返回Web Server。當FastCGI子程序關閉連線時,請求便告處理完成。FastCGI子程序接著等待並處理來自FastCGI程序管理器(執行在Web Server中)的下一個連線。在CGI模式中,php-cgi在此便退出了。
-------------------------------------------------------------------------------------------
fastcgi 是 app server 和web server 之間的通訊協議。 正常架構 app server 是master,web server是client

php-fpm 帶兩個功能:1.實現了一個支援fastcgi協議的server程式 2. 程序管理器

有了php-fpm,就可以把php指令碼變成 多程序模式,採用fastcgi協議的app server,和web server進行通訊
-------------------------------------------------------------------------------------------
CGI => http://www.w3.org/CGI/
FastCGI => http://www.fastcgi.com/drupal/
FPM => FastCGI Process Manager(FastCGI程序管理器)
-------------------------------------------------------------------------------------------
fastcgi是一個協議,沒錯。php-fpm實現了這個協議,沒錯。 php-fpm的fastcgi協議需要有個金城吧?php-fpm實現的fastcgi程序就叫php-cgi= =。所以php-fpm就是他自身的fastcgi或php-cgi程序管理器,沒錯。php-fpm在5.2之前官方是沒有php-fpm的。php-fpm是作為一個第三方的補丁你才能用的。5.2之後捏,官方就已經預設加入了,從此就不是一個補丁了。
-------------------------------------------------------------------------------------------

17、PHP的執行緒安全模式(Thread Safety)

PHP自身是不支援執行緒的,但是它在安裝的時候,涉及到一個執行緒安全的問題,Windows下提供了二種安裝包,Linux下編譯安裝提供了–enable-maintainer-zts這個選項。
很多人一看到“安全”,就以為是好事,其實不然。
既然PHP沒有執行緒,那麼這個執行緒安全指的是什麼呢?這和它的執行方式有關。
這裡僅對Linux系統下流行的兩種PHP執行方式(LNMP和LNAMP)來講一下。
如果是LNMP環境,也就是說PHP以php-fpm方式執行,那麼就不涉及到執行緒安全這個問題了,因為php-fpm是以多程序的方式來執行的。
如果是以LNAMP或者LAMP方式執行(mod_php),那麼應該先了解下Apache的MPM,簡單點說,Apache支援以多執行緒的方式執行(Worker),也支援以多程序的方式執行(Prefork)。一般來講,Linux下的Apache絕大多數都是執行在Prefork模式下,這是出於穩定性的考慮。
所以總結下,LNMP下不需執行緒安全,Apache下為了穩定性的考慮,建議以多程序的方式執行(Prefork),這樣也是不需要執行緒安全的。
最後一點,PHP安裝為執行緒安全,會比非執行緒安全多佔用一些CPU,並且可能會增加bug或者不穩定的問題,這才是重點,不然PHP就沒必要設定這個選項了。

相關推薦

總結PHP見面試題彙總()

目錄: 1、如何使用php匯入匯出csv? 2、php接收POST資料的方式有哪些? 3、如何讓json_encode()不轉義斜槓?我在做伺服器返回一些資料時需要返回一些地址,但是預設的json_code是會對 / 轉義成 \/ 的 4、新浪微博、QQ空間、今日頭條PC版

總結PHP見面試題彙總(三)

目錄:1、php如何在文章列表中任意位置或固定位置插入新的文章?比如:3、6位置 2、php如何刪除兩個陣列中有交集的元素? 3、php如何在陣列頭部和尾部及任意位置插入元素? 4、php如何將二位陣列按某一個或多個欄位值(升序/降序)排序?數字索引被重置,關聯索引保持不變

總結PHP見面試題彙總(一)

目錄: 1、php如何打印出上週的時間格式?如:"2015-01-22 14:42:09" 2、php如何打印出上週的時間格式?如:"2015-01-15 14:42:09" 3、php如何打印出上個月的時間格式?如:"2014-12-22 14:42:09" 4、簡述一下echo、print、p

總結PHP見面試題彙總(一)

/** * 第1題:用PHP打印出上週的時間格式,如:"2015-01-22 14:42:09" */ echo date("Y-m-d H:i:s",strtotime("-1 day"))."<br/>"; /** * 第2題:用PHP打印出上週的

JAVA秒會技術之秒殺面試官JavaEE見面試題

裝配 配置文件 action getpara 表達 程序員 錯誤頁面 產生 創建 46.Request對象的主要方法? 答:(1)setAttribute(String name,Object):設置名字為name的request的參數值 (2)getAttribute(S

PHP見面試題 PHP基礎-網路協議HTTP/1.1中,狀態碼 200 301 304 403 404 500 的含義

文章目錄 一、考點 1、HTTP協議狀態碼 ① 狀態碼的作用: ② 五類響應:1XX、2XX、3XX、4XX、5XX ③ 常見狀態碼:

PHP見面試題 程式功能設計先寫一個線上留言本,實現使用者的線上留言功能,留言資訊儲存到資料庫,要求書籍資料表內容以及使用PHP編碼完成

一、考點 1、資料表設計 分析資料表結構 留言板有哪些資訊需要儲存? 留言資訊:ID,留言標題,留言內容,留言時間,留言人 2、資料表建立語句 // 留言本表 message create table message( id int unsign

PHP見面試題 PHP框架基礎-MVC框架基本工作原理談談你對MVC的認識,介紹幾種目前比較流行的MVC框架

一、考點 1、MVC工作原理 1)工作原理 Model - 資料模型層:通常情況下對資料進行加工,進行一些其他的處理,與資料相關的一些操作都在 Model層 操作。 View - 檢視層:跟使用者進行互動的一些介面上的東西。 Controller - 控制層

PHP見面試題 PHP框架基礎-常見框架特性PHP框架有哪些?你用過哪些?各自的優缺點是什麼?

一、考點 1、PHP框架的差異和優缺點 1)Yaf 框架 Yaf 使用PHP擴充套件的形式寫的一個PHP框架,也就是以C語言為底層編寫的,效能上要比PHP程式碼寫的框架要快一個數量級。 優點:執行效率高、輕量級框架、可擴充套件性強。 缺點:高版本相容性差、底

Java面試題系列:Java基礎知識見面試題彙總 第二篇

文中面試題從茫茫網海中精心篩選,如有錯誤,歡迎指正! 第一篇連結:【Java面試題系列】:Java基礎知識常見面試題彙總 第一篇 1.JDK,JRE,JVM三者之間的聯絡和區別 你是否考慮過我們寫的xxx.java檔案被誰編譯,又被誰執行,又為什麼能夠跨平臺執行? 1.1基本概念 JVM:Java V

JAVA秒會技術之秒殺面試官JavaEE見面試題(一)

parameter 和數 程序 配置 except 查詢 解析 list 就會 1.Struts2中,Action通過什麽方式獲取用戶從頁面輸入的數據,又是通過什麽方法把數據傳給視圖層顯示的? 答:(1)Action從頁面獲取數據的方式有三種: ①通過Act

JAVA秒會技術之秒殺面試官JavaSE見面試題(二)

方法 變量 dir 步驟 註解 無法 t對象 面試 線程 21.在Java中,如何跳出當前的多重嵌套循環? 答:在最外層循環前加一個標記如A,然後用break A;可以跳出多重循環。(Java中支持帶標簽的break和continue語句,作用有點類似於C和C++中的go

JAVA秒會技術之秒殺面試官JavaSE見面試題(三)

mark error 對象創建 事件 算法 pool ret sync 數量 41..比較一下Java和JavaSciprt? 答:其實Java和JavaScript最重要的區別是一個是靜態語言,一個是動態語言: (1)基於對象和面向對象:Java是一種真正的面向對象的語言

JAVA秒會技術之秒殺面試官JavaEE見面試題(五)

內存溢出 不可重復讀 cad struts2的 pro 單線程 映射 指定 log 51.事務的特性? 答:①原子性(Atomicity) 指事務是一個不可分割的工作單位,事務中的操作要麽全都發生,要麽全不發生; ②一致性(Consistency) 事務前後數據的完成性必須

JAVA秒會技術之秒殺面試官JavaEE見面試題(六)

行處理 周期 3年 struts 處理 isp java對象 date 代碼 62.談一談你對Mybatis的理解? MyBatis 本是apache的一個開源項目iBatis, 2010年這個項目由apache software foundation 遷移到了google

java集合HashMap見面試題

【java集合】HashMap常見面試題 2017年05月25日 18:20:56 閱讀數:3155 標籤: java hashmap 更多 個人分類: java集合 版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/u01251263

Python見面試題彙總(根據面試總結

Redis: Redis快取擊穿、快取雪崩、快取重建 回答參考: 快取擊穿:     當一個連線訪問快取資料庫中不存在的資料時,會直接通過快取資料庫到後端資料庫中查詢資料,但如果有大量連線在查詢一個不存在的資料,就會有大量連線直接訪問到後

Spring Boot學習總結(14)——Spring Boot見面試題彙總

1、什麼是 Spring Boot? Spring Boot 是 Spring 開源組織下的子專案,是 Spring 元件一站式解決方案,主要是簡化了使用 Spring 的難度,簡省了繁重的配置,提供了各種啟動器,開發者能快速上手。 2、為什麼要用 Spring Boot

JAVA秒會技術之秒殺面試官JavaSE見面試題(一)

【前言】別人都在你看不到的地方暗自努力,在你看得到的地方,他們也和你一樣顯得遊手好閒,和你一樣會抱怨,而只有你自己相信這些都是真的,最後,也只有你一個人繼續不思進取 ……   【下載】本人剛學習Java時總結的一些JavaSE常見面試題,偶爾在電腦中翻出,重新整理一下

從基礎到進階實戰JVM 見面試題指南助你橫掃BAT!

本文將重點介紹面試過程中常見的 JVM 題目。 將面試題分為三大類:基礎題目,進階題目,實戰題目。 基礎 1.1 JDK、 J