PHP中級工程師面試題

1. 什麼是MVC?

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

  • Model:數據信息存取層。
  • View:view層負責將應用的數據以特定的方式展現在界面上。
  • Controller:通常控制器負責從視圖讀取數據,控制用戶輸入,並向模型發送數據。

2. GD庫是做什麼用的?

GD庫提供了一系列用來處理圖片的功能,使用GD庫可以處理圖片,或者生成圖片。在網站上GD庫通常用來生成縮略圖或者用來對圖片加水印或者對網站數據生成報表。

3. session與cookie的區別?

  • session:儲存用戶訪問的全局唯一變量,存儲在服務器上的php指定的目錄中的(session_dir)的位置進行的存放
  • cookie:用來存儲連續訪問一個頁面時所使用,是存儲在客戶端,對於Cookie來說是存儲在用戶WIN的Temp目錄中的。
  • 兩者都可通過時間來設置時間長短。

4. 用PHP打印出前一天的時間格式是2010-7-3 12:28:21?

echo date(‘Y-m-d H:i:s’, strtotime(‘-1 days’));

5. 對於大流量的網站,您採用什麼樣的方法來解決訪問量問題?

答:確認服務器硬件是否足夠支持當前的流量,數據庫讀寫分離,優化數據表,程序功能規則,禁止外部的盜鏈,控制大文件的下載,使用不同主機分流主要流量。

6. PHP魔術方法都有哪些?

__construct() 類的構造函數
__destruct() 類的析構函數
__construct() 類的構造函數
__call() 在對象中調用一個不可訪問方法時調用
__callStatic() 用靜態方式中調用一個不可訪問方法時調用
__get() 獲得一個類的成員變量時調用
__set() 設置一個類的成員變量時調用
__isset() 當對不可訪問屬性調用isset()或empty()時調用
__unset() 當對不可訪問屬性調用unset()時被調用
__sleep() 執行serialize()時,先會調用這個函數
__wakeup() 執行unserialize()時,先會調用這個函數
__toString() 類被當成字符串時的迴應方法
__invoke() 調用函數的方式調用一個對象時的迴應方法
__set_state() 調用var_export()導出類時,此靜態方法會被調用
__clone() 當對象複製完成時調用
__autoload() 嘗試加載未定義的類
__debugInfo() 打印所需調試信息

7. 你怎麼理解命名空間?

PHP 命名空間(namespace)是在PHP 5.3中加的.PHP 命名空間可以解決以下兩類問題:
  • (a)用戶編寫的代碼與PHP內部的類/函數/常量或第三方類/函數/常量之間的名字衝突。
  • (b)爲很長的標識符名稱(通常是爲了緩解第一類問題而定義的)創建一個別名(或簡短)的名稱,提高源代碼的可讀性。

8. 你瞭解RESTFUL嗎?

REST 指的是一組架構約束條件和原則。滿足這些約束條件和原則的應用程序或設計就是 RESTful。
Web 應用程序最重要的 REST 原則是,客戶端和服務器之間的交互在請求之間是無狀態的。從客戶端到服務器的每個請求都必須包含理解請求所必需的信息。如果服務器在請求之間的任何時間點重啓,客戶端不會得到通知。此外,無狀態請求可以由任何可用服務器回答,這十分適合雲計算之類的環境。客戶端可以緩存數據以改進性能。
在服務器端,應用程序狀態和功能可以分爲各種資源。資源是一個有趣的概念實體,它向客戶端公開。資源的例子有:應用程序對象、數據庫記錄、算法等等。每個資源都使用 URI (Universal Resource Identifier) 得到一個唯一的地址。所有資源都共享統一的接口,以便在客戶端和服務器之間傳輸狀態。使用的是標準的 HTTP 方法,比如 GET、PUT、POST 和 DELETE。Hypermedia 是應用程序狀態的引擎,資源表示通過超鏈接互聯。

9. 做過APP接口沒?怎麼做的?

用框架寫接口,普通POST,GET接口,有時候用RESTFUL接口。寫控制器從模型調用數據,返回XML或者JSON數據就行了。
APP接口主要解決兩個問題,一個SESSION問題,一個是TOKEN問題。客戶端第一次請求,服務端生成SESSION_ID,返回給客戶端。之和的請求中,客戶端把SESSION_ID傳給服務端,服務端用SESSION_ID函數可以確保多次請求用的同一個SESSION。TOKEN需要加密和服務端驗證。

