在網上看到一些高級php 的面試題目。。javascript
最近接連面試了幾家公司,有些重要問題記錄一下,督促本身學習提升,同時但願給朋友們一些幫助。
內容不少,一點點完善,一步步學習。。
有些是面試被問,有些是招聘要求,有些是本身整理加的。
php
1、mysql相關知識
一、 mysql優化方式
MYSQL 優化經常使用方法
mysql 性能優化方案
二、如何分庫分表
參考:
http://blog.sina.com.cn/s/blog_6e322ce70100zs9a.html
http://www.jb51.net/article/29771.htm
三、 Mysql+如何作雙機熱備和負載均衡
http://www.dewen.org/q/51/Mysql+如何作雙機熱備和負載均衡
四、數據表類型有哪些
MyISAM、InnoDB、HEAP、BOB,ARCHIVE,CSV等
MyISAM:成熟、穩定、易於管理,快速讀取。一些功能不支持(事務等),表級鎖。
InnoDB:支持事務、外鍵等特性、數據行鎖定。空間佔用大,不支持全文索引等。
myisam和Innodb引擎的主要特色
MySQL的存儲引擎MyISAM與InnoDB有什麼區別?
五、防sql注入方法
mysql_escape_string(strip_tags($arr["$val"]));
css
六、mysql把一個大表拆分多個表後,如何解決跨表查詢效率問題
七、索引應用
什麼狀況下考慮索引
什麼狀況不適合索引
一個語句是否用到索引如何判斷
常常發生的用不到索引的場景:
like '%.....'
數據類型隱式轉換
or 關鍵字加其它條件約束
全文索引:
只能用於MYIsAM表,在CHAR,VARCHAR,TEXT類型的列上建立。
html
八、mysql對於大表(千萬級),要怎麼優化呢?
參考http://www.zhihu.com/question/19719997
九、mysql的慢查詢問題
其實經過慢查詢日誌來分析是一種比較簡單的方式,若是不想看日誌,能夠藉助工具來完成,前端
如mysqldumpslow, mysqlsla, myprofi, mysql-explain-slow-log, mysqllogfilter等,感受本身來分析一個須要豐富的經驗,一個浪費時間。java
十、關於用戶登陸狀態存session,cookie仍是數據庫或者memcache的優劣 http://www.dewen.org/q/11504/mysql
關於用戶登陸狀態存session%2Ccookie仍是數據庫或者memcache的優劣linux
十一、事務應用極端狀況處理
十二、sql語言分4大類請列舉
DDL--CREATE,DROP,ALTER
DML--INSERT,UPDATE,DELETE
DQL-SELECT
DCL--GRANT,REVOKE,COMMIT,ROLLBACK
nginx
2、php基礎web
3、php高級
4、正則
email,html,js等匹配
5、開發基礎
6、Nosql數據庫
memcached、redis、mongodb的區別聯繫
3個場景徹底不一樣的東西。1.memcached:單一鍵值對內存緩存的,作對象緩存無可替代的分佈式緩存;2.redis:是算法和數據結構的集合,快速的數據結構操做是他最大的特色,支持數據持久化;3.mongodb是bson結構、介於rdb和nosql之間的,更鬆散更靈活的,可是不支持事務,只用做非重要數據存儲。
參考 MongoDB 或者 redis 能夠替代 memcached 嗎?
7、經常使用linux命令
好比軟連接
8、架構相關
CPU:Apache
MySQL處在高負載環境下,磁盤IO讀寫過多,確定會佔用不少資源,必然會CPU佔用太高。
內存:內存庫,數據庫軟件
硬盤:文件
MongoDB+redis 或者 MySQL+Memcached 比較好的組合,邏輯簡單的就用NOSQL
其它:
數據挖掘經驗、熟悉hadoop/lucene/mahout;
閒來無事,搞了一些答案。。。可能不是很全面,留這之後備用吧。
一. 基本知識點
1.1 HTTP協議中幾個狀態碼的含義:503 500 401 403 404 200 301 302。。。
200 : 請求成功,請求的數據隨之返回。
301 : 永久性重定向。
302 : 暫時行重定向。
401 : 當前請求須要用戶驗證。
403 : 服務器拒絕執行請求,即沒有權限。
404 : 請求失敗,請求的數據在服務器上未發現。
500 : 服務器錯誤。通常服務器端程序執行錯誤。
503 : 服務器臨時維護或過載。這個狀態時臨時性的。
1.2 Include require include_once require_once 的區別.
處理失敗方式不一樣:
require 失敗時會產生一個致命級別錯誤,並中止程序運行。
include 失敗時只產生一個警告級別錯誤,程序繼續運行。
include_once/require_once和include/require 處理錯誤方式同樣,
惟一區別在於當所包含的文件代碼已經存在時候,不在包含。
1.3 PHP/Mysql中幾個版本的進化史,好比mysql4.0到4.1,PHP 4.x到5.1的重大改進等等。
1.4 HEREDOC介紹
一種定義字符串的方法。
結構:
<<<。在該提示符後面,要定義個標識符(單獨一行),
而後是一個新行。接下來是字符串 自己,
最後要用前面定義的標識符做爲結束標誌(單獨一行)
注意:
標識符的命名也要像其它標籤同樣遵照PHP的規則:
只能包含字母、數字和下劃線,而且必須以字母和下劃線做爲開頭
1.5 寫出一些php魔幻(術)方法;
__construct() 實例化類時自動調用。
__destruct() 類對象使用結束時自動調用。
__set() 在給未定義的屬性賦值的時候調用。
__get() 調用未定義的屬性時候調用。
__isset() 使用isset()或empty()函數時候會調用。
__unset() 使用unset()時候會調用。
__sleep() 使用serialize序列化時候調用。
__wakeup() 使用unserialize反序列化的時候調用。
__call() 調用一個不存在的方法的時候調用。
__callStatic()調用一個不存在的靜態方法是調用。
__toString() 把對象轉換成字符串的時候會調用。好比 echo。
__invoke() 當嘗試把對象當方法調用時調用。
__set_state() 當使用var_export()函數時候調用。接受一個數組參數。
__clone() 當使用clone複製一個對象時候調用。
1.6 一些編譯php時的configure 參數
–prefix=/usr/local/php php安裝目錄
–with-config-file-path=/usr/local/php/etc 指定php.ini位置
–with-mysql=/usr/local/mysql mysql安裝目錄,對mysql的支持
–with-mysqli=/usr/local/mysql/bin/mysql_config mysqli文件目錄,優化支持
–enable-safe-mode 打開安全模式
–enable-ftp 打開ftp的支持
–enable-zip 打開對zip的支持
–with-bz2 打開對bz2文件的支持
–with-jpeg-dir 打開對jpeg圖片的支持
–with-png-dir 打開對png圖片的支持
–with-freetype-dir 打開對freetype字體庫的支持
–without-iconv關閉iconv函數,種字符集間的轉換
–with-libxml-dir 打開libxml2庫的支持
–with-xmlrpc 打開xml-rpc的c語言
–with-zlib-dir 打開zlib庫的支持
–with-gd 打開gd庫的支持
更多可使用 ./configure help 查看
1.7 向php傳入參數的三種方法。
方法一 使用$argc $argv
方法二 使用getopt函數()
方法三 提示用戶輸入,而後獲取輸入的參數。有點像C語言
1.8 (mysql)請寫出數據類型(int char varchar datetime text)的意思; 請問varchar和char有什麼區別;
int : 數值類型
char : 固定長度字符串類型
varchar : 可變長度字符串類型
datetime : 時期時間類型
text : 文本類型
varchar和char有什麼區別:
a. char 長度是固定的,無論你存儲的數據是多少他都會都固定的長度。
而varchar則處可變長度但他要在總長度上加1字符,這個用來存儲位置。
b. char 固定長度,因此在處理速度上要比varchar快速不少,可是浪費存儲空間,
因此對存儲不大,但在速度上有要求的可使用char類型,反之能夠用varchar類型來實例。
1.9 error_reporting 等調試函數使用
error_reporting() 函數可以在運行時設置php.ini中 error_reporting 指令。
因此能夠再程序中隨時調節顯示的錯誤級別。
使用此函數時 display_errors必須是打開狀態。
1.10 您是否用過版本控制軟件? 若是有您用的版本控制軟件的名字是?
1.11 posix和perl標準的正則表達式區別;
1.12 Safe_mode 打開後哪些地方受限.
啓動safe_mode,會對許多PHP函數進行限制,特別是和系統相關的文件打開、命令執行等函數.
全部操做文件的函數將只能操做與腳本UID相同的文件.
1.13 寫代碼來解決多進程/線程同時讀寫一個文件的問題。
PHP是不支持多線程的,可使用php的flock加鎖函數實現。
$fp = fopen("/tmp/lock.txt", "w+");
if (flock($fp, LOCK_EX)) { // 進行排它型鎖定
fwrite($fp, "Write something here\n");
flock($fp, LOCK_UN); // 釋放鎖定
} else {
echo "Couldn't lock the file !";
}
fclose($fp);
1.14 寫一段上傳文件的代碼。
upload.html
<form enctype="multipart/form-data" method="POST" action="upload.php">
Send this file: <input name="name" type="file" />
<input type="submit" value="Send File" />
</form>
upload.php
$uploads_dir = '/uploads';
foreach ($_FILES["error"] as $key => $error) {
if ($error == UPLOAD_ERR_OK) {
$tmp_name = $_FILES["tmp_name"][$key];
$name = $_FILES["name"][$key];
move_uploaded_file($tmp_name, "$uploads_dir/$name");
}
}
1.15 Mysql 的存儲引擎,myisam和innodb的區別。
a. MyISAM類型不支持事務處理等高級處理,而InnoDB類型支持.
b. MyISAM類型的表強調的是性能,其執行數度比InnoDB類型更快.
c. InnoDB不支持FULLTEXT類型的索引.
d. InnoDB 中不保存表的具體行數,也就是說,
執行select count(*) from table時,InnoDB要掃描一遍整個表來計算有多少行,
可是MyISAM只要簡單的讀出保存好的行數便可.
e. 對於AUTO_INCREMENT類型的字段,InnoDB中必須包含只有該字段的索引,可是在MyISAM表中,能夠和其餘字段一塊兒創建聯合索引。
f. DELETE FROM table時,InnoDB不會從新創建表,而是一行一行的刪除。
g. LOAD TABLE FROM MASTER操做對InnoDB是不起做用的,解決方法是首先把InnoDB表改爲MyISAM表,導入數據後再改爲InnoDB表,
可是對於使用的額外的InnoDB特性(例如外鍵)的表不適用.
h. MyISAM支持表鎖,InnoDB支持行鎖。
二. web 架構,安全,項目經驗
2.1 介紹xdebug,apc,eAccelerator,Xcache,Zend opt的使用經驗。
2.2 使用mod_rewrite,在服務器上沒有/archivers/567.html這個物理文件時,重定向到index.php?id=567 ,請先打開mod_rewrite.
首先,打開mod_rewrite模塊。
其次,http.conf找到如下代碼段:
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
將其中的:AllowOverride None 改成 AllowOverride All ,重啓httpd服務便可。
而後,在項目根目錄下簡歷 .htaccess 文件,填寫規則。
2.3 MySQL數據庫做發佈系統的存儲,一天五萬條以上的增量,預計運維三年,怎麼優化?
a. 設計良好的數據庫結構,容許部分數據冗餘,儘可能避免join查詢,提升效率。
b. 選擇合適的表字段數據類型和存儲引擎,適當的添加索引。
c. mysql庫主從讀寫分離。
d. 找規律分表,減小單表中的數據量提升查詢速度。
e。添加緩存機制,好比memcached,apc等。
f. 不常常改動的頁面,生成靜態頁面。
g. 書寫高效率的SQL。好比 SELECT * FROM TABEL 改成 SELECT field_1, field_2, field_3 FROM TABLE.
2.4 寫出一種排序算法(原理),並說出優化它的方法。
2.5 請簡單闡述您最得意的開發之做
2.6 對於大流量的網站,您採用什麼樣的方法來解決各頁面訪問量統計問題
a. 確認服務器是否能支撐當前訪問量。
b. 優化數據庫訪問。參考2.3
c. 禁止外部訪問連接(盜鏈), 好比圖片盜鏈。
d. 控制文件下載。
e. 使用不一樣主機分流。
f. 使用瀏覽統計軟件,瞭解訪問量,有針對性的進行優化。
2.7 您是否用過模板引擎? 若是有您用的模板引擎的名字是?
Smarty
2.8 請介紹Session的原理,大型網站中Session方面應注意什麼?
2.9 測試php性能和mysql數據庫性能的工具,和找出瓶頸的方法。
2.10 正則提出一個網頁中的全部連接.
2.11 介紹一下常見的SSO(單點登錄)方案(好比dedecms整合discuz的passport)的原理。
2.12 您寫過的PHP框架的特色,主要解決什麼問題,與其餘框架的不一樣點。
2.13 大型的論壇/新聞文章系統/SNS網站在性能優化上有什麼區別?
2.14 相冊類應用:要求在瀏覽器中能同時選中並上傳多個文件,圖片要求能剪裁,壓縮包在服務器端解壓。能上傳單個達50M的文件。上傳過程當中有進度條顯示。每一個圖片能生成四種大小縮略圖,視頻文件要轉成flv供flash播放。敘述要涉及的各種開源軟件和簡單用途。
一羣猴子排成一圈,按1,2,…,n依次編號。而後從第1只開始數,數到第m只,把它踢出圈,從它後面再開始數,再數到第m只,在把它踢出去…,如此不停的進行下去,直到最後只剩下一隻猴子爲止,那隻猴子就叫作大王。要求編程模擬此過程,輸入m、n, 輸出最後那個大王的編號。用程序模擬該過程。
三. unix/linux 基本使用
3.1 linux下查看當前系統負載信息的一些方法。
3.2 vim的基本快捷鍵。
3.3 ssh 安全加強方法;密碼方式和rsa key 方式的配置。
3.4 rpm/apt/yum/ports 裝包,查詢,刪除的基本命令。
3.5 Makefile的基本格式,gcc 編譯,鏈接的命令,-O0 和-O3區別。
3.6 gdb,strace,valgrind的基本使用.
四. 前端,HTML,JS
css盒模型。
javascript中的prototype。
javascript中this對象的做用域。
IE和firefox事件冒泡的不一樣。
什麼是怪異模式,標準模式,近標準模式。
DTD的定義
IE/firefox經常使用hack.
firefox,IE下的前端js/css調試工具。
五.如何理解 ThinkPHP 3.0 架構三(核心 + 行爲 + 驅動)中的行爲?
核心 + 行爲 + 驅動
TP官方簡稱爲:CBD
這個問題,在TP手冊中已經有委詳細地闡述了。。
核心(Core):就是框架的核心代碼,不可缺乏的東西,TP自己是基於MVC思想開發的框架。
行爲(Behavior) :行爲在新版ThinkPHP的架構裏面起着舉足輕重的做用,在系統核心之上,設置了不少標籤擴展位,而每一個標籤位置能夠依次執行各自的獨立行爲。行爲擴展就所以而誕生了,並且不少系統功能也是經過內置的行爲擴展完成的,全部行爲擴展都是可替換和增長的,由此造成了底層框架可組裝的基礎。
驅動( Driver ):數據庫驅動、緩存驅動、標籤庫驅動和模板引擎驅動,以及外置的類擴展。
最好就是下載一份文檔下來看,基本上TP裏面全部的功能,都會有很詳細的描述和範例講解。
框架,即framework。其實就是某種應用的半成品,就是一組組件,供你選用完成你本身的系統。簡單說就是使用別人搭好的舞臺,你來作表演。並且,框架通常是成熟的,不斷升級的軟件。
爲何要用框架?
由於軟件系統發展到今天已經很複雜了,特別是服務器端軟件,設計到的知識,內容,問題太多。在某些方面使用別人成熟的框架,就至關於讓別人幫你完成一些基礎工做,你只須要集中精力完成系統的業務邏輯設計。並且框架通常是成熟,穩健的,他能夠處理系統不少細節問題,好比,事物處理,安全性,數據流控制等問題。還有框架通常都通過不少人使用,因此結構很好,因此擴展性也很好,並且它是不斷升級的,你能夠直接享受別人升級代碼帶來的好處。
框架通常處在低層應用平臺(如java 裏的 J2EE)和高層業務邏輯之間的中間層。
ThinkPHP是一個開源的PHP框架, 是爲了簡化企業級應用開發和敏捷WEB應用開發而誕生的
原名FCS,2007年元旦正式改名爲ThinkPHP,而且遵循Apache2開源協議發佈。早期的思想架構來源於Struts,後來通過不斷改進和完善,同時也借鑑了國外不少優秀的框架和模式,使用面向對象的開發結構和MVC模式,融合了Struts的Action和Dao思想和JSP的TagLib(標籤庫)、RoR的ORM映射和 ActiveRecord模式,封裝了CURD和一些經常使用操做,單一入口模式等,在模版引擎、緩存機制、認證機制和擴展性方面均有獨特的表現
使用ThinkPHP,你能夠更方便和快捷的開發和部署應用,固然不只僅是企業級應用,任何PHP應用開發均可以從ThinkPHP的簡單、兼容和快速的特性中受益。簡潔、快速和實用是ThinkPHP發展秉承的宗旨,爲此ThinkPHP會不斷吸取和融入更好的技術以保證其新鮮和活力,提供WEB應用開發的最佳實踐! 做爲一個總體開發解決方案,ThinkPHP可以解決應用開發中的大多數須要,由於其自身包含了底層架構、兼容處理、基類庫、數據庫訪問層、模板引擎、緩存機制、插件機制、角色認證、表單處理等經常使用的組件,而且對於跨版本、跨平臺和跨數據庫移植都比較方便。而且每一個組件都是精心設計和完善的,應用開發過程僅僅須要關注您的業務邏輯。