php面試題 2023年7月7日

2021-10-07 20:34:03 字數 3171 閱讀 2614

1.寫程式交換x,y交換兩個變數的值 不使用中間變數

list($x,$y) = [$y,$x];
2.請描述一下鏈結www.a.com/test.php?id=1是如何被解析的(nginx伺服器)

www.example.com   nginx

路由到 www.example.com/index.php

載入nginx的fast-cgi模組

fast-cgi監聽127.0.0.1:9000位址 .

www.example.com/index.php請求到達127.0.0.1:9000

php-fpm 監聽127.0.0.1:9000

php-fpm 接收到請求,啟用worker程序處理請求

php-fpm 處理完請求,返回給nginx

nginx將結果通過http返回給瀏覽器

3.你用什麼方法檢測php指令碼的執行效率和資料庫sql的效率  並定位指令碼執行和資料庫查詢的瓶頸

一般是在你要檢查的**開頭記錄乙個時間,結尾記錄乙個時間。取差值,

資料庫sql的效率

sql的explain(mysql),啟用slow query log記錄慢查詢。

通常還要看資料庫設計是否合理,需求是否合理等。

4.分析sql語句 select * from product where price=100慢的原因

1、資料量大 加上limit 一定數量的限制

2、字段可以寫出只要需要的字段 seletc id, name 等

5.php5中的魔術方法  請說明用途

__construct():  例項化物件時被呼叫;

__destuct():    當刪除乙個物件或者物件操作終止時被執行;

__call():      呼叫物件不存在方法時被呼叫;

__get():       呼叫物件不存在的屬性時被呼叫;

__set():       設定物件不存在的屬性時被呼叫;

__tostring():  列印乙個物件時被呼叫,比如echo $obj,print($obj);

__clone():      轉殖物件時被呼叫,比如$t = new test();$tt = clone $t;

__sleep():      serialize之前被呼叫,若物件比較大,想做一些刪除在序列化,可以考慮使用該方法;

__wakeup():    unserialize之前被呼叫,做些物件的初始化;

__isset():     檢測物件是否存在屬性的時候被呼叫,如 isset($c->name);

__unset():      unset乙個物件屬性時被呼叫,如:unset($c->name);

__set_state(): 呼叫var_export時被呼叫,用__set_state的返回值作為 var_export的返回值;

__autoload():  例項化乙個物件時,如果對應的類不存在,在該方法被呼叫.

6.php後端如何解決跨域問題

header("access-control-allow-origin:*");

header("access-control-allow-methods:get, post, options, delete");

header("access-control-allow-headers:dnt,x-mx-reqtoken,keep-alive,user-agent,x-requested-with,if-modified-since,cache-control,content-type, accept-language, origin, accept-encoding");

7.redis實現鎖

1. 第一種鎖命令incr

這種加鎖的思路是, key 不存在,那麼 key 的值會先被初始化為 0 ,然後再執行 incr 操作進行加一。

然後其它使用者在執行 incr 操作進行加一時,如果返回的數大於 1 ,說明這個鎖正在被使用當中。

1、 客戶端a請求伺服器獲取key的值為1表示獲取了鎖

2、 客戶端b也去請求伺服器獲取key的值為2表示獲取鎖失敗

3、 客戶端a執行**完成,刪除鎖

4、 客戶端b在等待一段時間後在去請求的時候獲取key的值為1表示獲取鎖成功

5、 客戶端b執行**完成,刪除鎖

6、 設定有效期

$redis->incr($key);

$redis->expire($key, $ttl); //設定生成時間為1秒

2.第二種鎖setnx

這種加鎖的思路是,如果 key 不存在,將 key 設定為 value

如果 key 已存在,則 setnx 不做任何動作

1、 客戶端a請求伺服器設定key的值,如果設定成功就表示加鎖成功

2、 客戶端b也去請求伺服器設定key的值,如果返回失敗,那麼就代表加鎖失敗

3、 客戶端a執行**完成,刪除鎖

4、 客戶端b在等待一段時間後在去請求設定key的值,設定成功

5、 客戶端b執行**完成,刪除鎖

6、 設定有效期

$redis->setnx($key, $value);

$redis->expire($key, $ttl);

3.上面兩種方法都有乙個問題,會發現,都需要設定 key 過期。那麼為什麼要設定key過期呢?如果請求執行因為某些原因意外退出了,導致建立了鎖但是沒有刪除鎖,那麼這個鎖將一直存在,以至於以後快取再也得不到更新。於是乎我們需要給鎖加乙個過期時間以防不測。

但是借助 expire 來設定就不是原子性操作了。所以還可以通過事務來確保原子性,但是還是有些問題,所以官方就引用了另外乙個,使用 set 命令本身已經從版本 2.6.12 開始包含了設定過期時間的功能。

1、 客戶端a請求伺服器設定key的值,如果設定成功就表示加鎖成功

2、 客戶端b也去請求伺服器設定key的值,如果返回失敗,那麼就代表加鎖失敗

3、 客戶端a執行**完成,刪除鎖

4、 客戶端b在等待一段時間後在去請求設定key的值,設定成功

5、 客戶端b執行**完成,刪除鎖

$redis->set($key, $value, array('nx', 'ex' => $ttl)); //ex表示秒

2023年7月6日打卡

乙個機械人位於乙個 m x n 網格的左上角 機械人每次只能向下或者向右移動一步。機械人試圖達到網格的右下角。現在考慮網格中有障礙物。那麼從左上角到右下角將會有多少條不同的路徑?網格中的障礙物和空位置分別用 1 和 0 來表示。說明 m 和 n 的值均不超過 100。原題是有圖的,但是我懶得粘過來,...

2023年7月10日筆記

問題1 from operator import itemgetter 用法 a itemgetter 1 取a的第1個元素 問題2 pycharm debug的用法。問題3 axis 0 和axis 1的區別 1表示橫軸,方向從左到右 0表示縱軸,方向從上到下。問題1 from operator ...

2023年7月18阿里Android面試總結

很激動在github上的乙個專案flutter plugin record被阿里的乙個技術主管關注到了然後收到阿里的面試邀請,但是由於面試比較倉促沒準備好,很遺憾沒通過面試 先說一下面試流程吧 首先面試官給兩個筆試題 如下 問題1 用 實現 有三個任務a,b,c,需要實現a與b可以並行做,a與b都做...