10. PHP如何實現緩存?

1、數據緩存——普遍的一種緩存技術
非常直觀的字面意思,就是把數據先存放好,減少對數據庫的訪問。第一次訪問時,把要用到的數據保存到一個文件裏,然後用戶再次訪問頁面時,就先檢測要查詢的數據是否在緩存文件裏,若存在,則直接取出,不需再次訪問數據庫。
一般這些數據以數組的形式保存。
2、頁面緩存
和數據緩存差不多,每次訪問頁面時,就檢測相應的頁面緩存是否存在,若不存在,則查詢數據庫得到相應的數據,同時生成緩存頁面,這樣,在下次訪問就可以直接取出緩存頁面,不必再次查詢數據庫。
3、內存緩存
不作過多分析,一般熟藉助第三方軟件進行優化,比如Memcached、Redis。
以上方法能夠解決頻繁訪問數據庫的問題,但是缺乏時效性,在數據庫改變後,他們默認的數據還是修改之前的。所以就要在規定時間內清除緩存,以更新數 據。比如在每次更新緩存後設定一個時間戳t1,當前的時間戳t2,規定緩存時間爲T,那麼,在t1與t2相差在T之內時,就不更新緩存,否則,超過了T, 就重新查詢數據庫,清除之前的緩存,又得到一個新的時間戳,依次循環下去。

11. 用過smarty沒有?用過什麼模板引擎?

Smarty是很老的技術了。常用的框架如ThinkPHP,Yii都自帶模板引擎。最常用的方法是3個:assign賦值,display顯示頁面,fetch獲取頁面內容而非顯示。

12. 如何合併數組?

操作符+,在前一個數的基礎上插入後一個數組,如果有相同的拋棄,而array_merge 是在前一個參數基礎上插入後一個參數,如果有相同用的key 用後一個覆蓋。

13. 常用的設計模式有哪些?

單例模式
簡單工廠模式
策略模式
觀察者模式
註冊(樹)模式
迭代模式
單例模式,簡單工廠模式,策略模式,觀察者模式,註冊(樹)模式,迭代模式。

14. 怎麼認識PHP的異常處理?

可以使用檢測(try)、拋出(throw)和捕獲(catch)異常。即使用try檢測有沒有拋出(throw)異常,若有異常拋出(throw),使用catch捕獲異常。一個 try 至少要有一個與之對應的 catch。定義多個 catch 可以捕獲不同的對象。PHP 會按這些 catch 被定義的順序執行,直到完成最後一個爲止。而在這些 catch 內,又可以拋出新的異常。

15. 解釋下PHP的垃圾回收機制?

php 5.3之前使用的垃圾回收機制是單純的“引用計數”,也就是每個內存對象都分配一個計數器,當內存對象被變量引用時,計數器 1;當變量引用撤掉後,計數器-1;當計數器=0時,表明內存對象沒有被使用,該內存對象則進行銷燬,垃圾回收完成。

“引用計數”存在問題,就是當兩個或多個對象互相引用形成環狀後,內存對象的計數器則不會消減爲0;這時候,這一組內存對象已經沒用了,但是不能回收,從而導致內存泄露;
php5.3開始,使用了新的垃圾回收機制,在引用計數基礎上,實現了一種複雜的算法,來檢測內存對象中引用環的存在,以避免內存泄露。

16. 打開php.ini中的safe_mode,會影響哪些函數?至少說出6個。(新浪)

safe_mode,PHP安全模式,它提供一個基本安全的共享環境,在一個有多個用戶賬戶存在的php開發的web服務器上。當安全模式打開的時候,一些函數將被完全的禁止,而另一些函數的功能將會受到限制,如:chdir,move_uploaded_file,chgrp,parse_ini_file,chown,rmdir,copy,rename,fopen,require,mkdir,unlink等。
注意,在php5.3以上版本,safe_mode被棄用,在php5.4以上版本,則將此特性完全去除了。

17. 抓取遠程圖片到本地,你會用什麼函數?(51.com筆試題)

file_get_contents或者curl

18. 請寫一段PHP代碼,確保多個進程同時寫入同一個文件成功

核心思路:加鎖

