php面試題目(持續更新)

一. 給出2個表達式的結果:(0.1+0.7)===0.8和(0.1+0.7)==0.8
答案:false , false
因爲浮點數轉換成2進制數字存儲時會丟失精度!

二. 下面哪些結果是true?
A. empty(0) B.empty(null) C.empty($a) D.empty(false) E.empty(true)
答案:ABCD
emtpy函數是用來判斷一個變量是否爲空的,當一個變量並不存在時,或者它的值等同於false,那麼它也會被認爲不存在!

以下的東西被認爲是空的:
1. “” (空字符串)
2. 0 (作爲整數的0)
3. 0.0 (作爲浮點數的0)
4. “0” (作爲字符串的0)
5. NULL
6. FALSE
7. array() (一個空數組)
8. $var; (一個聲明瞭,但是沒有值的變量)

三. var_dump(2==true);結果是什麼:
答案:true
因爲在進行判斷或者比較時,所有非零整數都等同於true;(自動轉換)

四.HTTP的請求方式除了GET,POST,還有:
HEAD 與GET請求類似,不同在與服務器只返回HTTP頭部信息,沒有頁面內容
PUT 上傳指定URL的描述
DELETE 刪除指定資源
OPTIONS 返回服務器支持的HTTP方法
CONNECT 轉換爲透明TCP/IP隧道的連接請求

五.HTTP 狀態中302、403、 500、200、404、502代碼含義?
一二三四五原則: 一. 消息系列 二. 成功系列 三. 重定向系列 四. 請求錯誤系列 五. 服務器端錯誤系列
答:302:臨時轉移成功,請求的內容已轉移到新位置 403:禁止訪問 500:服務器內部錯誤 401代表未授權。 200是請求成功,404是文件未找到,502是服務器內部錯誤。

六.HTTP的常用兩種認證模式:
基本認證 Basic Access Authentication;
摘要認證 HTTP Digest Authentication;

