php面試知識點總結

1.PHP 優先級

$a = 0;
$a = (2 > 2) ? 2 : 3 ? $a++ : --$a;
//解析:( false ? 2 : 3) ? $a++ : --$a
//  3 ? $a++ : --$a
var_dump($a);//0
echo "<br>";

$a = (2 > 2) ? 2 : 3 ? ++$a : --$a;
var_dump($a);//1

echo "<br>";
$a = true ? 0 : true ? 1 : 2;// (true ? 0 : true) ? 1 : 2 = 2 左結合
var_dump($a);//0


$a = 1;
$b = 2;
$a = $b += 3; // $a = ($b += 3) -> $a = 5, $b = 5  右結合

$a = 1;
echo $a + $a++; //3

優先級詳情:https://www.php.net/manual/zh/language.operators.precedence.php

2.從mysql 數據庫中隨機取出一條記錄

方法1:

select * from 表名 order by rand( ) limit 1;  //此處的1就是取出數據的條數

但這樣取數據網上有人說效率非常差的,那麼要如何改進呢

搜索Google,網上基本上都是查詢max(id) * rand()來隨機獲取數據。

方法2:

SELECT *
FROM `table` AS t1 JOIN (SELECT ROUND(RAND() * (SELECT MAX(id) FROM `table`)) AS id) AS t2
WHERE t1.id >= t2.id
ORDER BY t1.id ASC LIMIT 5;

但是這樣獲得的是5條連續的記錄。解決辦法只能是每次查詢一條,查詢5次,但這個又不能滿足我的要求了,我要一次找幾條

方法3: 高效寫法

SELECT * FROM user  WHERE userId >= ((SELECT MAX(userId) FROM user )-(SELECT MIN(userId) FROM user )) * RAND() + (SELECT MIN(userId) FROM user )  LIMIT 5

個人感覺:方法3和方法2區別不大.

3.用php寫一段代碼,實現不適用第3個變量,變換$a,$b的值,$a,$b初始值自己定

方法1:簡潔易懂 ,沒得說,頂上


list($a, $b) = array($b, $a);

方法二:兩個變量必須是數字

$a=5; $b=7;
$a = $a + $b;
$b = $a - $b;
$a = $a - $b;

echo $a,$b;//7 5

方法3:(這個就比較有限制,必須用一個兩個字符串都都不能出現的字符做爲分隔符) 

$a = $b.','.$a ;
$a = explode(',', $a);
$b = $a[1];
$a = $a[0];

方法4:可能存在編碼問題

$a = $a . $b;
$b = strlen( $b );
$b = substr( $a, 0, (strlen($a) - $b ) );
$a = substr( $a, strlen($b) );

方法5:兩個變量的長度必須一樣

$a = $a^$b;
$b = $b^$a;
$a = $a^$b;

4.char/varchar 區別,誰的存儲速度快,爲何?

一.數據存儲開銷

1.char(n) 是定長的,也就是當你輸入的字符小於你指定的數目時,char(8),你輸入的字符小於8時,它會再後面補空值。當你輸入的字符大於指定的數時,它會截取超出的字符。

在程序中,會返回給你8位,後面的用空格補上;

在數據庫中,char(8),佔用16個字節(1個字符=2個字節);

2.varchar(n) 是長度爲 n 個字節的可變長度且非 Unicode 的字符數據。n必須是一個介於1和 8000之間的數值。存儲大小爲輸入數據的字節的實際長度,而不是 n 個字節。所輸入的數據字符長度可以爲零。

二.插入數據

1.char列的NULL值佔用存儲空間。

varchar列的NULL值不佔用存儲空間。
插入同樣數量的NULL值,varchar列的插入效率明顯高出char列。

插入不爲null的數據時,無論插入數據涉及的列是否建立索引,varchar列的插入效率也是明顯高出char列。

三.更新數據

如果更新的列上未建立索引,則char的效率低於varchar,但效率差異不大。

如果更新的列上建立索引,則char的效率低於varchar,並且效率差異很大。

四.修改結構

無論增加或刪除的列的類型是char還是varchar,操作都能較快的完成,而且效率上沒有什麼差異。

對於增加列的寬度而言,char與varchar有非常明顯的效率差異,varchar列基本上不花費時間,而修改char列需要花費很長的時間。

五.數據檢索

無論是否通過索引,varchar類型的數據檢索略優於char的掃描。

那實際開發中,我們使用哪種呢?

當確定字符串爲定長、數據變更頻繁、數據檢索需求少時,使用char;

當不確定字符串長度、對數據的變更少、查詢頻繁時,使用varchar。

5.解釋什麼是隊列(queue),棧(stack),有何區別,php哪些數組結合可以實現隊列和棧?

棧(Stack)和隊列(Queue)是兩種操作受限的線性表。