<?php
    $fp = fopen("lock.txt","w+");
    if (flock($fp,LOCK_EX)) {
        //獲得寫鎖,寫數據
        fwrite($fp, "write something");

        // 解除鎖定
        flock($fp, LOCK_UN);
    } else {
        echo "file is locking...";
    }
    fclose($fp);
?>

19. 寫一個函數,能夠遍歷一個文件夾下的所有文件和子文件夾。

<?php
    function my_scandir($dir){
        $files = array();
        if(is_dir($dir)){
            if ($handle = opendir($dir)) {
                while (($flie = readdir($handle))!== false) {
                    if ($flie!="." && $file!="..") {
                        if (is_dir($dir."/".$file)) {
                            $files[$file] = my_scandir($dir."/".$file);
                        } else {
                            $files[] = $dir."/".$file;
                        }
                    }
                }
                closedir($handle);
                return $files;
            }
        }
    }
?>

20. PHP如何實現頁面跳轉

方法一:php函數跳轉,
缺點:header頭之前不能有輸出,跳轉後的程序繼續執行,可用exit中斷執行後面的程序。

  • header(“Location:網址”);//直接跳轉
  • header(“refresh:3;url=http://axgle.za.NET”);//三秒後跳轉

方法二:利用meta

在這裏插入圖片描述

21. 寫出一個正則表達式,過慮網頁上的所有JS/VBS腳本(即把script標記及其內容都去掉):

過濾JavaScript腳本參考:

<?php
    header("content-type:text/html;charset=utf-8");

    $script = "以下內容不顯示:<script type='text/javascript'>alert('cc');</script>";
    $pattern = '/<script[^>]*?>.*?</script>/si';

    echo preg_replace($pattern, "腳本內容", $script);//以下內容不顯示:腳本內容
?>

22. 請寫一個函數驗證電子郵件的格式是否正確(要求使用正則)

preg_match('/^[\w\-\.]+@[\w\-]+(\.\w+)+$/',$email);

23. 請寫出並說明如何在命令行下運行PHP腳本(寫出兩種方式)同時向PHP腳本傳遞參數?(騰訊)

首先進入php安裝目錄
php -f d:/wamp/www/1.php 其中-f參數指定要執行的php文件
php -r phpinfo(); 其中-r表示直接執行php代碼,無需寫開始結束標記

24. PHP中,如何獲得一個數組的鍵值?(酷訊)

使用key()可以獲得數組中當前元素的鍵名,使用current()則可以返回當前元素的值。
使用array_keys()則可以得到數組中所有的鍵名。使用foreach結構foreach($arr as key=>value)可以通過key和value分別獲取鍵名和值。

25. 如果我的網站用的utf-8編碼,爲防止亂碼出現,都需要注意哪些地方? 從以下幾個方面考慮:

  • 數據庫中庫和表都用utf8編碼 php連接mysql,指定數據庫編碼爲utf8 mysql_query(“set names
    utf8”);
  • php文件指定頭部編碼爲utf-8header(“content-type:text/html;charset=utf-8”);
  • 網站下所有文件的編碼爲utf8
  • html文件指定編碼爲utf-8<metahttp-equiv="Content-Type"content=“text/html;charset=utf-8”/>

26. 在url中用get傳值的時候,若中文出現亂碼,應該用哪個函數對中文進行編碼?

urlencode

27. 寫出五種以上你使用過的PHP的擴展的名稱(提示:常用的PHP擴展)

常用擴展名
mb_sring
iconv
curl
GD
XML
socket
MySQL
PDO

28. 請描述如下URL重寫規則的用意。

<IfModulemod_rewrite.c>
RewriteEngineon
RewriteCond%{REQUEST_FILENAME}!-f
RewriteCond%{REQUEST_FILENAME}!-d
RewriteBase/
RewriteRule./index.php[L]
</IfModule>
如果REQUEST_FILENAME文件存在,就直接訪問文件,不進行下面的rewrite規則,
如果REQUEST_FILENAME目錄存在,就直接訪問目錄,不進行下面的rewrite規則,
RewriteRule./index.php[L]的意思是把所有的請求都給index.php處理。

29. Warning:Cannot modify header information-headers already sent by(output started at D:\src\init.php:7)in D:\src\init.php on line10通常什麼情況下php會報該警告信息?

一般是在header、set_cookie以及session_start函數前面有輸出(包括空格)的情況下,會報該警告信息

30. 什麼是ORM?

對象關係映射(英語:Object Relation Mapping,簡稱ORM,或O/RM,或O/R mapping),是一種程序技術,用於實現面向對象編程語言裏不同類型系統的數據之間的轉換。從效果上說,它其實是創建了一個可在編程語言裏使用的--“虛擬對象數據庫”。

31.什麼是RBAC

基於角色的訪問控制(Role-Based Access Control)作爲傳統訪問控制(自主訪問,強制訪問)的有前景的代替受到廣泛的關注。在RBAC中,權限與角色相關聯,用戶通過成爲適當角色的成員而得到這些角色的權限。這就極大地簡化了權限的管理。在一個組織中,角色是爲了完成各種工作而創造,用戶則依據它的責任和資格來被指派相應的角色,用戶可以很容易地從一個角色被指派到另一個角色。角色可依新的需求和系統的合併而賦予新的權限,而權限也可根據需要而從某角色中回收。角色與角色的關係可以建立起來以囊括更廣泛的客觀情況。

32. 如何防止SQL注入?

addslashes() 是強行加\
mysql_real_escape_string() 會判斷字符集,但是對PHP版本有要求
mysql_escape_string 不考慮連接的當前字符集
轉義引號。

33. 如何避免跨站攻擊?

要完成一次CSRF攻擊,受害者必須依次完成兩個步驟:

1.登錄受信任網站A,並在本地生成Cookie。
2.在不登出A的情況下,訪問危險網站B。

服務端進行CSRF防禦
1.Cookie Hashing(所有表單都包含同一個僞隨機值)。因爲攻擊者不能獲得第三方的Cookie(理論上),所以表單中的數據也就構造失敗了
2.驗證碼。每次的用戶提交都需要用戶在表單中填寫一個圖片上的隨機字符串。
3.One-Time Tokens(不同的表單包含一個不同的僞隨機值)

34. 你都做過什麼項目,做的那幾個模塊?擔任的什麼職責?

在這裏插入圖片描述

35. 如何認識PHP框架的路由機制?

主要是通過僞靜態來實現單一入口,mvc框架都是這樣。將所有請求通過apache僞靜態解析轉給某個指定文件,然後通過php的$_SERVER[]這個全局變量來去的請求的路徑字符串,對其進行解析再分配給指定的類去處理,基本就是這樣。
最簡單的方法是建立一個.htaccess文件。文件內容貼給你

<IfModule !mod_rewrite.c>
    ErrorDocument 500 'mod_rewrite must be enabled'
</IfModule>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php

將這個文件放在根目錄下即可。文件作用很明顯:將所有的請求路徑轉給index.php,然後在index.php裏做請求字符串的判斷即可打到路由解析功能。

36. PHP有幾種運行方式?

1、CGI

CGI即通用網關接口(common gatewag interface),它是一段程序,通俗的講CGI就象是一座橋,把網頁和WEB服務器中的執行程序連接起來,它把HTML接收的指令傳遞給服務器的執 行程序,再把服務器執行程序的結果返還給HTML頁。CGI 的跨平臺性能極佳,幾乎可以在任何操作系統上實現。
2、FastCGI
fast-cgi 是cgi的升級版本,FastCGI像是一個常駐(long-live)型的CGI,它可以一直執行着,只要激活後,不會每次都要花費時間去fork一 次。PHP使用PHP-FPM(FastCGI Process Manager),全稱PHP FastCGI進程管理器進行管理。
3、APACHE2HANDLER
PHP作爲Apache模塊,Apache服務器在系統啓動後,預先生成多個進程副本駐留在內存中,一旦有請求出 現,就立即使用這些空餘的子進程進行處理,這樣就不存在生成子進程造成的延遲了。這些服務器副本在處理完一次HTTP請求之後並不立即退出,而是停留在計算機中等待下次請求。對於客戶瀏覽器的請求反應更快,性能較高。
4、CLI
cli是php的命令行運行模式,大家經常會使用它,但是可能並沒有注意到(例如:我們在linux下經常使用 “php -m”查找PHP安裝了那些擴展就是PHP命令行運行模式;


MySQL數據庫問題:

1.如何設計或配置Mysql,才能達到高效使用的目的。

  • (a)數據庫設計方面,設計結構良好的數據庫,允許部分數據冗餘。 選取最適用的字段屬性,儘可能把字段設置爲NOTNULL,這樣在查詢的時候,數據庫不用去比較NULL值。
  • (b)系統架構設計方面,表散列,把海量數據散列到幾個不同的表裏面,集羣,數據庫查詢和寫入分開。寫高效sql語句,以提高效率。使用連接(join)來代替子查詢使用聯合(union)來代替手動創建的臨時表所得皆必須,只從數據庫取必須的數據。必要的時候用不同的存儲引擎,比如Innodb可以減少死鎖,HEAP可以提高一個數量級的查詢速度。

2.請說出mysql常用存儲引擎?memory存儲引擎的特點?

  • (a)MySQL有多種存儲引擎,每種存儲引擎有各自的優缺點,可以擇優選擇使用:
    -(b)MyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB(BerkeleyDB)、EXAMPLE、FEDERATED、ARCHIVE、CSV、BLACKHOLE。
  • ©MySQL支持數個存儲引擎作爲對不同表的類型的處理器。MySQL存儲引擎包括處理事務安全表的引擎和處理非事務安全表的引擎:
  • (d)MyISAM管理非事務表。它提供高速存儲和檢索,以及全文搜索能力。MyISAM在所MySQL配置裏被支持,它是默認的存儲引擎,除非你配置MySQL默認使用另外一個引擎。
  • (e)MEMORY存儲引擎提供“內存中”表。MERGE存儲引擎允許集合將被處理同樣的MyISAM表作爲一個單獨的表。就像MyISAM一樣,MEMORY和MERGE存儲引擎處理非事務表,這兩個引擎也都被默認包含在MySQL中。
  • (f)註釋:MEMORY存儲引擎正式地被確定爲HEAP引擎。
  • (g)InnoDB和BDB存儲引擎提供事務安全表。BDB被包含在爲支持它的操作系統發佈MySQL-Max二進制分發版裏。InnoDB也默認被包括在所 有MySQL 5.1二進制分發版裏,你可以按照喜好通過配置MySQL來允許或禁止任一引擎。
  • (h)EXAMPLE存儲引擎是一個“存根”引擎,它不做什麼。你可以用這個引擎創建表,但沒有數據被存儲於其中或從其中檢索。這個引擎的目的是服務,在 MySQL源代碼中的一個例子,它演示說明如何開始編寫新存儲引擎。同樣,它的主要興趣是對開發者。 i)NDB Cluster是被MySQL
    Cluster用來實現分割到多臺計算機上的表的存儲引擎。它在MySQL-Max 5.1二進制分發版裏提供。這個存儲引擎當前只被Linux, Solaris, 和Mac OS X 支持。在未來的MySQL分發版中,我們想要添加其它平臺對這個引擎的支持,包括Windows。
  • (j)ARCHIVE存儲引擎被用來無索引地,非常小地覆蓋存儲的大量數據。 k)CSV存儲引擎把數據以逗號分隔的格式存儲在文本文件中。
  • (l)BLACKHOLE存儲引擎接受但不存儲數據,並且檢索總是返回一個空集。
  • ( m)FEDERATED存儲引擎把數據存在遠程數據庫中。在MySQL 5.1中,它只和MySQL一起工作,使用MySQL C Client API。在未來的分發版中,我們想要讓它使用其它驅動器或客戶端連接方法連接到另外的數據源。
  • (n)比較常用的是MyISAM和InnoBD

