PHP面試100題彙總【1-20題】
正文內容
1,Http 和Https的區別
第一:http是超文字傳輸協議,資訊是明文傳輸,https是具有安全性的ssl加密傳輸協議
第二:http和https使用的是完全不同的連線方式,埠也不一樣,前者80 或者443
第三:http連線很簡單,是無狀態的。https協議是由ssl+http協議構建的可進行加密傳輸,身份認證的網路協議。
2.什麼方法來加快頁面的載入速度
1,用到伺服器資源時在開啟,不用時,立即關閉伺服器資源。
2,資料庫新增索引
3,頁面可生成靜態
4,圖片等大檔案單獨放在一個伺服器
5,能不查詢資料庫的儘量不去資料取資料,可以放在快取中。
3.表單中 get與post提交方法的區別?
答:get是傳送請求HTTP協議通過url引數傳遞進行接收,而post是實體資料,可以通過表單提交大量資訊.
4.echo ,print,print_r 的區別:
echo 是php語句,無返回值。
print,print_r是函式,有返回值。
print() 只能打印出簡單型別變數的值(如int,string)
print_r() 可以打印出複雜型別變數的值(如陣列,物件)
echo 輸出一個或者多個字串
5.session與cookie區別
session與cookie相同:跨頁面、不跨使用者
session與cookie不相同:
1、session可以儲存任意型別的資料,但cookie只能儲存字串
2、cookie產生在伺服器端、儲存在客戶端
session產生在伺服器端、儲存在伺服器端
6.魔術常量
答案:
__LINE__檔案中的當前行號。
__FILE__檔案的完整路徑和檔名。
__FUNCTION__函式名稱
__CLASS__類的名稱
__METHOD__類的方法名
7.資料庫中的事務是什麼?
答:事務(transaction)是作為一個單元的一組有序的資料庫操作。如果組中的所有操作都成功,則認為事務成功,即使只有一個操作失敗,事務也不成功。如果所有操作完成,事務則提交,其修改將作用於所有其他資料庫程序。如果一個操作失敗,則事務將回滾,該事務所有操作的影響都將取消。
8.1優化MYSQL資料庫的方法。
1、選擇合適的欄位的資料型別
1)能用數字不用字串
2)char、varchar、text 能用varchar不用char
3)給欄位加not null 避免在表中出現NULL關鍵字(default 值)
2、選擇合適的欄位充當主鍵
1)建議每張表必須有主鍵
2)用數字型別的欄位充當主鍵
拆分表
拆分欄位,將文章的標題與內容分開
2)拆分記錄,將今年的記錄與往年的記錄分開
給欄位合理新增索引
a.格式:
(普通索引)->
建立:CREATE INDEX <索引名> ON tablename (索引欄位)
修改:ALTER TABLE tablename ADD INDEX [索引名] (索引欄位)
創表指定索引:CREATE TABLE tablename([...],INDEX[索引名](索引欄位))
(唯一索引)->
建立:CREATE UNIQUE <索引名> ON tablename (索引欄位)
修改:ALTER TABLE tablename ADD UNIQUE [索引名] (索引欄位)
創表指定索引:CREATE TABLE tablename([...],UNIQUE[索引名](索引欄位))
(主鍵)->
它是唯一索引,一般在建立表是建立,格式為:
CREATA TABLE tablename ([...],PRIMARY KEY[索引欄位])
5、事務處理:
a.保證資料完整性,例如新增和修改同時,兩者成立則都執行,一者失敗都失敗
mysql_query("BEGIN");
mysql_query("INSERT INTO customerinfo (name) VALUES ('$name1')";
mysql_query("SELECT * FROM `orderinfo` where customerid=".$id");
mysql_query("COMMIT");
6、鎖定表,優化事務處理:
a.我們用一個 SELECT 語句取出初始資料,通過一些計算,用 UPDATE 語句將新值更新到表中。
包含有 WRITE 關鍵字的 LOCK TABLE 語句可以保證在 UNLOCK TABLES 命令被執行之前,
不會有其它的訪問來對 inventory 進行插入、更新或者刪除的操作
mysql_query("LOCK TABLE customerinfo READ, orderinfo WRITE");
mysql_query("SELECT customerid FROM `customerinfo` where id=".$id);
mysql_query("UPDATE `orderinfo` SET ordertitle='$title' where
customerid=".$id);
mysql_query("UNLOCK TABLES");
7、使用外來鍵,優化鎖定表
a.把customerinfo裡的customerid對映到orderinfo裡的customerid,
任何一條沒有合法的customerid的記錄不會寫到orderinfo裡
CREATE TABLE customerinfo(
customerid INT NOT NULL,
PRIMARY KEY(customerid)
)TYPE = INNODB;
CREATE TABLE orderinfo(
orderid INT NOT NULL,
customerid INT NOT NULL,
PRIMARY KEY(customerid,orderid),
FOREIGN KEY (customerid) REFERENCES customerinfo
(customerid) ON DELETE CASCADE
)TYPE = INNODB;
注意:'ON DELETE CASCADE',該引數保證當customerinfo表中的一條記錄刪除的話同時也會刪除order
表中的該使用者的所有記錄,注意使用外來鍵要定義事務安全型別為INNODB;
8、優化查詢語句
a用內連線代替子查詢代替子查詢,用sphinx代替like模糊查詢
b最好在相同欄位進行比較操作,在建立好的索引欄位上儘量減少函式操作
例子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";
快取,靜態化
選擇合適儲存引擎用Innodb增刪改,用myisam查詢
主從資料庫
負載均衡
最好拿數字型別的欄位充當where條件
最好拿相同型別的欄位進行比對(避免發生資料型別的轉換)
不要在具有索引的欄位上新增資料庫函式(索引失效)
8.2請簡述專案中優化sql語句執行效率的方法,從哪些方面,sql語句效能如何分析?
答:(1)選擇最有效率的表名順序
(2)WHERE子句中的連線順序
(3)SELECT子句中避免使用‘*’
(4)用Where子句替換HAVING子句
(5)通過內部函式提高SQL效率
(6)避免在索引列上使用計算。
(7)提高GROUP BY 語句的效率, 可以通過將不需要的記錄在GROUP BY 之前過濾掉。
9.對於大流量網站,採用什麼方法解決訪問量問題?
1,確認伺服器的硬體是否足夠支援當前的流量
2,優化資料庫的訪問
3,禁止外部的盜鏈
4,控制大檔案的下載
5,使用不同主機分流主要流量
6,使用流量分析統計軟體
10.一個函式,能夠遍歷一個資料夾下的所有檔案和子資料夾(20分)
function dir_recurse($dir) {
$i = 1;
if($handle = opendir($dir)) {
while(false !== ($file = readdir($handle))) {
if($file != "."&& $file != ".." ) {
if(is_dir($dir."/".$file) == true) {
$fullpath = $dir."/".$file;
dir_recurse($fullpath);
echo "$fullpath\n";
$i++;
}else {
$fullpath = $dir."/".$file;
echo "$fullpath\n";
$i++;
}
}
}
closedir($handle);
}
}
10.2寫一個函式,能夠遍歷一個資料夾下的所有檔案和子資料夾。
function my_scandir($dir){
$files = array();
if ( $handle = opendir($dir) ) {
while ( ($file = readdir($handle)) !== false ) {
if ( $file != ".."&& $file != "." ) {
if ( is_dir($dir . "/" . $file) ) {
$files[$file] = scandir($dir . "/" . $file);
}else {
$files[] = $file;
}
}
}
closedir($handle);
return $files;
}
}
11、能夠使HTML和PHP分離開使用的模板(1分)
答:Smarty,Dwoo,TinyButStrong,Template Lite,Savant,phemplate,XTemplate
12、使用哪些工具進行版本控制?(1分)
答:cvs,svn,vss;
13、如何實現字串翻轉?(3分)
英文:
strrev($a)
中文或其他文字:
中文:GB2312, 程式碼是使用GB2312編碼
<?php
function reverse($str)
{
$ret = "";
len=mb s trwidth( len=mbstrwidth(len = mb_strwidth(str,"GB2312");
for(i=0; i=0;i=0; i< len; len;len; i++)
{
arr[]=mb s ubstr( arr[]=mbsubstr(arr[] = mb_substr(str, $i, 1, "GB2312");
}
return implode("", array_reverse($arr));
}
print_r(reverse("你好"));
14.PHP的意思(送1分)
PHP是一個基於服務端來建立動態網站的指令碼語言,您可以用PHP和HTML生成網站主頁
15.MYSQL取得當前時間的函式是?,格式化日期的函式是(2分)
答:now(),date()
16.用PHP寫出顯示客戶端IP與伺服器IP的程式碼1分)
答:列印客戶端IP:echo $_SERVER[‘REMOTE_ADDR’]; 或者: getenv('REMOTE_ADDR');
列印伺服器IP:echo gethostbyname("www.bolaiwu.com")
17、語句include和require的區別是什麼?為避免多次包含同一檔案,可用(?)語句代替它們?
答:require->require是無條件包含也就是如果一個流程里加入require,無論條件成立與否 都會先執行require
include->include有返回值,而require沒有(可能因為如此require的速度比include快)
注意:包含檔案不存在或者語法錯誤的時候require是致命的,include不是
18.http請求返回狀態碼
400 請求無效
401 未授權
403 請求被禁止
404 請求資源不存在
405 請求資源被禁止
406 無法接受
407 要求代理身份驗證
500 Internal Server Error 服務端原始碼錯誤
600 源站沒有返回響應頭部,只返回實現內容
19,linux授權碼:
600 屬主有讀寫許可權
644 屬主有讀寫許可權,屬性組有讀許可權
700 屬主有讀寫執行許可權
755 屬主有讀寫執行許可權,屬性組有讀,執行許可權
711 屬主有讀寫執行許可權,屬性組有執行許可權
666 所有使用者都有檔案的讀寫許可權
777 所有使用者都有檔案的讀寫執行許可權
20.有一個網頁地址, 比如PHP開發資源網主頁:http://www.phpres.com/index.html,如何得到它的內容?($1分)
答:方法1(對於PHP5及更高版本):
$readcontents = fopen("http://www.phpres.com/index.html", "rb");
$contents = stream_get_contents($readcontents);
fclose($readcontents);
echo $contents;
方法2:
echo file_get_contents("http://www.phpres.com/index.html");