溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

經(jīng)典的PHP高級(jí)工程面試題分享

發(fā)布時(shí)間:2020-04-17 10:17:27 來(lái)源:億速云 閱讀:255 作者:小新 欄目:編程語(yǔ)言

今天小編給大家分享的是經(jīng)典的PHP高級(jí)工程面試題,很多人都不太了解,今天小編為了讓大家更加了解PHP高級(jí)工程面試題,所以給大家總結(jié)了以下內(nèi)容,一起往下看吧。一定會(huì)有所收獲的哦。

經(jīng)典的PHP高級(jí)工程面試題分享

1.PHP 如何實(shí)現(xiàn)不用自帶的 cookie 函數(shù)為客戶端下發(fā) cookie。對(duì)于分布式系統(tǒng),如何來(lái)保存 session 值。

這個(gè)題有點(diǎn)繞。考的還是 COOKIE 和 SESSION 的基礎(chǔ)知識(shí)。服務(wù)端通過(guò) set-cookie 命令來(lái)通知客戶端保存 cookie。

只要按照 domain path 過(guò)期時(shí)間等規(guī)則 用 header 函數(shù)就可以實(shí)現(xiàn)。

分布式系統(tǒng) session,集中處理。按我們公司的架構(gòu),為了實(shí)現(xiàn)高可用和高容災(zāi),提供一個(gè)分布式的驗(yàn)簽服務(wù)。具體的可以看下 redis 的分布式服務(wù)架構(gòu)。

2、數(shù)據(jù)庫(kù)中的存放了用戶 ID, 扣費(fèi)很多行,redis 中存放的是用戶的錢包,現(xiàn)在要寫一個(gè)腳本,將數(shù)據(jù)庫(kù)中的扣費(fèi)記錄同步到 redis 中,每 5 分鐘執(zhí)行一次。請(qǐng)問(wèn)要考慮哪些問(wèn)題?

思路:生產(chǎn)者和消費(fèi)者模式。這個(gè)問(wèn)題也沒(méi)有說(shuō)其他的狀態(tài),比如數(shù)據(jù)庫(kù)的數(shù)據(jù)會(huì)實(shí)時(shí)增加么?redis 中每個(gè)錢包是否有其他服務(wù)在讀取或者寫入啊。什么的。數(shù)據(jù)庫(kù)和 REDIS 放一起,要么考數(shù)據(jù)一致性,要么考出現(xiàn)鎖,導(dǎo)致效率降低。

3、根據(jù) access.log 文件統(tǒng)計(jì)最近 5 秒的 qps,并以如下格式顯示,01 1000(難點(diǎn)在 01 序號(hào))

tail -f access.log | awk -F '[' '{print $2}' | awk '{print $1}' | uniq -c

4.redis 是如何進(jìn)行同步的,同步的方式,同步回滾怎么辦,數(shù)據(jù)異常怎么辦,同時(shí)會(huì)問(wèn) MYSQL 的同步方式和相關(guān)異常情況

redis 集群主從同步的簡(jiǎn)單原理

Redis 的復(fù)制功能是基于內(nèi)存快照的持久化策略基礎(chǔ)上的,也就是說(shuō)無(wú)論你的持久化策略選擇的是什么,只要用到了 Redis 的復(fù)制功能,就一定會(huì)有內(nèi)存快照發(fā)生。

當(dāng) Slave 啟動(dòng)并連接到 Master 之后,它將主動(dòng)發(fā)送一個(gè) SYNC 命令 (首先 Master 會(huì)啟動(dòng)一個(gè)后臺(tái)進(jìn)程,將數(shù)據(jù)快照保存到文件中 [rdb 文件] Master 會(huì)給 Slave 發(fā)送一個(gè)

Ping 命令來(lái)判斷 Slave 的存活狀態(tài) 當(dāng)存活時(shí) Master 會(huì)將數(shù)據(jù)文件發(fā)送給 Slave 并將所有寫命令發(fā)送到 Slave )。

Slave 首先會(huì)將數(shù)據(jù)文件保存到本地 之后再將 數(shù)據(jù) 加載到內(nèi)存中。

當(dāng)?shù)谝淮捂溄?或者是 故障后 重新連接 都會(huì)先判斷 Slave 的存活狀態(tài) 在做全部數(shù)據(jù)的同步 , 之后只會(huì)同步 Master 的寫操作 (將命令發(fā)送給 Slave)

問(wèn)題:

當(dāng) Master 同步數(shù)據(jù)時(shí) 若數(shù)據(jù)量較大 而 Master 本身只會(huì)啟用一個(gè)后臺(tái)進(jìn)程 來(lái)對(duì)多個(gè) Slave 進(jìn)行同步 , 這樣 Master 就會(huì)壓力過(guò)大 , 而且 Slave 恢復(fù)的時(shí)間也會(huì)很慢!

redis 主從復(fù)制的優(yōu)點(diǎn):

(1)在一個(gè)Redis集群中,master負(fù)責(zé)寫請(qǐng)求,slave負(fù)責(zé)讀請(qǐng)求,這么做一方面通過(guò)將讀請(qǐng)求分散到其他機(jī)器從而大大減少了master服務(wù)器的壓力,另一方面slave專注于提供

讀服務(wù)從而提高了響應(yīng)和讀取速度。