3.MySQL LEFT JOIN聯查問題,不再舉例。

*4.如何設計一個商城?購物車,商品規格,商品屬性,優惠券,代金券,團購怎麼做?*之後文章會詳細敘述下

5.如何MySQL性能優化?

通過Show命令,慢查詢日誌,profiling分析查詢確定瓶頸。
使用 EXPLAIN 關鍵字可以讓你知道MySQL是如何處理你的SQL語句的。這可以幫你分析你的查詢語句或是表結構的性能瓶頸。
當只要一行數據時使用 LIMIT 1
爲搜索字段建索引
在Join表的時候使用相當類型的例,並將其索引
儘可能的使用 NOT NULL
水平分表
h)垂直分表
i)選擇正確的存儲引擎
避免長連接

算法問題

1.使用PHP描述冒泡排序和快速排序算法,對象可以是一個數組

//冒泡排序(數組排序)

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

//快速排序(數組排序)

function quick_sort($array) {
    if (count($array) <= 1) return $array;
    $key = $array[0];
    $left_arr = array();
    $right_arr = array();
    for ($i=1; $i<count($array); $i++){
        if ($array[$i] <= $key)
            $left_arr[] = $array[$i];
        else
            $right_arr[] = $array[$i];
    }
    $left_arr = quick_sort($left_arr);
    $right_arr = quick_sort($right_arr);
    return array_merge($left_arr, array($key), $right_arr);
}

