php面試題

防止SQL注入

簡(jiǎn)單回答:防止——利用即有的應(yīng)用、功能,將(惡意)SQL命令發(fā)送到到后臺(tái)數(shù)據(jù)庫(kù)引擎。

防止SQL注入漏洞可以用哪些函數(shù)?

  • addslashes()
  • mysql_escape_string()

SQL注入產(chǎn)生的原因:

程序開(kāi)發(fā)過(guò)程中不注意規(guī)范書(shū)寫(xiě)sql語(yǔ)句和對(duì)特殊字符進(jìn)行過(guò)濾,導(dǎo)致客戶(hù)端可以通過(guò)全局變量POST和GET提交一些sql語(yǔ)句正常執(zhí)行。

防止SQL注入的方式:

  • 開(kāi)啟配置文件中的magic_quotes_gpcmagic_quotes_runtime設(shè)置,
  • 執(zhí)行sql語(yǔ)句時(shí)使用addslashes()進(jìn)行sql語(yǔ)句轉(zhuǎn)換
    Sql語(yǔ)句書(shū)寫(xiě)盡量不要省略雙引號(hào)和單引號(hào)。
  • 過(guò)濾掉sql語(yǔ)句中的一些關(guān)鍵詞:update、insert、delete、select、 * 。
  • 提高數(shù)據(jù)庫(kù)表和字段的命名技巧,對(duì)一些重要的字段根據(jù)程序的特點(diǎn)命名,取不易被猜到的。
  • Php配置文件中設(shè)置register_globals為off,關(guān)閉全局變量注冊(cè),控制錯(cuò)誤信息,不要在瀏覽器上輸出錯(cuò)誤信息,將錯(cuò)誤信息寫(xiě)到日志文件中。

算法:https://www.kancloud.cn/i281151/php_questions/198601

排序

    //快速排序
    public function quick_sort($arr) {
    //先判斷是否需要繼續(xù)進(jìn)行
    $length = count($arr);
    if($length <= 1) {
        return $arr;
    }
    //如果沒(méi)有返回,說(shuō)明數(shù)組內(nèi)的元素個(gè)數(shù) 多余1個(gè),需要排序
    //選擇一個(gè)標(biāo)尺
    //選擇第一個(gè)元素
    $base_num = $arr[0];
    //遍歷 除了標(biāo)尺外的所有元素,按照大小關(guān)系放入兩個(gè)數(shù)組內(nèi)
    //初始化兩個(gè)數(shù)組
    $left_array = array();//小于標(biāo)尺的
    $right_array = array();//大于標(biāo)尺的
    for($i=1; $i<$length; $i++) {
        if($base_num > $arr[$i]) {
            //放入左邊數(shù)組
            $left_array[] = $arr[$i];
        } else {
            //放入右邊
            $right_array[] = $arr[$i];
        }
    }
    //再分別對(duì) 左邊 和 右邊的數(shù)組進(jìn)行相同的排序處理方式
    //遞歸調(diào)用這個(gè)函數(shù),并記錄結(jié)果
    $left_array = $this->quick_sort($left_array);
    $right_array = $this->quick_sort($right_array);
    //合并左邊 標(biāo)尺 右邊
    return array_merge($left_array, array($base_num), $right_array);
}

    public function bubble_sort($array){
    //冒泡排序
    $count = count($array);
    if ($count <= 0) return false;
    for($i=0; $i<$count; $i++){
        for($j=$count-1; $j>$i; $j--){
            if ($array[$j]<$array[$j-1]){
                $tmp = $array[$j];
                $array[$j] = $array[$j-1];
                $array[$j-1] = $tmp;
            }
        }
    }
    return $array;
}

echo(),print(),print_r()的區(qū)別?

  • echo 和 print 不是一個(gè)函數(shù),是一個(gè)語(yǔ)言結(jié)構(gòu);
  • print(string $arg) 只有一個(gè)參數(shù);
  • echo arg1,arg2 可以輸出多個(gè)參數(shù),返回 void ;
  • echo 和 print 只能打印出string,不能打印出結(jié)構(gòu);
  • print_r能打印出結(jié)構(gòu)。比如:
    $arr = array("key"=>"value");
    print_r($arr);

語(yǔ)句include和require的區(qū)別是什么?

  • 在失敗的時(shí)候:
  • include 產(chǎn)生一個(gè) warning ,而 require 直接產(chǎn)生錯(cuò)誤中斷;
  • require 在運(yùn)行前載入;
  • include 在運(yùn)行時(shí)載入;
  • require_once 和 include_once 表示了只包含一次,可以避免重復(fù)包含同一文件。
  • require是無(wú)條件包含,也就是如果一個(gè)流程里加入require,無(wú)論條件成立與否都會(huì)先執(zhí)行require,當(dāng)文件不存在或者無(wú)法打開(kāi)的時(shí)候,會(huì)提示錯(cuò)誤,并且會(huì)終止程序執(zhí)行
  • include有返回值,而require沒(méi)有(可能因?yàn)槿绱藃equire的速度比include快),如果被包含的文件不存在的化,那么會(huì)提示一個(gè)錯(cuò)誤,但是程序會(huì)繼續(xù)執(zhí)行下去
  • 注意:包含文件不存在或者語(yǔ)法錯(cuò)誤的時(shí)候require是致命的,而include不是

下面哪項(xiàng)沒(méi)有將john添加到users數(shù)組中?

  • (a) $users[] = 'john';
  • (b) array_add($users,'john');
  • (c) array_push($users,'john');
  • (d) $users ||= 'john';
  • 答案為bd,php 里面無(wú) array_add 函數(shù),d項(xiàng)為語(yǔ)法錯(cuò)誤的表達(dá)。