七.thinkphp單字母函數:
A函數: 用於實例化Action 格式
B函數:用於執行某個行爲
C函數: 獲取和設置配置參數 支持批量定義
D函數: 用於實例化Model 格式 項目://分組/模塊
F函數: 快速文件數據讀取和保存 針對簡單類型數據 字符串、數組
G函數: 記錄和統計時間(微秒)和內存使用情況
I函數: 獲取輸入參數 支持過濾和默認值
L函數: 獲取和設置語言定義(不區分大小寫)
M函數: 用於實例化一個沒有模型文件的Model
N函數: 設置和獲取統計數據
R函數: 遠程調用模塊的操作方法 URL 參數格式 [項目://][分組/]模塊/操作
S函數: 緩存管理
T函數: 獲取模版文件 格式 項目://分組@主題/模塊/操作
U函數: URL組裝 支持不同URL模式
W函數: 渲染輸出Widget

八.寫出一個驗證電子郵件格式的正則:
/\w+@\w+(.\w+){0,3}/

九.用一條SQL語句查詢出每門課都大於80分的學生姓名
name kecheng fenshu
張三 語文 81
張三 數學 75
李四 語文 76
李四 數學 90
王五 語文 81
王五 數學 100
王五 英語 90
答案:select name,count(fenshu) as num,sum(funshu>80) as pass from table_name group by name having num=pass;

十.使用環境變量獲取url地址:

$_SERVER['PHP_SELF'];

獲取服務器端的地址

$_SERVER['HTTP_ADDR'];

獲取客戶端的地址:

$_SERVER['REMOTE_ADDR'];

十一.
$str=count(false)+count('abc')+count(null);
echo $str;

答:2,count(null)=0;

十二.寫出常用的linux命令及其作用:

    1.cat  代表了連結(Concatenation),連接兩個或者更多文本文件或者以標準輸出形式打印文件的內容
    2.touch  新建文件,如果該文件已存在則更新修改時間
    3.cd     切換目錄
    4.pwd    顯示當前所處目錄
    5.top    顯示後臺信息,類似於windows的任務管理器
    6.stats  顯示文件信息
    7.history 查看之前所使用的命令記錄
    8.rm      刪除文件
    9.mv      移動文件
    10.cp     複製
    11.ps     查看進程
    12.date   顯示和修改日期
    13.grep   查詢匹配
    14.ls     列出目錄內容
    15.lsblk  列出塊設備
    16.md5sum 計算和檢驗MD5信息簽名
    17.dd     複製和轉換文件
    18.uname  Unix Name的簡寫;顯示機器名,操作系統和內核的詳細信息。
    19.sudo   授權用戶執行超級用戶和其他用戶的命令
    20.mkdir  創建文件夾
    21.chmod  改變文件的模式位
    22.chown  改變文件用戶擁有者和所在組
    23.apt   APT是一個爲Debian系列系統(Ubuntu,Kubuntu等等)開發的高級包管理器,在Gnu/Linux系統上,它會爲包自動地,智能地搜索,安裝,升級以及解決依賴。
    24.tar    壓縮和解壓縮命令
    25.cal    用來顯示當前月份和已經過去年份和未來的月份信息

十三.sort、rsort、asort、arsort、ksort和krsort的區別:

sort() 函數用於對數組單元從低到高進行排序。
rsort() 函數用於對數組單元從高到低進行排序。
asort() 函數用於對數組單元從低到高進行排序並保持索引關係。
arsort() 函數用於對數組單元從高到低進行排序並保持索引關係。
ksort() 函數用於對數組單元按照鍵名從低到高進行排序。
krsort() 函數用於對數組單元按照鍵名從高到低進行排序。

十四.簡單概述PHP的垃圾回收機制
PHP可以自動進行內存管理,清楚不再需要的對象。PHP使用了引用計數這種單純的垃圾回收機制。每個對象都內含一個引用計數器,每個reference鏈接到對象,計數器加1,當reference離開生存空間或者被設爲null,計數器減1,當某個對象的引用計數器爲0時,PHP知道你將不再需要使用這個對象,釋放其所佔有的內存空間。

十五. 如何用php的環境變量得到一個網頁地址的內容? IP地址又要怎樣得到?

"http://".$_SERVER ['HTTP_HOST'].$_SERVER['PHP_SELF'] ;// 獲取網頁地址
 $_SERVER['REMOTE_ADDR'] //獲取IP地址

十六.foo()和@foo()的區別:

@符號可以控制錯誤提示,簡單理解爲在所有有輸出的函數、變量等得到值的地方前面可以加上@屏蔽錯誤提示;

十七.Mysql中獲取當前時間和日期的函數:now();
格式化時間和日期的函數是:date_format();

十八.有一個網頁地址, 比如PHP開發資源網主頁: http://www.phpres.com/index.html,如何得到它的內容?

$url="http://www.phpres.com/index.html";
$str=file_get_contents($url);
var_dump($str);

十九.請問session和cookie的區別?禁用cookie後session是否還能使用?
1.http傳輸協議是無狀態的,不能區別用戶是否是從同一個網站上來的,同一個用戶請求不同的頁面不能看做是同一個用戶;
2.session存儲在服務器端,cookie保存在客戶端;session比較安全,cookie用某些手段可以修改,不安全。session依賴於cookie進行傳遞。
禁用cookie後,session不能正常使用。Session的缺點:保存在服務器端,每次讀取都從服務器進行讀取,對服務器資源有消耗。Session保存在服務器端的文件或數據庫中,默認保存在文件中,文件路徑是有php配置文件的session.save.path指定。Session文件是公有的;

二十.語句include和require有什麼區別?爲了避免多次包含同一文件,可以用什麼替代他們?
1.include()在執行文件時每次都要進行讀取和評估
require()文件只處理一次(實際上文件內容替換了require()語句);
2.require()通常放在PHP腳本程序的最前面
include()的使用和require()一樣,一般放在程序控制的處理區段中,php腳本文件讀到include()語句時,纔將它包含的文件讀進來,這種方式,可以把程序執行的流程簡單化;
3.require()包含文件失敗,停止執行,給出錯誤(致命的)
include()常用於動態包含,通常是自動加載的文件,即使加載出錯,整個程序還是繼續執行;返回的只是一個警告;

爲避免多次包含同一文件,可以用require_once和include_once來替代他們;

二十一、mysql的加鎖條件是什麼?悲觀鎖和樂觀鎖是什麼?有什麼作用?
悲觀鎖與樂觀鎖是兩種常見的資源併發鎖設計思路,也是併發編程中一個非常基礎的概念。

悲觀鎖(Pessimistic Lock)
悲觀鎖的特點是先獲取鎖,再進行業務操作,即“悲觀”的認爲獲取鎖是非常有可能失敗的,因此要先確保獲取鎖成功再進行業務操作。通常所說的“一鎖二查三更新”即指的是使用悲觀鎖。通常來講在數據庫上的悲觀鎖需要數據庫本身提供支持,即通過常用的select … for update操作來實現悲觀鎖。當數據庫執行select for update時會獲取被select中的數據行的行鎖,因此其他併發執行的select for update如果試圖選中同一行則會發生排斥(需要等待行鎖被釋放),因此達到鎖的效果。select for update獲取的行鎖會在當前事務結束時自動釋放,因此必須在事務中使用。

這裏需要注意的一點是不同的數據庫對select for update的實現和支持都是有所區別的,例如oracle支持select for update no wait,表示如果拿不到鎖立刻報錯,而不是等待,mysql就沒有no wait這個選項。另外mysql還有個問題是select for update語句執行中所有掃描過的行都會被鎖上,這一點很容易造成問題。因此如果在mysql中用悲觀鎖務必要確定走了索引,而不是全表掃描。

樂觀鎖(Optimistic Lock)
樂觀鎖的特點先進行業務操作,不到萬不得已不去拿鎖。即“樂觀”的認爲拿鎖多半是會成功的,因此在進行完業務操作需要實際更新數據的最後一步再去拿一下鎖就好。

樂觀鎖在數據庫上的實現完全是邏輯的,不需要數據庫提供特殊的支持。一般的做法是在需要鎖的數據上增加一個版本號,或者時間戳,然後按照如下方式實現:

複製代碼
1. SELECT data AS old_data, version AS old_version FROM …;
2. 根據獲取的數據進行業務操作,得到new_data和new_version
3. UPDATE SET data = new_data, version = new_version WHERE version = old_version
if (updated row > 0) {
// 樂觀鎖獲取成功,操作完成
} else {
// 樂觀鎖獲取失敗,回滾並重試
}
複製代碼
樂觀鎖是否在事務中其實都是無所謂的,其底層機制是這樣:在數據庫內部update同一行的時候是不允許併發的,即數據庫每次執行一條update語句時會獲取被update行的寫鎖,直到這一行被成功更新後才釋放。因此在業務操作進行前獲取需要鎖的數據的當前版本號,然後實際更新數據時再次對比版本號確認與之前獲取的相同,並更新版本號,即可確認這之間沒有發生併發的修改。如果更新失敗即可認爲老版本的數據已經被併發修改掉而不存在了,此時認爲獲取鎖失敗,需要回滾整個業務操作並可根據需要重試整個過程。

總結
樂觀鎖在不發生取鎖失敗的情況下開銷比悲觀鎖小,但是一旦發生失敗回滾開銷則比較大,因此適合用在取鎖失敗概率比較小的場景,可以提升系統併發性能

樂觀鎖還適用於一些比較特殊的場景,例如在業務操作過程中無法和數據庫保持連接等悲觀鎖無法適用的地方

二十二.一組溫度的數字組成的數組,如何求出其中的最接近於0的溫度。
答案:

<?php
    function get_near0($arr){
        // sort($arr);
        var_dump($arr);
        $count=count($arr);
        //按照絕對值大小倒序排列
        for($j=0;$j<$count;$j++){
            for($i=0;$i<$count-1;$i++){
                if(abs($arr[$i])<abs($arr[$i+1])){
                    //把絕對值最小的值放到後面
                    $a=$arr[$i];
                    $arr[$i]=$arr[$i+1];
                    $arr[$i+1]=$a;
                    // $arr=array_values($arr);

                }
                // else{
                //  unset($arr[$i]);
                // }
            }
        }
        var_dump($arr);
        $small=array_pop($arr);
        return $small;
    }
    $t=[-11,-9,-34,22,3,1,444,-23];
    echo get_near0($t);
?>

二十三.JS和php都是分別怎麼實現URL頁面跳轉的?
答:JS:window.location.href = “http://www.baidu.com“;
PHP:<?php sleep(3); header("location:url地址");//調用了sleep()方法,效果也是3秒後執行跳轉 ?>

二十四.禁用cookie後,session還能使用嗎?
在PHP中,通過相關的配置,可以讓Session不依賴Cookie而存在。
php.ini中,把session.use_trans_sid設成1,那麼連接的後面就會自己加sessionid,就通過url來傳遞
session的key了,這時客戶端就算禁止了cookie也可以使用session;同時必須說明的是這樣是不安全也不推薦的做法;

二十五.用php寫一個遍歷文件夾下的所有文件的方法(文件夾下包含子文件夾)

<?php
header("content-type:text/html;charset=gbk");
    //遍歷一個文件夾下的所有文件及其子文件
    function scan_mydir($dirs){
        $handles=opendir($dirs);
        $files=array();
        while(($file=readdir($handles))!==false){
            if(($file!=='.')&&($file!=='..')){
                if(is_dir($dirs.'/'.$file)){
                    $files[$file]=scan_mydir($dirs.'/'.$file);
                }else{
                    $files[]=$file;
                }
            }       

        }

        closedir($handles);
        return $files;
    }

    $myfile=scan_mydir('G:\360Downloads\Software');
    var_dump($myfile);
?>

二十六.開啓php.ini中的safe_mode,會影響哪些函數和參數?
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以上版本,則將此特性完全去除了。

二十七.數據庫設計的三大範式:
1.第一範式(確保每列保持原子性)
2.第二範式(確保表中的每列都和主鍵相關)
3.第三範式(確保每列都和主鍵列直接相關,而不是間接相關)

二十八.mysql in 排序 也可以按in裏面的順序來排序
select * from goods where id in(3,4,1,2) order by FIELD(id,3,4,1,2)

二十九.求兩個日期的差數,例如求2017-04-03和2017-03-02的日期差值;

<?php
    $time=strtotime('2017-03-03')-strtotime('2017-02-01');
    $days=round($time/60/60/24);
    echo $days;
?>

三十.下面的代碼片分別輸出什麼?

<?php
    $a='123';
    $b=&$a;
    $a='abc';
    echo $a."<br>";
    echo $b."<br>";
?>
答:'abc' ,'abc'

三十一.下面的代碼會輸出什麼?

<?php
    function test(){
        static $count=0;
        $count++;
        echo $count."<br>";
        if($count<3){
            test();
        }else{
            return false;
        }
    }
    test();
?>

答:輸出:1,2,3
解析:此題是考查static在函數體內和函數外的區別;區別就是靜態變量只有第一次運行函數的時候被創建,並且在函數結束的時候不會消亡;而普通的成員在函數結束的時候就會在內存中退棧消亡。

三十二.php帶的圖像庫中的獲得圖像的寬和高的函數分別是什麼?

   imagesx()  ,  imagesy()

三十三.比較兩個string最好用什麼函數?

  strcmp()函數,區分大小寫;一般不會用strcasecmp()

三十四.除了使用construct()來定義構造函數時,還可以使用_____來定義;

   A.function __destruct()   B.function 類名() C.function __tostring() D.function __call()

答:B
A是析構方法,C是支持ECHO 輸出對象時調用的方法 D.是調用類中不存在的方法時被調用

三十五.寫出你所知道的魔術方法

   __construct() 構造方法,當創建完對象時被調用
   __destruct()  析構方法,當對象被釋放或者銷燬時調用
   __autoload()  類文件自動加載方法
   __call()      當所調用的成員方法不存在(或者沒有權限)該類時調用,用於對錯誤後做一些操作或者提示信息
   __clone()     該函數在對象克隆時自動調用,其作用是對克隆的副本做一些初始化操作
   __get()       當所對象所調用的成員屬性未聲明或者級別爲private或者protected等時,我們可以在這個函數裏進行自己的一些操作
   __set() 當所對未聲明或者級別爲private或者protected等進行賦值時調用此函數,我們可以在這個函數裏進行自己的一些操作
   __isset() 當對一個未聲明或者訪問級別受限的成員屬性調用isset函數時調用此函數,共用戶做一些操作
   __unset() 當對一個未聲明或者訪問級別受限的成員屬性調用unset函數時調用此函數,共用戶做一些操作
   __toString()函數 該函數在將對象引用作爲字符串操作時自動調用,返回一個字符串
   __sleep()函數 該函數是在序列化時自動調用的,序列化這裏可以理解成將信息寫如文件中更長久保存
   __wakeup()函數 該魔術方法在反序列化的時候自動調用,爲反序列化生成的對象做一些初始化操作
   __set__state() 當調用var_export()時,這個靜態 方法會被調用(自PHP 5.1.0起有效)。本方法的唯一參數是一個數組,其中包含按array(’property’ => value, …)格式排列的類屬性。
   __invoke      當嘗試以調用函數的方式調用一個對象時,__invoke 方法會被自動調用
   __callStatic  它的工作方式類似於 __call() 魔術方法,__callStatic() 是爲了處理靜態方法調用,

三十六.不使用第三個變量交換2個變量的值;

第一種方法:算術運算
      簡單來說,就是通過普通的+和-運算來實現。代碼如下:
      int a,b;
      a=10;b=12;
      a=b-a; //a=2;b=12
      b=b-a; //a=2;b=10
      a=b+a; //a=12;b=10

第二種方法:異或運算
    理解爲:一個數對另一個數連續異或2次得到的還是第一個數
    比如:a^b^b=a,同理藉助異或可以完成轉換;b=a^b^b;a=b^a^a

三十七.linux下監控網絡端口的命令是:netstat

三十八.linux環境下監控日誌的變化命令: tail -f

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