2.使用PHP描述順序查找和二分查找(也叫做折半查找)算法,順序查找必須考慮效率,對象可以是一個有序數組

//二分查找(數組裏查找某個元素)

function bin_sch($array, $low, $high, $k){
    if ($low <= $high){
    $mid = intval(($low+$high)/2);
    if ($array[$mid] == $k){
    return $mid;
    }elseif ($k < $array[$mid]){
    return bin_sch($array, $low, $mid-1, $k);
    }else{
    return bin_sch($array, $mid+1, $high, $k);
    }
    }
    return -1;
}

//順序查找(數組裏查找某個元素)

function seq_sch($array, $n, $k){
    $array[$n] = $k;
    for($i=0; $i<$n; $i++){
        if($array[$i]==$k){
            break;
        }
    }
    if ($i<$n){
        return $i;
    }else{
        return -1;
    }
}

3.寫一個二維數組排序算法函數,能夠具有通用性,可以調用php內置函數

//二維數組排序, arrarr是數據,keys是排序的健值,$order是排序規則,1是升序,0是降序

function array_sort($arr, $keys, $order=0) {
    if (!is_array($arr)) {
        return false;
    }
    $keysvalue = array();
    foreach($arr as $key => $val) {
        $keysvalue[$key] = $val[$keys];
    }
    if($order == 0){
        asort($keysvalue);
    }else {
        arsort($keysvalue);
    }
    reset($keysvalue);
    foreach($keysvalue as $key => $vals) {
        $keysort[$key] = $key;
    }
    $new_array = array();
    foreach($keysort as $key => $val) {
        $new_array[$key] = $arr[$val];
    }
    return $new_array;
}