HTTP協(xié)議中幾個(gè)狀態(tài)碼的含義。

  • 200 : 請(qǐng)求成功,請(qǐng)求的數(shù)據(jù)隨之返回。
  • 301 : 永久性重定向。資源(網(wǎng)頁(yè)等)被永久轉(zhuǎn)義到其他URL
  • 302 : 暫時(shí)行重定向。
  • 401 : 當(dāng)前請(qǐng)求需要用戶(hù)驗(yàn)證。
  • 403 : 服務(wù)器拒絕執(zhí)行請(qǐng)求,即沒(méi)有權(quán)限。
  • 404 : 請(qǐng)求失敗,請(qǐng)求的數(shù)據(jù)在服務(wù)器上未發(fā)現(xiàn)。請(qǐng)求的資源(網(wǎng)頁(yè)等)不存在
  • 500 : 服務(wù)器錯(cuò)誤。一般服務(wù)器端程序執(zhí)行錯(cuò)誤。
  • 503 : 服務(wù)器臨時(shí)維護(hù)或過(guò)載。這個(gè)狀態(tài)時(shí)臨時(shí)性的。
  • 505 - 內(nèi)部服務(wù)器錯(cuò)誤

寫(xiě)出一些php魔術(shù)方法。

  • __construct() 實(shí)例化類(lèi)時(shí)自動(dòng)調(diào)用。
  • __destruct() 類(lèi)對(duì)象使用結(jié)束時(shí)自動(dòng)調(diào)用。
  • __set() 在給未定義的屬性賦值的時(shí)候調(diào)用。
  • __get() 調(diào)用未定義的屬性時(shí)候調(diào)用。
  • __isset() 使用isset()或empty()函數(shù)時(shí)候會(huì)調(diào)用。
  • __unset() 使用unset()時(shí)候會(huì)調(diào)用。
  • __sleep() 使用serialize序列化時(shí)候調(diào)用。
  • __wakeup() 使用unserialize反序列化的時(shí)候調(diào)用。
  • __call() 調(diào)用一個(gè)不存在的方法的時(shí)候調(diào)用。
  • __callStatic()調(diào)用一個(gè)不存在的靜態(tài)方法是調(diào)用。
  • __toString() 把對(duì)象轉(zhuǎn)換成字符串的時(shí)候會(huì)調(diào)用。比如 echo。
  • __invoke() 當(dāng)嘗試把對(duì)象當(dāng)方法調(diào)用時(shí)調(diào)用。
  • __set_state() 當(dāng)使用var_export()函數(shù)時(shí)候調(diào)用。接受一個(gè)數(shù)組參數(shù)。
  • __clone() 當(dāng)使用clone復(fù)制一個(gè)對(duì)象時(shí)候調(diào)用。

MySQL存儲(chǔ)引擎 MyISAM 和 InnoDB 的區(qū)別。

  • a. MyISAM類(lèi)型不支持事務(wù)處理等高級(jí)處理,而InnoDB類(lèi)型支持.
  • b. MyISAM類(lèi)型的表強(qiáng)調(diào)的是性能,其執(zhí)行數(shù)度比InnoDB類(lèi)型更快.
  • c. InnoDB不支持FULLTEXT類(lèi)型的索引.
  • d. InnoDB中不保存表的具體行數(shù),也就是說(shuō),執(zhí)行select count(*) from table時(shí),InnoDB要掃描一遍整個(gè)表來(lái)計(jì)算有多少行,但是MyISAM只要簡(jiǎn)單的讀出保存好的行數(shù)即可.
  • e. 對(duì)于AUTO_INCREMENT類(lèi)型的字段,InnoDB中必須包含只有該字段的索引,但是在MyISAM表中,可以和其他字段一起建立聯(lián)合索引。
  • f. DELETE FROM table時(shí),InnoDB不會(huì)重新建立表,而是一行一行的刪除。
  • g. LOAD TABLE FROM MASTER操作對(duì)InnoDB是不起作用的,解決方法是首先把InnoDB表改成MyISAM表,導(dǎo)入數(shù)據(jù)后再改成InnoDB表,但是對(duì)于使用的額外的InnoDB特性(例如外鍵)的表不適用.
  • h. MyISAM支持表鎖,InnoDB支持行鎖。