(2) 在一個(gè) Redis 集群中,如果 master 宕機(jī),slave 可以介入并取代 master 的位置,因此對(duì)于整個(gè) Redis 服務(wù)來(lái)說(shuō)不至于提供不了服務(wù),這樣使得整個(gè) Redis 服務(wù)足夠安全。

(3) 水平增加 Slave 機(jī)器可以提高性能

經(jīng)典的PHP高級(jí)工程面試題分享

5.兩臺(tái) mysql 服務(wù)器,其中一臺(tái)掛了,怎么讓業(yè)務(wù)端無(wú)感切換,并保證正常情況下講臺(tái)服務(wù)器的數(shù)據(jù)是一致的

不是核心業(yè)務(wù)的話,先停寫,把備機(jī)拉起來(lái),查看兩臺(tái)機(jī)器的日志,進(jìn)行數(shù)據(jù)補(bǔ)償,開寫。

如果是核心業(yè)務(wù)的話,現(xiàn)在所有的寫操作都在正常的狀態(tài)機(jī)器上。把好的這臺(tái)機(jī)器的備機(jī)拉起來(lái),當(dāng)主機(jī)。

以上全是應(yīng)急操作。實(shí)際上數(shù)據(jù)庫(kù)的容災(zāi)設(shè)計(jì)要復(fù)雜的多。

面試官要是問(wèn)你,備機(jī)的數(shù)據(jù)不一致怎么辦,你要勇敢懟回去,你們每秒多少寫入操作。按照百萬(wàn)級(jí)表,每秒 1000 的寫入效率,正常的設(shè)計(jì)是,分布在 2 臺(tái)機(jī)器上每臺(tái) 500。這個(gè)級(jí)別的數(shù)據(jù)同步,出現(xiàn)差異的概率 可以忽略不計(jì)的。有一臺(tái)出現(xiàn)問(wèn)題,另一臺(tái)也可以抗住。

(正常的操作,還是先停寫,等數(shù)據(jù)一致,切換,開寫。我們公司搞這些切換都是在凌晨 4.00 左右,核心業(yè)務(wù)的每秒寫操作,只有十幾個(gè)。前后耽擱不到 20 秒)。

6.請(qǐng)寫出自少三種截取文件名后綴的方法或函數(shù)(PHP 原生函數(shù)和自己實(shí)現(xiàn)函數(shù)均可)

echo substr(strrchr($file, '.'), 1);
echo substr($file, strrpos($file, '.')+1);
$arr=explode('.', $file);
echo $arr[count($arr)-1];
$arr=explode('.', $file);
echo end($arr);
echo strrev(explode('.', strrev($file))[0]); 
echo pathinfo($file)['extension'];
echo pathinfo($file, PATHINFO_EXTENSION);

7.寫一個(gè)函數(shù),獲取一篇文章內(nèi)容中的全部圖片,并下載

function download_images($article_url = '', $image_path = 'tmp'){
 
    // 獲取文章類容
    $content = file_get_contents($article_url);
 
    // 利用正則表達(dá)式得到圖片鏈接
    $reg_tag = '/<img.*?\"([^\"]*(jpg|bmp|jpeg|gif|png)).*?>/';
    $ret = preg_match_all($reg_tag, $content, $match_result);
    $pic_url_array = array_unique($match_result1[1]);
 
    // 創(chuàng)建路徑
    $dir = getcwd() . DIRECTORY_SEPARATOR .$image_path;
    mkdir(iconv("UTF-8", "GBK", $dir), 0777, true);
 
    foreach($pic_url_array as $pic_url){
        // 獲取文件信息
        $ch = curl_init($pic_url);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_NOBODY, 0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE );
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE );
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $fileInfo = curl_exec($ch);
        $httpinfo = curl_getinfo($ch);
        curl_close($ch);
 
        // 獲取圖片文件后綴
        $ext = strrchr($pic_url, '.');
        $filename = $dir . '/' . uniqid() . $ext;
 
        // 保存圖片信息到文件
        $local_file = fopen($filename, 'w');
        if(false !== $local_file){
            if( false !== fwrite($local_file, $filecontent) ){
            fclose($local_file);
            }
        }
    }
 
}

10.瓶水,其中一瓶有毒,小白鼠喝完有毒的水之后,會(huì)在 24 小時(shí)后死亡,問(wèn):最少用幾只小白鼠可以在 24 小時(shí)后找到具體是哪一瓶水有毒。

四只

二進(jìn)制問(wèn)題。薛定諤的老鼠。

一只老鼠有兩個(gè)狀態(tài),死活,對(duì)應(yīng) 01。假設(shè)老鼠的個(gè)數(shù)為 A,則有 2^A>=10; A=4;

思路很簡(jiǎn)單,十瓶藥編號(hào):0,1,10,11....1001;

0 不喝。第一只老鼠喝所有個(gè)位是 1 的:13579,第二只喝十位是 1 的,第三只和百位是 1 的,第四只喝千位是 1 的。

24 小時(shí)后,看下死了的是 1,活著的是 0。按老鼠的順序乖乖站好…… 假如第一只和第三只死了,那就是 0101,就是 5 有問(wèn)題。

以上就是經(jīng)典的PHP高級(jí)工程面試題的詳細(xì)內(nèi)容了,看完之后是否有所收獲呢?如果想了解更多相關(guān)內(nèi)容,歡迎來(lái)億速云行業(yè)資訊

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

php
AI