棧與隊列的相同點:

1.都是線性結構。

2.插入操作都是限定在表尾進行。

3.都可以通過順序結構和鏈式結構實現。、

4.插入與刪除的時間複雜度都是O(1),在空間複雜度上兩者也一樣。

5.多鏈棧和多鏈隊列的管理模式可以相同。

棧與隊列的不同點:

1.刪除數據元素的位置不同,棧的刪除操作在表尾進行,隊列的刪除操作在表頭進行。

2.應用場景不同;常見棧的應用場景包括括號問題的求解,表達式的轉換和求值,函數調用和遞歸實現,深度優先搜索遍歷等;常見的隊列的應用場景包括計算機系統中各種資源的管理,消息緩衝器的管理和廣度優先搜索遍歷等。

3.順序棧能夠實現多棧空間共享,而順序隊列不能。

PHP實現棧和隊列:

array_shift : 刪除數組中首個元素,並返回被刪除元素的值。

array_unshift : 在數組開頭插入一個或多個元素。

array_pop:刪除數組的最後一個元素(出棧)。

array_push:將一個或多個元素插入數組的末尾(入棧)。

6.php 開發sdk注意什麼?

7.linux 查看進程的命令?

ps -A  或者 ps -e

8.PHP多線程開發

9.每天凌晨2:00 的定時任務

# 每天早上6點 
0 6 * * * echo "Good morning." >> /tmp/test.txt //注意單純echo,從屏幕上看不到任何輸出,因爲cron把任何輸出都email到root的信箱了。

# 每兩個小時 
0 */2 * * * echo "Have a break now." >> /tmp/test.txt  

# 晚上11點到早上8點之間每兩個小時和早上八點 
0 23-7/2,8 * * * echo "Have a good dream" >> /tmp/test.txt

# 每個月的4號和每個禮拜的禮拜一到禮拜三的早上11點 
0 11 4 * 1-3 command line

# 1月1日早上4點 
0 4 1 1 * command line SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root //如果出現錯誤,或者有數據輸出,數據作爲郵件發給這個帳號 HOME=/ 

# 每小時(第一分鐘)執行/etc/cron.hourly內的腳本
01 * * * * root run-parts /etc/cron.hourly

# 每天(凌晨4:02)執行/etc/cron.daily內的腳本
02 4 * * * root run-parts /etc/cron.daily 

# 每星期(週日凌晨4:22)執行/etc/cron.weekly內的腳本
22 4 * * 0 root run-parts /etc/cron.weekly 

# 每月(1號凌晨4:42)去執行/etc/cron.monthly內的腳本 
42 4 1 * * root run-parts /etc/cron.monthly 

# 注意:  "run-parts"這個參數了,如果去掉這個參數的話,後面就可以寫要運行的某個腳本名,而不是文件夾名。   

# 每天的下午4點、5點、6點的5 min、15 min、25 min、35 min、45 min、55 min時執行命令。 
5,15,25,35,45,55 16,17,18 * * * command

# 每週一,三,五的下午3:00系統進入維護狀態,重新啓動系統。
00 15 * *1,3,5 shutdown -r +5

# 每小時的10分,40分執行用戶目錄下的innd/bbslin這個指令: 
10,40 * * * * innd/bbslink 

# 每小時的1分執行用戶目錄下的bin/account這個指令: 
1 * * * * bin/account

# 每天早晨三點二十分執行用戶目錄下如下所示的兩個指令(每個指令以;分隔): 
203 * * * (/bin/rm -f expire.ls logins.bad;bin/expire$#@62;expire.1st) 

10.統計文件的行數

wc 命令的作用:統計指定文件中的字節數、字數、行數,並將結果顯示輸出。

命令語法:wc [選項] 文件

該命令選項參數如下: 

-c 統計字節數

-l 統計行數

-w 統計字數

-m 統計字符數

以上選項可以單獨使用也可以組合使用。注意組合使用時輸出結果的列的順序和數目不受選項的順序和數目的影響。輸出結果總是按下述順序進行顯示的。

行數 字數 字節數 文件名

例如: 

wc -lcw file1 file2

則輸出結果爲:

9 36 file1 

8 62 file2 

8 24 96 total

省略任選項-lcw,wc命令的執行結果與上面是一樣的。
 
以上選項也可以單獨使用,例如:

wc -l filename 輸出 filename 的行數

wc -c filename 輸出 filename 的字節數

wc -m filename 輸出 filename 的字符數

wc -w filename 輸出 filename 的單詞數

wc -L filename 輸出 filename 文件裏最長的那一行是多少個字符數

示例
統計當前文件夾下的php文件數目
find . -name “*.php” |wc -l
統計當前目錄下所有py文件代碼行數:
find ./ -name “*.php” | xargs cat |wc -l

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