說(shuō)出一些MySQL優(yōu)化方法?

  1. 索引。
  2. 緩存。
  3. 避免join
  4. 靜態(tài)頁(yè)面
  5. 選取最適用的字段屬性:字段長(zhǎng)度和非空
  6. 優(yōu)化查詢(xún)語(yǔ)句
  • 設(shè)計(jì)良好的數(shù)據(jù)庫(kù)結(jié)構(gòu),允許部分?jǐn)?shù)據(jù)冗余,盡量避免join查詢(xún),提高效率。
  • 選擇合適的表字段數(shù)據(jù)類(lèi)型和存儲(chǔ)引擎,適當(dāng)?shù)奶砑铀饕?/li>
  • mysql庫(kù)主從讀寫(xiě)分離。
  • 找規(guī)律分表,減少單表中的數(shù)據(jù)量提高查詢(xún)速度。
  • 添加緩存機(jī)制,比如memcached,apc等。
  • 不經(jīng)常改動(dòng)的頁(yè)面,生成靜態(tài)頁(yè)面。
  • 書(shū)寫(xiě)高效率的SQL。比如 SELECT * FROM TABEL 改為 SELECT field_1, field_2, field_3 FROM TABLE.
  • 優(yōu)化查詢(xún)語(yǔ)句
  • a.最好在相同字段進(jìn)行比較操作,在建立好的索引字段上盡量減少函數(shù)操作
  • 例子1:SELECT * FROM order WHERE YEAR(orderDate)<2008;(慢) SELECT * FROM order WHERE orderDate<"2008-01-01";(快)
  • 例子2:
    SELECT * FROM order WHERE addtime/7<24;(慢)
    SELECT * FROM order WHERE addtime<24*7;(快)
  • 例子3:
    SELECT * FROM order WHERE title like "%good%";
    SELECT * FROM order WHERE title>="good" and name<"good";```
  • 1、選取最適用的字段屬性
  • MySQL可以很好的支持大數(shù)據(jù)量的存取,但是一般說(shuō)來(lái),數(shù)據(jù)庫(kù)中的表越小,在它上面執(zhí)行的查詢(xún)也就會(huì)越快。因此,在創(chuàng)建表的時(shí)候,為了獲得更好的性能,我們可以將表中字段的寬度設(shè)得盡可能小。
  • 例如,在定義郵政編碼這個(gè)字段時(shí),如果將其設(shè)置為CHAR(255),顯然給數(shù)據(jù)庫(kù)增加了不必要的空間,甚至使用VARCHAR這種類(lèi)型也是多余的,因?yàn)镃HAR(6)就可以很好的完成任務(wù)了。同樣的,如果可以的話,我們應(yīng)該使用MEDIUMINT而不是BIGIN來(lái)定義整型字段。
  • 另外一個(gè)提高效率的方法是在可能的情況下,應(yīng)該盡量把字段設(shè)置為NOT NULL,這樣在將來(lái)執(zhí)行查詢(xún)的時(shí)候,數(shù)據(jù)庫(kù)不用去比較NULL值。
  • 對(duì)于某些文本字段,例如“省份”或者“性別”,我們可以將它們定義為ENUM類(lèi)型。因?yàn)樵贛ySQL中,ENUM類(lèi)型被當(dāng)作數(shù)值型數(shù)據(jù)來(lái)處理,而數(shù)值型數(shù)據(jù)被處理起來(lái)的速度要比文本類(lèi)型快得多。這樣,我們又可以提高數(shù)據(jù)庫(kù)的性能。

說(shuō)下php中empty()和isset()的區(qū)別。

  • isset 用于檢測(cè)變量是否被設(shè)置,使用 isset() 測(cè)試一個(gè)被設(shè)置成 NULL 的變量,將返回 FALSE 。
  • empty 如果 var 是非空或非零的值,則 empty() 返回 FALSE。換句話說(shuō),""、0、"0"、NULL、FALSE、array()、var $var; 以及沒(méi)有任何屬性的對(duì)象都將被認(rèn)為是空的,如果 var 為空,則返回 TRUE 。
  • 如果變量為 0 ,則empty()會(huì)返回TRUE,isset()會(huì)返回TRUE;
  • 如果變量為空字符串,則empty()會(huì)返回TRUE,isset()會(huì)返回TRUE;
  • 如果變量未定義,則empty()會(huì)返回TRUE,isset()會(huì)返回FLASE。
  • 注意:isset() 只能用于變量,因?yàn)閭鬟f任何其它參數(shù)都將造成解析錯(cuò)誤。若想檢測(cè)常量是否已設(shè)置,可使用 defined() 函數(shù)。
    當(dāng)要 判斷一個(gè)變量是否已經(jīng)聲明的時(shí)候 可以使用 isset 函數(shù);
    當(dāng)要 判斷一個(gè)變量是否已經(jīng)賦予數(shù)據(jù)且不為空 可以用 empty函數(shù);
  • 當(dāng)要 判斷 一個(gè)變量 存在且不為空 先 isset 函數(shù) 再用 empty 函數(shù);

表單中 get與post提交方法的區(qū)別?

  • get是發(fā)送請(qǐng)求HTTP協(xié)議通過(guò)url參數(shù)傳遞進(jìn)行接收,
  • 而post是實(shí)體數(shù)據(jù),可以通過(guò)表單提交大量信息。

請(qǐng)用正則表達(dá)式(Regular Expression)寫(xiě)一個(gè)函數(shù)驗(yàn)證電子郵件的格式是否正確

<?php

/* http://www.manongjc.com/article/1524.html */

$email=$_POST['email'];

if(!preg_match(‘/^[\w.]+@([\w.]+).[a-z]{2,6}$/i’,$email)) {

echo "電子郵件檢測(cè)失敗";

}else{

echo "電子郵件檢測(cè)成功";

}
?>

session與cookie的區(qū)別?

  • 兩者最大的區(qū)別就是session存儲(chǔ)在服務(wù)器端,而cookie是在客戶(hù)端。
  • session安全性更高,而cookie安全性弱
  • session:儲(chǔ)存用戶(hù)訪問(wèn)的全局唯一變量,存儲(chǔ)在服務(wù)器上的php指定的目錄中的(session_dir)的位置進(jìn)行的存放.
  • cookie:用來(lái)存儲(chǔ)連續(xù)訪問(wèn)一個(gè)頁(yè)面時(shí)所使用,是存儲(chǔ)在客戶(hù)端,對(duì)于Cookie來(lái)說(shuō)是存儲(chǔ)在用戶(hù)WIN的Temp目錄中的。
    兩者都可通過(guò)時(shí)間來(lái)設(shè)置時(shí)間長(zhǎng)短.

session有什么用?怎么使用?

session在web開(kāi)發(fā)中具有非常重要的份量。它可以將用戶(hù)正確登錄后的信息記錄到服務(wù)器的內(nèi)存中,當(dāng)用戶(hù)以此身份
訪問(wèn)網(wǎng)站的管理后臺(tái)時(shí),無(wú)需再次登錄即可得到身份確認(rèn)。而沒(méi)有正確登錄的用戶(hù)則不分配session空間,即便輸入了
管理后臺(tái)的訪問(wèn)地址也不能看到頁(yè)面內(nèi)容。通過(guò)session確定了用戶(hù)對(duì)頁(yè)面的操作權(quán)限。

使用session的步驟:

  1. 啟動(dòng)session:使用session_start()函數(shù)來(lái)啟動(dòng)。
  2. 注冊(cè)會(huì)話:直接給$_SESSION數(shù)組添加元素即可。
  3. 使用會(huì)話:判斷session是否為空或者是否已經(jīng)注冊(cè),如果已經(jīng)存在則像普通數(shù)組使用即可。
  4. 刪除會(huì)話:

1.可以使用unset刪除單個(gè)session;

2.使用$_SESSION=array()的方式,一次注銷(xiāo)所有的會(huì)話變量;

3.使用session_destroy()函數(shù)來(lái)徹底銷(xiāo)毀session。

cookie有什么用?怎么使用?

  1. 記錄用戶(hù)訪問(wèn)的部分信息
  1. 在頁(yè)面間傳遞變量
  2. 將所查看的internet頁(yè)存儲(chǔ)在cookies臨時(shí)文件夾中,可以提高以后的瀏覽速度。

創(chuàng)建cookie:setcookie(string cookiename , string value , int expire);

讀取cookie:通過(guò)超級(jí)全局?jǐn)?shù)組$_COOKIE來(lái)讀取瀏覽器端的cookie的值。

刪除cookie:有兩種方法

1.手工刪除方法:右擊瀏覽器屬性,可以看到刪除cookies,執(zhí)行操作即可將所有cookie文件刪除

2.setcookie()方法:跟設(shè)置cookie的方法一樣,不過(guò)此時(shí)講cookie的值設(shè)置為空,有效時(shí)間為0或小于當(dāng)前時(shí)間戳。

題9:數(shù)據(jù)庫(kù)中的事務(wù)是什么?

事務(wù)(transaction)是作為一個(gè)單元的一組有序的數(shù)據(jù)庫(kù)操作。如果組中的所有操作都成功,則認(rèn)為事務(wù)成功,即使只有一個(gè)操作失敗,事務(wù)也不成功。如果所有操作完成,事務(wù)則提交,其修改將作用于所有其他數(shù)據(jù)庫(kù)進(jìn)程。如果一個(gè)操作失敗,則事務(wù)將回滾,該事務(wù)所有操作的影響都將取消。

簡(jiǎn)述下面程序的輸出結(jié)果, 簡(jiǎn)要說(shuō)明為什么, 如何解決這類(lèi)問(wèn)題?

<?php

$tmp = 0 == "a"? 1: 2;
echo $tmp;
?>

答案: 1

int和string類(lèi)型強(qiáng)制轉(zhuǎn)換造成的,0==="a"

0 == 0 肯定是true啊

PHP是弱類(lèi)型

$tmp = 0 === "a"? 1: 2;

echo $tmp; 這樣就是2

什么是MVC?

答案:MVC由Model(模型), View(視圖)和Controller(控制器)組成,PHP MVC可以更高效地管理好3個(gè)不同層的PHP代碼。

  • Model:數(shù)據(jù)信息存取層。數(shù)據(jù)結(jié)構(gòu)層
  • View:view層負(fù)責(zé)將應(yīng)用的數(shù)據(jù)以特定的方式展現(xiàn)在界面上。
  • Controller:通常控制器負(fù)責(zé)從視圖讀取數(shù)據(jù),控制用戶(hù)輸入,并向模型發(fā)送數(shù)據(jù)。

MYSQL取得當(dāng)前時(shí)間的函數(shù)是?,格式化日期的函數(shù)是

答案:now(),dateformat()

在頁(yè)面中引用CSS有幾種方式?

在頁(yè)面中使用CSS有3中方式:

  • 引用外部CSS文件
  • 內(nèi)部定義Style樣式
  • 內(nèi)聯(lián)樣式

假設(shè)a.html和b.html在同一個(gè)文件夾下面,用javascript實(shí)現(xiàn)當(dāng)打開(kāi)a.html五秒鐘后,自動(dòng)跳轉(zhuǎn)到b.html。

答案:

/** http://www.manongjc.com/article/1524.html */

function go2b(){

window.location = “b.html”;
window.close();

}

setTimeout( “go2b()”,5000 ); //5秒鐘后自動(dòng)執(zhí)行g(shù)o2b()

用PHP打印出前一天的時(shí)間格式是2006-5-10 22:21:21(2分)

$a = date(“Y-m-d H:i:s”, strtotime(“-1 day”));

print_r($a);

如何實(shí)現(xiàn)字符串翻轉(zhuǎn)?(3分)

英文:
strrev($a)

中文或其他文字:
中文:GB2312, 代碼是使用GB2312編碼

<?php

function reverse($str)

{

$ret = “”;

len=mbstrwidth(str,”GB2312″);

for(i=0;i< len;i++)

{

arr[]=mbsubstr(str, $i, 1, “GB2312″);

}

return implode(“”, array_reverse($arr));

}

print_r(reverse(“你好”));

對(duì)于大流量的網(wǎng)站,您采用什么樣的方法來(lái)解決訪問(wèn)量問(wèn)題?(4分)

  1. 有效使用緩存,增加緩存命中率
  2. 使用負(fù)載均衡
  3. 對(duì)靜態(tài)文件使用CDN進(jìn)行存儲(chǔ)和加速
  4. 想法減少數(shù)據(jù)庫(kù)的使用
  5. 查看出現(xiàn)統(tǒng)計(jì)的瓶頸在哪里
  6. 數(shù)據(jù)庫(kù)讀寫(xiě)分離,優(yōu)化數(shù)據(jù)表
  7. 使用不同主機(jī)分流主要流量

如何修改SESSION的生存時(shí)間. (1分)

session_set_cookie_params

一般有三年以上php開(kāi)發(fā)經(jīng)驗(yàn)去百度、騰訊面試,常會(huì)接觸的面試題小總結(jié)一下:

  1. 簡(jiǎn)單做一下自我介紹,? 然后談一下近三年來(lái)你的得意之作?
  2. 面試官看過(guò)你的簡(jiǎn)歷,會(huì)問(wèn)一些你做的項(xiàng)目的用戶(hù)量、pv、吞吐量、相關(guān)難點(diǎn)和解決方法等
  3. 數(shù)據(jù)庫(kù)設(shè)計(jì)經(jīng)驗(yàn),為什么進(jìn)行分表? 分庫(kù)?
    一般多少數(shù)據(jù)量開(kāi)始分表? 分庫(kù)? 分庫(kù)分表的目的? 什么是數(shù)據(jù)庫(kù)垂直拆分? 水平拆分? 分區(qū)等等?可以舉例說(shuō)明
  4. web開(kāi)發(fā)方面會(huì)遇到哪些緩存? 分別如何優(yōu)化?
  5. 給你256M的內(nèi)存,對(duì)10G的文件進(jìn)行排序(文件每行1個(gè)數(shù)字),如何實(shí)現(xiàn)?
    對(duì)10G的文件進(jìn)行查找如何實(shí)現(xiàn)?
    統(tǒng)計(jì)10G文件每個(gè)關(guān)鍵字出現(xiàn)的次數(shù)如何實(shí)現(xiàn)?
  6. 假如你現(xiàn)在是12306火車(chē)訂票的設(shè)計(jì)師,你該如何設(shè)計(jì)滿足全國(guó)人民訂票?
  7. 假如有1億用戶(hù)的訪問(wèn)量,你的服務(wù)器架構(gòu)是怎樣的? 用戶(hù)信息的存儲(chǔ)方案如何設(shè)計(jì)?
  8. 如果你是技術(shù)組長(zhǎng),所帶團(tuán)隊(duì)任務(wù)進(jìn)度無(wú)法完成你該如何解決?
    如果在進(jìn)度排滿的前提下插入任務(wù),你該如何保證總進(jìn)度不延期?
    如果有的工程師今天預(yù)定任務(wù)沒(méi)有完成,你該如何解決?
  9. 從你的經(jīng)驗(yàn)方面談一下如何構(gòu)建高性能web站點(diǎn)? 需要哪些環(huán)節(jié)? 步驟? 每個(gè)步驟需要注意什么如何優(yōu)化等?
  10. 為什么要對(duì)數(shù)據(jù)庫(kù)進(jìn)行主從分離?
  11. 如何處理多服務(wù)器共享session?
  12. 一個(gè)10G的表,你用php程序統(tǒng)計(jì)某個(gè)字段出現(xiàn)的次數(shù),思路是?
  13. 會(huì)告訴你一個(gè)nginx日志例子,用你認(rèn)為最佳的編程語(yǔ)言統(tǒng)計(jì)一下http響應(yīng)時(shí)間超過(guò)1秒的前10個(gè)url?
  14. 給你一個(gè)mysql配置文件,用你認(rèn)為最佳的編程語(yǔ)言解析該文件?
  15. 給你兩個(gè)路徑a和b,寫(xiě)一個(gè)算法或思路計(jì)算a和b差距幾層并顯示a和b的交集?
  16. 給你一個(gè)url,在nginx配置一下rewrite指定到某個(gè)具體路徑?
  17. 一個(gè)php文件的解釋過(guò)程是? 一般加速php有哪些? 提高php整體性能會(huì)用到哪些技術(shù)?
  18. session和cookie生存周期區(qū)別? 存儲(chǔ)位置區(qū)別?
  19. chrome號(hào)稱(chēng)為多線程的,所以多線程和多進(jìn)程的區(qū)別為?
  20. php在2011年底出現(xiàn)hash碰撞,hash碰撞原理為? 如何進(jìn)行修復(fù)?
  21. web不安全因素有哪些? 分別如何防范?
  22. 假如兩個(gè)單鏈表相交,寫(xiě)一個(gè)最優(yōu)算法計(jì)算交點(diǎn)位置,說(shuō)思路也可以?
  23. 假如你是技術(shù)組長(zhǎng)? 如何提高團(tuán)隊(duì)效率?
  24. nginx負(fù)載均衡有哪些? 如果其中一臺(tái)服務(wù)器掛掉,報(bào)警機(jī)制如何實(shí)現(xiàn)?
  25. 不優(yōu)化前提下,apache一般最大連接數(shù)為? nginx一般最大連接數(shù)為? mysql 每秒insert ? select ? update ? delete?
  26. mysql 數(shù)據(jù)類(lèi)型有哪些 ? 分別占用多少存儲(chǔ)空間 ?
  27. nginx設(shè)置緩存js、css、圖片等信息,緩存的實(shí)現(xiàn)原理是?
  28. 如何提高緩存命中率? 如何對(duì)緩存進(jìn)行顆粒化?
  29. php的內(nèi)存回收機(jī)制是?
  30. 我的所有問(wèn)題都問(wèn)完了,你有什么問(wèn)題問(wèn)我沒(méi)有?

1、雙引號(hào)和單引號(hào)的區(qū)別

雙引號(hào)解釋變量,單引號(hào)不解釋變量

雙引號(hào)里插入單引號(hào),其中單引號(hào)里如果有變量的話,變量解釋

  • 雙引號(hào)的變量名后面必須要有一個(gè)非數(shù)字、字母、下劃線的特殊字符,或者用{}講變量括起來(lái),否則會(huì)將變量名后面的部分當(dāng)做一個(gè)整體,引起語(yǔ)法錯(cuò)誤
  • 雙引號(hào)解釋轉(zhuǎn)義字符,單引號(hào)不解釋轉(zhuǎn)義字符,但是解釋'\和\

能使單引號(hào)字符盡量使用單引號(hào),單引號(hào)的效率比雙引號(hào)要高(因?yàn)殡p引號(hào)要先遍歷一遍,判斷里面有沒(méi)有變量,然后再進(jìn)行操作,而單引號(hào)則不需要判斷)

HTTP中POST、GET、PUT、DELETE方式的區(qū)別

  • HTTP定義了與服務(wù)器交互的不同的方法,最基本的是POST、GET、PUT、DELETE,與其比不可少的URL的全稱(chēng)是資源描述符
  • 我們可以這樣理解:url描述了一個(gè)網(wǎng)絡(luò)上資源,而post、get、put、delegate就是對(duì)這個(gè)資源進(jìn)行增、刪、改、查的操作!

php程序中如何設(shè)置當(dāng)前頁(yè)面的編碼為utf-8?

header(“content-type:text/html;charset=utf-8”);

php中,如何跳轉(zhuǎn)到blog/view.php頁(yè)面,請(qǐng)用函數(shù)實(shí)現(xiàn)?

header(“l(fā)ocation:blog/view.php”);

===是什么運(yùn)算?

  • 是php比較運(yùn)算符中的一種,表示恒等,說(shuō)明兩個(gè)變量不只是數(shù)值上相等,而且兩者的數(shù)據(jù)類(lèi)型也相等。
  • 如果$a !== $b,那么說(shuō)明兩個(gè)變量要么數(shù)值不等,要么就是數(shù)據(jù)類(lèi)型不相同。

說(shuō)出數(shù)組涉及到的常用函數(shù)。

  • array -- 聲明一個(gè)數(shù)組
  • count -- 計(jì)算數(shù)組中的單元數(shù)目或?qū)ο笾械膶傩詡€(gè)數(shù)
  • array_push()將一個(gè)或多個(gè)元素插入數(shù)組的末尾(入棧)
  • array_column()返回輸入數(shù)組中某個(gè)單一列的值;
  • array_combine()通過(guò)合并兩個(gè)數(shù)組來(lái)創(chuàng)建一個(gè)新數(shù)組;
  • array_reverse()以相反的順序返回?cái)?shù)組
  • array_unique()刪除數(shù)組中的重復(fù)值;
  • in_array()檢查數(shù)組中是否存在指定的值
  • foreach -- 遍歷數(shù)組
  • list -- 遍歷數(shù)組
  • explode -- 將字符串轉(zhuǎn)成數(shù)組
  • implode -- 將數(shù)組轉(zhuǎn)成一個(gè)新字符串
  • array_merge -- 合并一個(gè)或多個(gè)數(shù)組
  • is_array -- 檢查是否是數(shù)組
  • print_r -- 輸出數(shù)組
  • sort -- 數(shù)組排序
  • array_keys -- 返回?cái)?shù)組中所有的鍵名
  • array_values -- 返回?cái)?shù)組中所有的值
  • key -- 從關(guān)聯(lián)數(shù)組中取得鍵名

GD庫(kù)是做什么用的? (1分)

動(dòng)態(tài)的開(kāi)放的圖片處理庫(kù)

下面哪個(gè)函數(shù)可以打開(kāi)一個(gè)文件,以對(duì)文件進(jìn)行讀和寫(xiě)操作?(1分) c

(a) fget() (b) file_open() (c) fopen() (d) open_file()

MySQL存儲(chǔ)引擎中,innodb和myisam的區(qū)別

MyISAM 和 InnoDB 講解

  • InnoDB和MyISAM是許多人在使用MySQL時(shí)最常用的兩個(gè)表類(lèi)型,這兩個(gè)表類(lèi)型各有優(yōu)劣,視具體應(yīng)用而定。
  • 基本的差別為:MyISAM類(lèi)型不支持事務(wù)處理等高級(jí)處理,而InnoDB類(lèi)型支持。
  • MyISAM類(lèi)型的表強(qiáng)調(diào)的是性能,其執(zhí)行數(shù)度比InnoDB類(lèi)型更快,但是不提供事務(wù)支持,
  • 而InnoDB提供事務(wù)支持已經(jīng)外部鍵等高級(jí)數(shù)據(jù)庫(kù)功能。

函數(shù)內(nèi)部 static 和 global 關(guān)鍵字的作用

  • static 是靜態(tài)變量,在局部函數(shù)中存在且只初始化一次,使用過(guò)后再次使用會(huì)使用上次執(zhí)行的結(jié)果; 作為計(jì)數(shù),程序內(nèi)部緩存,單例模式中都有用到。
  • global 關(guān)鍵字,引用全局變量,wordpress中大量用到,如面向過(guò)程開(kāi)發(fā)。
  • static 靜態(tài)方法,是類(lèi)的成員方法,但不需要實(shí)例化類(lèi)可直接使用
  • $GLOBAL 在函數(shù)內(nèi)使用具有全局作用域的變量,如$GLOBAL['a']

子類(lèi)重寫(xiě)父類(lèi)的 protected 方法有什么限制?或者說(shuō)有什么要遵守的規(guī)則?

用例子說(shuō)明,以 Laravel 框架中的控制器作為說(shuō)明

  • final修飾的類(lèi)方法不可被子類(lèi)重寫(xiě)
  • PHP是否重寫(xiě)父類(lèi)方法只會(huì)根據(jù)方法名是否一致判斷(5.3以后重寫(xiě)父類(lèi)方法參數(shù)個(gè)數(shù)必須一致)
  • 重寫(xiě)時(shí)訪問(wèn)級(jí)別只可以等于或者寬松于父類(lèi) 不可提升訪問(wèn)級(jí)別

什么是 CSRF 攻擊 ?XSS 攻擊?如何防范?

  • CSRF,跨站請(qǐng)求偽造,攻擊方偽裝用戶(hù)身份發(fā)送請(qǐng)求從而竊取信息或者破壞系統(tǒng)。
    講述基本原理:用戶(hù)訪問(wèn)A網(wǎng)站登陸并生成了cookie,再訪問(wèn)B網(wǎng)站,如果A網(wǎng)站存在CSRF漏洞,此時(shí)B網(wǎng)站給A網(wǎng)站的請(qǐng)求(此時(shí)相當(dāng)于是用戶(hù)訪問(wèn)),A網(wǎng)站會(huì)認(rèn)為是用戶(hù)發(fā)的請(qǐng)求,從而B(niǎo)網(wǎng)站就成功偽裝了你的身份,因此叫跨站腳本攻擊。
  • CSRF防范:
  1. 合理規(guī)范api請(qǐng)求方式,GET,POST
  1. 對(duì)POST請(qǐng)求加token令牌驗(yàn)證,生成一個(gè)隨機(jī)碼并存入session,表單中帶上這個(gè)隨機(jī)碼,提交的時(shí)候服務(wù)端進(jìn)行驗(yàn)證隨機(jī)碼是否相同。

XSS,跨站腳本攻擊。

防范:不相信任何輸入,過(guò)濾輸入。

了解XSS攻擊嗎?如何防止?

XSS是跨站腳本攻擊,首先是利用跨站腳本漏洞以一個(gè)特權(quán)模式去執(zhí)行攻擊者構(gòu)造的腳本,然后利用不安全的Activex控件執(zhí)行惡意的行為。
使用htmlspecialchars()函數(shù)對(duì)提交的內(nèi)容進(jìn)行過(guò)濾,使字符串里面的特殊符號(hào)實(shí)體化。

PHP處理字符串的常用函數(shù)?(重點(diǎn)看函數(shù)的‘參數(shù)’和‘返回值’)

  • trim()移除字符串兩側(cè)的空白字符和其他字符;
  • substr_replace()把字符串的一部分替換為另一個(gè)字符串;
  • substr_count()計(jì)算子串在字符串中出現(xiàn)的次數(shù);
  • substr()返回字符串的一部分;
  • strtolower()把字符串轉(zhuǎn)換為小寫(xiě)字母;
  • strtoupper()把字符串轉(zhuǎn)換為大寫(xiě)字母;
  • strtr()轉(zhuǎn)換字符串中特定的字符;
  • strrchr()查找字符串在另一個(gè)字符串中最后一次出現(xiàn);
  • strstr()查找字符串在另一字符串中的第一次出現(xiàn)(對(duì)大小寫(xiě)敏感);
  • strrev()反轉(zhuǎn)字符串;
  • strlen()返回字符串的長(zhǎng)度;
  • str_replace()替換字符串中的一些字符(對(duì)大小寫(xiě)敏感);
  • print()輸出一個(gè)或多個(gè)字符串;
  • explode()把字符串打散為數(shù)組;
  • is_string()檢測(cè)變量是否是字符串;
  • strip_tags()從一個(gè)字符串中去除HTML標(biāo)簽;
  • mb_substr()用來(lái)截中文與英文的函數(shù)

PHP處理時(shí)間的常用函數(shù)?(重點(diǎn)看函數(shù)的‘參數(shù)’和‘返回值’)

  • date_default_timezone_get()返回默認(rèn)時(shí)區(qū)
  • date_default_timezone_set()設(shè)置默認(rèn)時(shí)區(qū)。
  • date()格式化本地時(shí)間/日期。
  • getdate()返回日期/時(shí)間信息。
  • gettimeofday()返回當(dāng)前時(shí)間信息。
  • microtime()返回當(dāng)前時(shí)間的微秒數(shù)。
  • mktime()返回一個(gè)日期的 Unix時(shí)間戳。
  • strtotime()將任何英文文本的日期或時(shí)間描述解析為 Unix時(shí)間戳。
  • time()返回當(dāng)前時(shí)間的 Unix時(shí)間戳。

什么是事務(wù)?及其特性?

  • MySQL 事務(wù)主要用于處理操作量大,復(fù)雜度高的數(shù)據(jù)。比如說(shuō),在人員管理系統(tǒng)中,你刪除一個(gè)人員,你即需要?jiǎng)h除人員的基本資料,也要?jiǎng)h除和該人員相關(guān)的信息,如信箱,文章等等,這樣,這些數(shù)據(jù)庫(kù)操作語(yǔ)句就構(gòu)成一個(gè)事務(wù)!
  • 事務(wù):是一系列的數(shù)據(jù)庫(kù)操作,是數(shù)據(jù)庫(kù)應(yīng)用的基本邏輯單位。

事務(wù)特性:

(1)原子性:即不可分割性,事務(wù)要么全部被執(zhí)行,要么就全部不被執(zhí)行。

(2)一致性或可串性。事務(wù)的執(zhí)行使得數(shù)據(jù)庫(kù)從一種正確狀態(tài)轉(zhuǎn)換成另一種正確狀態(tài)

(3)隔離性。在事務(wù)正確提交之前,不允許把該事務(wù)對(duì)數(shù)據(jù)的任何改變提供給任何其他事務(wù)。事務(wù)獨(dú)立運(yùn)行。一個(gè)事務(wù)處理后的結(jié)果,影響了其他事務(wù),那么其他事務(wù)會(huì)撤回。事務(wù)的100%隔離,需要犧牲速度。

(4) 持久性。事務(wù)正確提交后,其結(jié)果將永久保存在數(shù)據(jù)庫(kù)中,即使在事務(wù)提交后有了其他故障,事務(wù)的處理結(jié)果也會(huì)得到保存。

或者這樣理解:

事務(wù)就是被綁定在一起作為一個(gè)邏輯工作單元的SQL語(yǔ)句分組,如果任何一個(gè)語(yǔ)句操作失敗那么整個(gè)操作就被失敗,以后操作就會(huì)回滾到操作前狀態(tài),或者是上有個(gè)節(jié)點(diǎn)。為了確保要么執(zhí)行,要么不執(zhí)行,就可以使用事務(wù)。要將有組語(yǔ)句作為事務(wù)考慮,就需要通過(guò)ACID測(cè)試,即原子性,一致性,隔離性和持久性。

什么是鎖?

答:數(shù)據(jù)庫(kù)是一個(gè)多用戶(hù)使用的共享資源。當(dāng)多個(gè)用戶(hù)并發(fā)地存取數(shù)據(jù)時(shí),在數(shù)據(jù)庫(kù)中就會(huì)產(chǎn)生多個(gè)事務(wù)同時(shí)存取同一數(shù)據(jù)的情況。若對(duì)并發(fā)操作不加控制就可能會(huì)讀取和存儲(chǔ)不正確的數(shù)據(jù),破壞數(shù)據(jù)庫(kù)的一致性。

加鎖是實(shí)現(xiàn)數(shù)據(jù)庫(kù)并發(fā)控制的一個(gè)非常重要的技術(shù)。當(dāng)事務(wù)在對(duì)某個(gè)數(shù)據(jù)對(duì)象進(jìn)行操作前,先向系統(tǒng)發(fā)出請(qǐng)求,對(duì)其加鎖。加鎖后事務(wù)就對(duì)該數(shù)據(jù)對(duì)象有了一定的控制,在該事務(wù)釋放鎖之前,其他的事務(wù)不能對(duì)此數(shù)據(jù)對(duì)象進(jìn)行更新操作。

基本鎖類(lèi)型:鎖包括行級(jí)鎖和表級(jí)鎖

索引的作用?和它的優(yōu)點(diǎn)缺點(diǎn)是什么?

  • 索引就一種特殊的查詢(xún)表,數(shù)據(jù)庫(kù)的搜索引擎可以利用它加速對(duì)數(shù)據(jù)的檢索。它很類(lèi)似與現(xiàn)實(shí)生活中書(shū)的目錄,不需要查詢(xún)整本書(shū)內(nèi)容就可以找到想要的數(shù)據(jù)。
  • 索引可以是唯一的,創(chuàng)建索引允許指定單個(gè)列或者是多個(gè)列。
  • 缺點(diǎn)是它減慢了數(shù)據(jù)錄入的速度,同時(shí)也增加了數(shù)據(jù)庫(kù)的尺寸大小。

什么是基本表?什么是視圖?

  • 基本表是本身獨(dú)立存在的表,在 SQL 中一個(gè)關(guān)系就對(duì)應(yīng)一個(gè)表。
  • 視圖是從一個(gè)或幾個(gè)基本表導(dǎo)出的表。視圖本身不獨(dú)立存儲(chǔ)在數(shù)據(jù)庫(kù)中,是一個(gè)虛表

主鍵、外鍵和索引的區(qū)別?

主鍵、外鍵和索引的區(qū)別

定義:

主鍵--唯一標(biāo)識(shí)一條記錄,不能有重復(fù)的,不允許為空

外鍵--表的外鍵是另一表的主鍵, 外鍵可以有重復(fù)的, 可以是空值

索引--該字段沒(méi)有重復(fù)值,但可以有一個(gè)空值

作用:

主鍵--用來(lái)保證數(shù)據(jù)完整性

外鍵--用來(lái)和其他表建立聯(lián)系用的

索引--是提高查詢(xún)排序的速度

個(gè)數(shù):

主鍵--主鍵只能有一個(gè)

外鍵--一個(gè)表可以有多個(gè)外鍵

索引--一個(gè)表可以有多個(gè)唯一索引

數(shù)組[‘a(chǎn)’, ‘b’, ‘c’] 轉(zhuǎn)換成字符串 ‘a(chǎn)bc’

echo implode(‘’,[‘a(chǎn)’, ‘b’, ‘c’]);

echo join([‘a(chǎn)’, ‘b’, ‘c’],'');

獲取字符串’aAbB’中A首次出現(xiàn)的位置

  • $str=‘a(chǎn)AbB’;
  • echo strpos($str,"A");

數(shù)組內(nèi)置的排序方法有哪些?

  • sort($array); //數(shù)組升序排序
  • rsort($array); //數(shù)組降序排序
  • asort($array); //根據(jù)值,以升序?qū)﹃P(guān)聯(lián)數(shù)組進(jìn)行排序
  • ksort($array); //根據(jù)建,以升序?qū)﹃P(guān)聯(lián)數(shù)組進(jìn)行排序
  • arsort($array); //根據(jù)值,以降序?qū)﹃P(guān)聯(lián)數(shù)組進(jìn)行排序
  • krsort($array); // 根據(jù)鍵,以降序?qū)﹃P(guān)聯(lián)數(shù)組進(jìn)行排序

用PHP打印出前一天的時(shí)間格式是2017-3-22 22:21:21

$a = date("Y-m-d H:i:s", strtotime("-1 days"));

求兩個(gè)日期的差數(shù),例如2007-2-5 ~ 2007-3-6 的日期差數(shù)

// 方法一:

用DateTime類(lèi)
$day1 = '2003-09-16';

$day2 = '2011-11-23';

$d1 = new dateTime($day1);

$d2 = new dateTime($day2);

echo $d1->diff($d2)->days;

// 方法二,用時(shí)間戳計(jì)算
echo (strtotime($day2) - strtotime($day1))/(24*3600);

array實(shí)操

  • $array = array(1, 1, 1, 54, 3,4, 3,4, 3, 14, 3,4, 3,7,8,9,12,45,66,5,7,8,9,2,45);
  • $array2 = array_count_values($array); // 統(tǒng)計(jì)數(shù)組中所有值出現(xiàn)的次數(shù),
  • arsort($array2); // 按照鍵值對(duì)關(guān)聯(lián)數(shù)組進(jìn)行降序排序,
  • $first = reset($array2);
  • $first_key = key($array2);
  • echo("數(shù)組中數(shù)字{$first_key}重復(fù)次數(shù)最多,為:{$first}次");
  • exit;

Apache與Nginx的優(yōu)缺點(diǎn)比較

1、nginx相對(duì)于apache的優(yōu)點(diǎn):

  • 輕量級(jí),比apache 占用更少的內(nèi)存及資源。高度模塊化的設(shè)計(jì),編寫(xiě)模塊相對(duì)簡(jiǎn)單
  • 抗并發(fā),nginx 處理請(qǐng)求是異步非阻塞,多個(gè)連接(萬(wàn)級(jí)別)可以對(duì)應(yīng)一個(gè)進(jìn)程,
  • 而apache 則是阻塞型的,是同步多進(jìn)程模型,一個(gè)連接對(duì)應(yīng)一個(gè)進(jìn)程,在高并發(fā)下nginx 能保持低資源低消耗高性能
  • nginx處理靜態(tài)文件好,Nginx 靜態(tài)處理性能比 Apache 高 3倍以上

2、apache 相對(duì)于nginx 的優(yōu)點(diǎn):
apache 的rewrite 比nginx 的rewrite 強(qiáng)大 ,模塊非常多,基本想到的都可以找到 ,比較穩(wěn)定,少bug ,nginx 的bug 相對(duì)較多

3:原因:這得益于Nginx使用了最新的epoll(Linux 2.6內(nèi)核)和kqueue(freebsd)網(wǎng)絡(luò)I/O模型,而Apache則使用的是傳統(tǒng)的select模型。目前Linux下能夠承受高并發(fā)訪問(wèn)的 Squid、Memcached都采用的是epoll網(wǎng)絡(luò)I/O模型。 處理大量的連接的讀寫(xiě),Apache所采用的select網(wǎng)絡(luò)I/O模型非常低效。

MySQL 增刪改查數(shù)據(jù)

  • 增:$sql = "INSERT INTO w3cschool_tbl ". "(w3cschool_title,w3cschool_author, submission_date) ". "VALUES ". "('$w3cschool_title','$w3cschool_author','$submission_date')";
  • 刪:$sql = 'DELETE FROM w3cschool_tbl WHERE w3cschool_id=3';
  • 改:$sql = 'UPDATE w3cschool_tbl SET w3cschool_title="Learning JAVA" WHERE w3cschool_id=3';
  • 查:$sql = 'SELECT w3cschool_id, w3cschool_title, w3cschool_author, submission_date FROM w3cschool_tbl';
  • INNER JOIN(內(nèi)連接,或等值連接):獲取兩個(gè)表中字段匹配關(guān)系的記錄。
    $sql = 'SELECT a.w3cschool_id, a.w3cschool_author, b.w3cschool_count FROM w3cschool_tbl a INNER JOIN tcount_tbl b ON a.w3cschool_author = b.w3cschool_author';
  • LEFT JOIN(左連接):獲取左表所有記錄,即使右表沒(méi)有對(duì)應(yīng)匹配的記錄。
  • RIGHT JOIN(右連接): 與 LEFT JOIN 相反,用于獲取右表所有記錄,即使左表沒(méi)有對(duì)應(yīng)匹配的記錄。
  • 排序: $sql = 'SELECT w3cschool_id, w3cschool_title, w3cschool_author, submission_date FROM w3cschool_tbl ORDER BY w3cschool_author DESC';
  • 分組:SELECT name, COUNT(*) FROM employee_tbl GROUP BY name;
  • 分頁(yè):limit是mysql的語(yǔ)法:
    select * from table limit m,n
    其中m是指記錄開(kāi)始的index,從0開(kāi)始,表示第一條記錄
    n是指從第m+1條開(kāi)始,取n條。
    select * from tablename limit 2,4
    即取出第3條至第6條,4條記錄
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容