天天看點

php curl header_十個PHP 進階工程經典面試題

1.PHP 如何實作不用自帶的 cookie 函數為用戶端下發 cookie。對于分布式系統,如何來儲存 session 值。

這個題有點繞。考的還是 COOKIE 和 SESSION 的基礎知識。服務端通過 set-cookie 指令來通知用戶端儲存 cookie。

隻要按照 domain path 過期時間等規則 用 header 函數就可以實作。

分布式系統 session,集中處理。按我們公司的架構,為了實作高可用和高容災,提供一個分布式的驗簽服務。具體的可以看下 redis 的分布式服務架構。

2、資料庫中的存放了使用者 ID, 扣費很多行,redis 中存放的是使用者的錢包,現在要寫一個腳本,将資料庫中的扣費記錄同步到 redis 中,每 5 分鐘執行一次。請問要考慮哪些問題?

思路:生産者和消費者模式。這個問題也沒有說其他的狀态,比如資料庫的資料會實時增加麼?redis 中每個錢包是否有其他服務在讀取或者寫入啊。什麼的。資料庫和 REDIS 放一起,要麼考資料一緻性,要麼考出現鎖,導緻效率降低。

3、根據 access.log 檔案統計最近 5 秒的 qps,并以如下格式顯示,01 1000(難點在 01 序号)

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

4.redis 是如何進行同步的,同步的方式,同步復原怎麼辦,資料異常怎麼辦,同時會問 MYSQL 的同步方式和相關異常情況

redis 叢集主從同步的簡單原理

Redis 的複制功能是基于記憶體快照的持久化政策基礎上的,也就是說無論你的持久化政策選擇的是什麼,隻要用到了 Redis 的複制功能,就一定會有記憶體快照發生。

當 Slave 啟動并連接配接到 Master 之後,它将主動發送一個 SYNC 指令 (首先 Master 會啟動一個背景程序,将資料快照儲存到檔案中 [rdb 檔案] Master 會給 Slave 發送一個

Ping 指令來判斷 Slave 的存活狀态 當存活時 Master 會将資料檔案發送給 Slave 并将所有寫指令發送到 Slave )。

Slave 首先會将資料檔案儲存到本地 之後再将 資料 加載到記憶體中。

當第一次連結 或者是 故障後 重新連接配接 都會先判斷 Slave 的存活狀态 在做全部資料的同步 , 之後隻會同步 Master 的寫操作 (将指令發送給 Slave)

問題:

當 Master 同步資料時 若資料量較大 而 Master 本身隻會啟用一個背景程序 來對多個 Slave 進行同步 , 這樣 Master 就會壓力過大 , 而且 Slave 恢複的時間也會很慢!

redis 主從複制的優點:

(1)在一個Redis叢集中,master負責寫請求,slave負責讀請求,這麼做一方面通過将讀請求分散到其他機器進而大大減少了master伺服器的壓力,另一方面slave專注于提供

讀服務進而提高了響應和讀取速度。

(2) 在一個 Redis 叢集中,如果 master 當機,slave 可以介入并取代 master 的位置,是以對于整個 Redis 服務來說不至于提供不了服務,這樣使得整個 Redis 服務足夠安全。

(3) 水準增加 Slave 機器可以提高性能

5.兩台 mysql 伺服器,其中一台挂了,怎麼讓業務端無感切換,并保證正常情況下講台伺服器的資料是一緻的

不是核心業務的話,先停寫,把備機拉起來,檢視兩台機器的日志,進行資料補償,開寫。

如果是核心業務的話,現在所有的寫操作都在正常的狀态機器上。把好的這台機器的備機拉起來,當主機。

以上全是應急操作。實際上資料庫的容災設計要複雜的多。

面試官要是問你,備機的資料不一緻怎麼辦,你要勇敢怼回去,你們每秒多少寫入操作。按照百萬級表,每秒 1000 的寫入效率,正常的設計是,分布在 2 台機器上每台 500。這個級别的資料同步,出現差異的機率 可以忽略不計的。有一台出現問題,另一台也可以抗住。

(正常的操作,還是先停寫,等資料一緻,切換,開寫。我們公司搞這些切換都是在淩晨 4.00 左右,核心業務的每秒寫操作,隻有十幾個。前後耽擱不到 20 秒)。

6.請寫出自少三種截取檔案名字尾的方法或函數(PHP 原生函數和自己實作函數均可)

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.寫一個函數,擷取一篇文章内容中的全部圖檔,并下載下傳

function download_images($article_url = '', $image_path = 'tmp'){

    // 擷取文章類容
    $content = file_get_contents($article_url);

    // 利用正規表達式得到圖檔連結
    $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]);

    // 建立路徑
    $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 瓶水,其中一瓶有毒,小白鼠喝完有毒的水之後,會在 24 小時後死亡,問:最少用幾隻小白鼠可以在 24 小時後找到具體是哪一瓶水有毒。

四隻

二進制問題。薛定谔的老鼠。

一隻老鼠有兩個狀态,死活,對應 01。假設老鼠的個數為 A,則有 2^A>=10; A=4;

思路很簡單,十瓶藥編号:0,1,10,11....1001;

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

24 小時後,看下死了的是 1,活着的是 0。按老鼠的順序乖乖站好…… 假如第一隻和第三隻死了,那就是 0101,就是 5 有問題。

更多學習内容請通路:

八重櫻:騰訊T3-T4标準精品PHP架構師教程目錄大全,隻要你看完保證薪資上升一個台階(持續更新)​zhuanlan.zhihu.com

php curl header_十個PHP 進階工程經典面試題
以上内容希望幫助到大家,

很多PHPer在進階的時候總會遇到一些問題和瓶頸,業務代碼寫多了沒有方向感,不知道該從那裡入手去提升,對此我整理了一些資料,包括但不限于:分布式架構、高可擴充、高性能、高并發、伺服器性能調優、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql優化、shell腳本、Docker、微服務、Nginx等多個知識點進階進階幹貨需要的可以免費分享給大家

,需要的可以加入

我的官方群點選此處。