PHP周邊問題

1.說出你常用的版本控制器?

SVN
GIT

2.Linux常用的命令,知道哪些?

ls
pwd
cd
cat
vi
service
chmod
chown
tar
su

3.Linux的定時任務如何執行?

使用crontab執行。
在Linux中你應該先輸入crontab -e,然後就會有個vi編輯界面,再輸入0 3 * * 1 /clearigame2內容到裏面 :wq 保存退出。
在crontab文件中如何輸入需要執行的命令和時間。該文件中每行都包括六個域,其中前五個域是指定命令被執行的時間,最後一個域是要被執行的命令。
每個域之間使用空格或者製表符分隔。格式如下:
minute hour day-of-month month-of-year day-of-week commands
合法值 00-59 00-23 01-31 01-12 0-6 (0 is sunday) commands(代表要執行的腳本)
除了數字還有幾個個特殊的符號就是"*"、"/“和”-"、",",*代表所有的取值範圍內的數字,"/“代表每的意思,”/5"表示每5個單位,"-“代表從某個數字到某個數字,”,"分開幾個離散的數字。
每天早上6點
0 6 * * * echo “Good morning.” >> /tmp/test.txt //注意單純echo,從屏幕上看不到任何輸出,因爲cron把任何輸出都email到root的信箱了。
每兩個小時
0 */2 * * * echo “Have a break now.” >> /tmp/test.txt

4.Linux如何安裝Apache,PHP,MySQL,Nginx?

用的CentOS,Yum安裝。生產環境有專門的運維工程師負責。
之前寫的文章詳細以參考一下
https://blog.csdn.net/github_37553763/article/details/105990241


前端問題

1.都用過哪些JavaScript框架?

jQuery和擴展等

2.JavaScript的this指向問題?

javascript 中的 this 有 五種情況:

全局範圍 它 會指向 全局對象( 瀏覽器下指window)
全局函數調用 還是指向全局對象
.對象函數調用 調用某個對象的函數, 它指向 當前對象。
使用 new 實例化對象時 它指向 新創建的 對象
調用某些方法時 如: Function.prototype 上的 call 或者 apply 方法 以及 with等;它指向 傳入的對象。

3.談談你對prototype的理解?

