首頁  >  文章  >  後端開發  >  php高級面試題分享

php高級面試題分享

小云云
小云云原創
2018-05-15 11:25:501924瀏覽

最近接連面試了幾家公司,有些重要問題記錄一下,督促自己學習提高,#內容很多,一點點完善,一步步學習,#同時希望給朋友們一些幫助。

一、mysql相關知識
    1、mysql最佳化方法
            MYSQL 最佳化常用方法
   分錶
   3、 Mysql+如何做雙機熱備與負載平衡
   4、資料表類型有哪些
       MyISAM、
InnoDB、HEAP、BOB,ARCHIVE,CSV等       MyISAM:成熟、穩定、易於管理,快速閱讀。有些功能不支援(交易等),表級鎖定。
       
InnoDB:支援事務、外鍵等功能、資料列鎖定。空間佔用大,不支援全文索引等。        myisam和Innodb引擎的主要特色
       MySQL的儲存引擎MyISAM與InnoDB有何不同?
   5、防sql注入方法
      
mysql_escape_string(strip_tags($arr["$val"]))) ;

    #
    /**
    * 函数名称:post_check() 
    * 函数作用:对提交的编辑内容进行处理 
    * 参  数:$post: 要提交的内容 
    * 返 回 值:$post: 返回过滤后的内容 
    */
    function post_check($post){
    if(!get_magic_quotes_gpc()){// 判断magic_quotes_gpc是否为打开 
    $post =addslashes($post);// 进行magic_quotes_gpc没有打开的情况对提交数据的过滤 
    }
    $post =str_replace("_","\_",$post);// 把 '_'过滤掉
    $post =str_replace("%","\%",$post);// 把 '%'过滤掉
    $post = nl2br($post);// 回车转换 
    $post =htmlspecialchars($post);// html标记转换 
    return $post;
    }
   6、mysql將一個大表拆分多個表後,如何解決跨表查詢效率問題

   7、索引應用
         什麼情況下考慮索引
         什麼情況不適合用於索引##如何判斷
        經常發生的無法使用索引的場景:
                like '%.....'
          or 關鍵字加其它條件限制
       全文索引:
                可用於MYIsAM表,並在CHAR,VARCHAR,TEXT型別的欄位中建立。


   8、mysql對於大表(千萬級),怎麼最佳化呢?
   9、mysql的慢查詢問題

  其實透過慢速查詢日誌來分析是一種比較簡單的方式,如果不想看日誌,可以藉助工具來完成,


如mysqldumpslow, mysqlsla, myprofi, mysql-explain-slow-log, mysqllogfilter等,感覺自己分析一個需要豐富的經驗,一個浪費時間。

10、關於使用者登入狀態存session,cookie或資料庫或memcache的優劣http://www.dewen.org/q/11504/

關於使用者登入狀態存session% 2Ccookie還是資料庫或memcache的優劣

  11、事務應用極端狀況處理

  12、sql語言分4大類請列出

        DDL--CREATE,DROP,ALTER##      -INSERT,UPDATE,DELETE

        DQL-SELECT
        DCL--GRANT,REVOKE,COMMIT,ROLLBACK

##

二、php基礎

  •   session的跨領域共享

  •     php連接mysql資料庫的幾種方式及區別
    mysql :面向過程
    mysqli:物件導向
    pdo:可移植性高  
    請參考:php基礎系列:PHP連接MySQL資料庫用到的三種API

    三、php進階

    • 長連線與短連線的使用

    • ##socket的使用

    • 支付安全性問題


    • #物件導向

      三大特性:封裝、繼承、多態(方法重寫)。
      抽象類別:abstract,至少有一個方法是抽象方法,不能被實例化,為子類別定義公共介面。
      介面:interface,解決php的單繼承問題,所有方法都是public存取權限的抽象方法,不能宣告變數只能宣告常數。
      繼承一個類別的同時實作多個介面
      class A  extends B implements 介面1,介面2...,介面n(){
            //實作所有介面中的方法
      }

    • lamp 和lnmp 網站架構效能差異的原因分析

    • #解釋性語言和編譯性語言的效能分析,舉例。

      四、正規

            email,html,js等符合

      #五、開發基礎

      • #      進程和執行緒定義,區別和聯繫。

               進程的狀態:運行run、就緒ready、等待wait

      六、Nosql數據庫


             memcached、redis、mongodb的區別聯繫
             3個場景完全不同的東西。 1.memcached:單一鍵值對記憶體快取的,做物件快取無可取代的分散式快取;2.redis:是演算法和資料結構的集合,快速的資料結構操作是他最大的特點,支援資料持久化;3.mongodb是bson結構、介於rdb和nosql之間的,更鬆散更靈活的,但是不支援事務,只用作非重要資料儲存。
           參考 MongoDB 或redis 可以取代memcached 嗎?
      七、常用linux指令
           軟體連結
      八、架構相關

        ##測試,單一伺服器支援的並發數,pv數。
      •        伺服器資源合理分配問題
      •              CPU:Apache
           系統一定會佔用很多資源,必然會CPU佔用過高。

                   記憶體:記憶體庫,資料庫軟體
                   硬碟:檔案

        #      硬碟:檔案
      • #### 

                    MongoDB+redis 或MySQL+Memcached 比較好的組合,邏輯簡單的就用NOSQL

      • #LN#     、LLMP

        現在網路上還有一種LNAMP架構,也就是綜合了nginx和Apache的優點,使用Apache負載PHP,nginx負責解析其他Web請求,使用nginx的rewrite模組,但是Apache埠不對外開放,Apache的許多模組都可以不載入減少資源。

      它:

      #資料探勘經驗、熟悉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 = &#39;/uploads&#39;;
      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能夠解決應用程式開發中的大多數需要,因為其本身包含了底層架構、相容處理、基底類別庫、資料庫存取層、模板引擎、緩存機制、外掛機制、角色認證、表單處理等常用的元件,對於跨版本、跨平台和跨資料庫移植都比較方便。並且每個元件都是精心設計和完善的,應用開發過程僅需要專注於您的業務邏輯。

      相關推薦:

      php面試題之三-PHP語言基礎(基礎部分) php進階面試題 php初級面試題php mysql面試題

      #2017年常見的PHP面試題及回答技巧

      #8道php面試題反應你對php了解程度######

      以上是php高級面試題分享的詳細內容。更多資訊請關注PHP中文網其他相關文章!

      陳述:
      本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn