這是一篇反面教材,但願也能引發部分程序員的警戒。php
最近半個月時間,通過幾回面試,差很少已經對本身有了定位————距離騰訊T3崗位仍是有一點距離。mysql
由於在一家小公司呆的習慣了(6年),公司沒有人在技術層面超過我,做爲技術核心,感受本身很牛,活在一個小圈子裏面,幾乎不會主動去了解新技術,甚至對php以及js自己都不能算精通。jquery
因此變故出現的時候,我才發現本身的技術脫節有多厲害,雖然以前的面試並無作專門的準備,可是與6年前找工做的情形相比,差距很是的大。linux
下面是我整理的一部分遇到的面試題,我儘可能用我所知道的知識來進行陳述,確定會有不少誤解以及遺漏,但願你們可以指正。程序員
答:mysql_real_escape_string須要預先鏈接數據庫,並可在第二個參數傳入數據庫鏈接(不填則使用上一個鏈接) 二者都是對數據庫插入數據進行轉義,可是mysql_real_escape_string轉義時,會考慮數據庫鏈接的字符集。 它們的用處都是用來能讓數據正常插入到數據庫中,並防止sql注入,可是並不能作到100%防止sql注入。面試
答;由於客戶端編碼以及服務器端編碼不一樣,可能產生注入問題,可是其實這種場景很少見。redis
繼續答:被棄用的緣由是官方再也不建議使用mysql_xx的數據庫操做方式,建議使用pdo和mysqli,由於無論從性能跟安全來看,mysqli都比mysql要好。算法
衍生出來的問題是mysqli的鏈接複用(持久化)問題,這一塊我並無答好。sql
答:內存泄漏是由於一塊被分配內存既不能被使用,也不能被回收,直到瀏覽器進程結束。shell
產生泄漏的緣由是閉包維持函數內局部變量,不能被釋放,尤爲是使用閉包並存在外部引用還setInterval的時候危害很大。
我查了一下資料,從比較淺的方位來再回答一下這個問題: 產生泄漏的緣由有好幾種: (1) 頁面元素被刪除,可是綁定在該元素上的事件未被刪除; (2) 閉包維持函數內局部變量(外部不可控),使其得不到釋放; (3) 意外的全局變量; (4) 引用被刪除,可是引用內的引用,還存在內存中。 從上述緣由上看,內存泄漏產生的根本緣由是引用沒法正確回收,值類型並不能引起內存泄漏。 對於每一個引用,都有本身的引用計數,當引用計數歸零或被標記清除時,js垃圾回收器會認爲該引用能夠回收了。
答:閉包是指存在於一個做用域鏈分支的函數域內的函數,該函數能夠向上逐級訪問做用域鏈上的變量,直到找到爲止。當閉包存在外部引用時,js會維持閉包自身以及所在函數做用域鏈的內存狀態。
繼續答:跟原型鏈沒有什麼關聯,函數的原型(prototype)主要用於實現繼承,原型鏈可用於追溯繼承關係,與做用域鏈相似,都是向上逐級訪問屬性,直到被找到,原型鏈的頂層是null,能夠理解爲全部的object都繼承至null,因此null的類型是object。
繼續答:做用域鏈能夠看做是一個樹形結構,由根節點window向下擴散,下層節點能夠訪問上層節點,可是上層節點沒法訪問下層節點,產生閉包的函數做用域屬於節點中的一個,向下擴散後閉包函數產生葉子節點,葉子節點之間能夠互相訪問,當訪問的變量在葉子節點中沒法找到時,向上層節點查找,直到被找到爲止,這個概念有點相似原型鏈上的屬性查找。
答:65535-1000 = 64535(端口數)
答:http頭部能夠被篡改,可是隻能修改X_FORWARDED_FOR,真實ip地址(REMOTE_ADDR)很難修改(除非是路由器去修改),由於真實ip是底層會話ip地址,並且由於TCP 3次握手的存在,鏈接沒法創建,僞造的意義不大,至於UDP的話,通常是內網才使用UDP通訊。
答:百萬獎品在打亂後預先insert到數據庫,全部中獎操做,均只能update,不能insert。進來抽獎的用戶使用memcahe原子加鎖,實現抽獎次數自增,當抽獎次數到達3時,返回不中獎。
答:使用redis隊列存儲請求,跑守護進程異步發獎,產生的問題是用戶沒法實時看到中獎狀況。
再答:使用全局內存加鎖確保抽獎過程是單進程在跑,可是會面臨大併發阻塞問題。
答:設置獎品機率,分三張表,都使用innodb引擎,一張存中獎記錄(預先插入一行),一張存獎品發放概況,一張存用戶抽獎狀況(uin惟一索引),大併發狀況下,利用mysql的排他鎖進行併發控制。流程以下:
begin
查詢用戶抽獎次數,加排他鎖
對用戶抽獎次數的更新/插入
鎖行查詢發放狀況
得到抽獎結果(某些獎品發完以後,動態變動機率)
更新發放表
插入中獎記錄
commit
複製代碼
答:這方面不是很瞭解
答:不知道
答:crc32,別的校驗多是取模校驗奇偶數吧。
答:O(log(n)),O(1) 由於哈希表是散列的,在遇到
key
>'12'這種查找條件時,不起做用,而且空間複雜度較高。
答:使用sapi通信,sapi是php封裝的對外數據傳遞接口,一般有cgi/fastcgi/cli/apache2handler四種運行模式。
答:垃圾回收是指當php運行狀態結束時,好比遇到了exit/die/致命錯誤/腳本運行結束時,php須要回收運行過程當中建立的變量、資源的內存。
ZEND引擎維護了一個棧zval,每一個建立的變量和資源都會壓入這個棧中,每一個壓入的數組結構都相似:[refcount => int, is_ref => 0|1, value => union, type => string],變量被unset時,ref_count若是變成0,則被回收。 當遇到變量循環引用自身時,使用同步回收算法回收。
答:除了直到是DOM元素查找引擎以外,一無所知。
答:創建映射關係並緩存起來;資源並不能真正同步加載,只是返回一個回調。
答:可存儲數據結構不一樣;redis支持持久化存儲。
答:先用字典查找,再嘗試暴力破解。
答:沒有了。 備註:嗯,事實上也確實沒有特別好的辦法,只能使用TB級的海量特徵庫用數據庫存起來,然再分片查找。
答:會發生fatal錯誤,由於繼承的方法或屬性只能維持或放大權限,不能縮小,好比protected重載爲public是可行的。
答: 0、瀏覽器本地緩存匹配; 一、本地hosts映射對比; 二、本地dns緩存解析; 三、遠程dns解析得到服務器ip地址; 四、瀏覽器發送tcp鏈接請求包(syn); 五、請求包通過傳輸層、網絡層、數據鏈路層封裝經過網卡到達路由器; 六、路由器轉發數據包到所屬運營商服務器; 七、運營商服務器經過尋址最短路徑經過中繼節點到達指定ip地址; 八、服務器端可能存在反向代理或者負載均衡,都是直接轉發請求至上游服務器,固然也能夠制定安全防護規則直接丟棄請求包; 九、上游服務器收到鏈接請求,在自身可用的狀況下,返回(syn+ack); 十、瀏覽器校驗ack,再次發送(syn+ack); 十一、服務器校驗ack切換鏈接狀態至established,而後根據請求傳輸數據包; 十二、當transform-encoding爲chunked時,瀏覽器開始渲染頁面; 1三、四次揮手,鏈接關閉; 1四、渲染數據完成。
答:長鏈接機制,表示keep-alive-timeout時間內,若是鏈接沒有closed,再次傳輸數據再也不須要三次握手了。
備註:由於平時開發都是在windows環境,對linux瞭解不足,這一塊幾乎是0分。
這個是被鄙視最慘的一家了,首先會有筆試,相對來講並不複雜,可是有些坑,不少已經忘記了。
印象深入的是我說本身熟悉經常使用設計模式,而後讓我畫UML類圖,我就懵逼了,因此在寫簡歷的時候,最好是寫本身很是熟悉的,若是隻是隻知其一;不知其二,並無必要放到簡歷中。
這裏僅列舉幾個問到的問題:
目前還在找工做中,在我看來8年的程序員怎麼也不該該是這樣子的,溫水煮青蛙的教訓很是慘痛,好在如今認識到問題還不晚,等到了35歲這個年紀,可能就真的晚了。