每個函數都有一個prototype屬性,這個屬性是指向一個對象的引用,這個對象稱爲原型對象,原型對象包含函數實例共享的方法和屬性,也就是說將函數用作構造函數調用(使用new操作符調用)的時候,新創建的對象會從原型對象上繼承屬性和方法。
prototype 屬性使您有能力向對象添加屬性和方法。

4.談談你對Bootstrap的理解。

第一:預處理腳本:
Bootstrap的源碼是基於最流行的CSS預處理腳本-Less和Sass開發的。你可以採用預編譯的CSS文件快速開發,也可以從源碼定製自己需要的樣式。例如。如果你頁面上有很多同樣的效果。只需要寫一個效果類。然後讓用到的地方去繼承他。就不需要再寫了。
第二:一個框架,多種設備
你的網站和應用能在Bootstrap的幫助下通過同一個代碼快速,有效設配手機,平板、PC設備,這都是CSS媒體查詢的功勞。
第三:特效齊全
Bootstrap提供了全面、美觀的文檔、可以找到關於HTML元素,HTML和CSS組件、jQuery插件方面的所有詳細文檔。
Bootstrap組件: Bootstrap中包含了豐富的Web組件,根據這些組件,可以快速的搭建一個漂亮、功能完備的網站。比如:下拉菜單、按鈕組、按鈕下拉菜單、導航、導航條、路徑導航、分頁、排版、縮略圖、警告對話框、進度條、媒體對象等。
JavaScript插件Bootstrap自帶了13個jQuery插件,這些插件爲Bootstrap中的組件賦予了“生命”。其中包括:模式對話框、標籤頁、滾動條、彈出框等。 還有更重要的一點是,Bootstrap是完全開源的。它的代碼託管,開發,維護都依賴GITHub平臺。
其次:
我們看下使用Bootstrap的利弊:
優點:
a) 提高開發效率。
b) 規範名稱定義,便於維護。
c) 規範項目開發流程 d)css代碼更清晰、簡單。html代碼更合理。
e) 大規模項目中可以減少用戶下載
缺點:
a) 學習成本提高。你需要了解整個框架,需要閱讀框架的文檔。
b)css框架對於一個小項目等頁面來說很臃腫。框架中可能有大部分你用不到的代碼。
c)可能會無法幫助你的技術提高。太依賴框架,以至於很難排除bug。包括框架中本身就帶的bug。
d) 選擇自己需要的框架與開發框架都很痛苦。寫到後面發現越來越不靈活,越來越臃腫。
1、頁面外部引用樣式過多。譬如關於ul的margin定義,在格式化的css中會聲明爲0,而在基本樣式的css中又可能會聲明margin:5px 10px;所以在Yslow中會出現多次定義。
2、組件複用性的考量。譬如表單定義的css中定義了所有表單的修飾,而假定在註冊這個頁面中只是需要這個css的百分之三十。那是否應切割出去那不要的百分之七十?綜合以上的二個問題,個人認爲解決的方式便是封裝,讓該有的有,不該有的沒有。儘量減少http連接數和css的大小。但如果徹底是這樣做的話,css的複用性又會變得很差,後期手工的封裝會很痛苦。
3、到底該不該支持em?可見如要支持em,最大的目的是爲了在瀏覽器中可以根據用戶的分辨率大小自由縮放,對於擁有超大顯示器的用戶與小顯示器的用戶是非常有用的。可是在採集我們用戶的瀏覽器數據後,發現分辨處於這二端的用戶非常少,可想而知,爲這部分的用戶多花比正常開發一倍以上的時間顯然是件不划算的事情,當然這是個建議,我們也希望能使用em帶給用戶最好的感受。
PS:博主認爲,如果有前端技術的博友們,應該都不是問題。初學者是有點難度的。
基於Bootstrap版本的使用:
目前使用較廣的是版本2和3,其中2的最新版本是2.3.2,3的最新版本3.3.5。
版本4最主要變化是:
1.從Less遷移到Sass
(爲什麼?因爲那麼Sass和LESS是一樣的,只是CSS預處理器中的一種而以。但是Less相對來說,語法太過嚴格,所以使用的人也就少了。)
2.改進網格系統
3.缺省彈性框
4.支持 Dropped wells,thumbnails,and panels for cards
5.合併所有HTML resets到一個新的模塊中:Reboot 全新自定義選項
6.不再支持IE8
7.重寫所有的JavaScript插件
8.改進工具提示和popovers的自動定位
9.改進文檔
10.其他大量改進

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章