NO IMAGE
  1. 配置nginx使它支援pathinfo

對於ThinkPHP的URL訪問路勁如:http://域名/index.php/Index/BlogTest/read,原先的Nginx的是不支援的pathinfo路徑的,導致你在thinkPHP5上面測試的時候,輸入相應的URL也不會提示模組名,控制器名或者方法名錯誤,而是出現一個404找不到的錯誤,那是因為Nginx無法解析這樣的連結 所以要修改一下nginx配置使它支援pathinfo。

配置如下:(TP5.0)

  1. location ~ \.php {    #去掉$  
  2.      root          H:/PHPServer/WWW;  筆者這裡預設是 html;  
  3.      fastcgi_pass   127.0.0.1:9000;  
  4.      fastcgi_index  index.php;  
  5.      fastcgi_split_path_info ^(. \.php)(.*)$;     #增加這一句  
  6.      fastcgi_param PATH_INFO $fastcgi_path_info;    #增加這一句  
  7.      fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;  
  8.      include        fastcgi_params;  
  9. }  

詳細檔案請參考:

TP5.0 https://blog.csdn.net/woshihaiyong168/article/details/54973353

TP3.2

http://document.thinkphp.cn/manual_3_2.html#url_rewrite

 

2、為什麼要用事物?

事務是單個的工作單元。如果某一事務成功,則在該事務中進行的所有資料修改均會提交,成為資料庫中的永久組成部分。如果事務遇到錯誤且必須取消或回滾,則所有資料修改均被清除。
事務使用,可以提供一個機制,防止在執行過程中出錯而之前正確的sql有影響了資料庫的情況出現.

3、事物的特性?

一、原子性:  事物是資料庫的邏輯工作單位,事物中包括的操作要麼都做,要麼都不做。

二、一致性:事務執行的結果必須是使資料庫從一個一致性狀態變到另一個一致性狀態。

三、隔離性:一個事務的執行不能被其它事物干擾。即一個事物內部的操作及使用的資料對其它併發事物是隔離的,併發執行的各個事物之間不能互相煩擾。

四、持續性:也稱永久性,只一個事物一旦提交,它對資料庫中資料的改變就應該是永久性的。接下來的其它操作或故障不應該對其執行結果有任何影響。

2. 不考慮隔離性可能產生的問題

現在重點說明下事務的隔離性,當多個執行緒(或多個客戶端)都開啟事務操作資料庫中的資料時,資料庫系統要能進行隔離操作,以保證各個執行緒獲取資料的準確性。

如果不考慮事務的隔離性,會發生的幾種問題:

2.1 髒讀

髒讀是指在一個事務處理過程中讀取了另一個未提交的事務中的資料。

2.2 不可重複讀

不可重複讀是指對於資料庫中的某個資料,一個事務內多次查詢卻返回了不同的資料值,這是由於在事務執行過程中,資料被另一個事務修改並提交了。

2.3 幻讀

幻讀是事務非獨立執行時發生的一種現象。例如,事務T1對一個表中所有的行的某個欄位做了從“1”修改為“2”的操作,這時事務T2又插入了一條新的記錄,而該欄位的值為“1”並且提交給資料庫。這時,操作事務T1的使用者如果再檢視剛剛修改的資料,會發現還有一行沒有修改,其實這行是從事務T2中新增的,就好像產生幻覺一樣,這就是產生了幻讀。

幻讀和不可重複讀都是讀取了另一條已經提交的事務,所不同的是不可重複讀查詢的都是同一個資料項,而幻讀針對的是一批資料(比如資料的個數)。

3. 隔離級別

關於事務的隔離性,MySQL提供了四種隔離級別:

Serializable(序列化):可避免髒讀、不可重複讀、幻讀的發生。(級別最高) 
Repeatable-read(可重複讀):可避免髒讀、不可重複讀的發生。 
Read-committed(讀已提交):可避免髒讀的發生。 
Read-uncommitted(讀未提交):最低階別,任何情況都無法保證。(級別最低)

以上四種隔離級別最高的是Serializable,最低的是Read uncommitted級別。當然,隔離級別越高,執行效率就越低。

MySQL資料庫中預設的隔離級別為Repeatable read。

像Serializable這樣的級別,就是以鎖表的方式(類似於Java多執行緒中的鎖)使得其他的執行緒只能在鎖外等待,選用哪一種隔離級別應該根據實際情況而定。

檢視當前事務的隔離級別:

select @@tx_isolation;

臨時設定事務的隔離級別:

set transaction isolation level 隔離級別名稱;
或
set tx_isolation=’隔離級別名稱’;

注意:?設定資料庫的隔離級別必須在開啟事務之前!隔離級別的設定只對當前連結有效。

4、物件導向的三大特性及五大原則?

(1)物件導向的三大特性:

一、封裝:封裝機制將資料和程式碼捆綁到一起,避免了外界的干擾和不確定性。它同樣允許建立物件。簡單的說,一個物件就是一個封裝了資料和操作這些資料的程式碼的邏輯實體。

二、繼承:繼承是可以讓某個型別的物件獲得另一個型別的物件的屬性的方法。它支援按級分類的概念。

三、多型:多型是OOP的另一個重要概念。多型的意思是事物具有不同形式的能力

(2)五大設計原則:

一、單一職責原則:一個類,最好只做一件事,只有一個引起它的變化。

二、開放封閉原則:軟體實體應該是可擴充套件的,而不可修改的。也就是,對擴充套件開放,對修改封閉的。

三、依賴倒置原則:依賴於抽象。具體而言就是高層模組不依賴於底層模組,二者都同依賴於抽象;抽象不依賴於具體,具體依賴於抽象。

四、介面隔離原則:使用多個小的專門的介面,而不要使用一個大的總介面。分離的手段主要有以下兩種:

1、委託分離,通過增加一個新的型別來委託客戶的請求,隔離客戶和介面的直接依賴,但是會增加系統的開銷。

2、多重繼承分離,通過介面多繼承來實現客戶的需求,這種方式是較好的。

 

五、Liskov替換原則:子類必須能夠替換其基類。這一思想體現為對繼承機制的約束規範,只有子類能夠替換基類時,才能保證系統在執行期內識別子類,這是保證繼承複用的基礎。在父類和子類的具體行為中,必須嚴格把握繼承層次中的關係和特徵,將基類替換為子類,程式的行為不會發生任何變化。同時,這一約束反過來則是不成立的,子類可以替換基類,但是基類不一定能替換子類。

5、PHP如何引入檔案:includerequireinclude_oncerequire_once

6、單例模式?

單例模式:單例模式,是一種常用的軟體設計模式。在它的核心結構中只包含一個被稱為單例的特殊類。通過單例模式可以保證系統中一個類只有一個例項。即一個類只有一個物件例項。

7、頁面靜態化?

一、純靜態化:是把PHP生成的動態頁面儲存成靜態的html檔案,使用者訪問該靜態頁面,而不是使用者每一次訪問都重新生成一張相同的網頁;

優點就是減小伺服器開銷。純靜態化又分為:區域性靜態化 和 完全靜態化;

(1)區域性靜態化:是生成的靜態檔案中,有區域性的資料還是通過ajax技術動態獲取的;

(2)完全靜態化:即不存在動態獲取資料的情況,所以內容都來自靜態的html頁面.

二、偽靜態化:其實還是動態訪問,其實質是動態生成資料,你訪問的網址實際上是已經經過伺服器解析後的,所以稱之為偽靜態化;

偽靜態的優點:美觀;便於搜尋引擎收錄。 

 

8、php狀態碼:

403 (禁止) 伺服器拒絕請求。

404 (未找到) 伺服器找不到請求的網頁。

500 (伺服器內部錯誤) 伺服器遇到錯誤,無法完成請求。

參考檔案:https://blog.csdn.net/kirsten_z/article/details/52515496

9、Memcached雪崩和穿透

一、快取穿透

        快取應用:

使用快取時首先判斷快取中是否存在資料,如果存在資料就直接從快取取出,返回,

沒有資料的話需要查詢資料庫,資料庫中查詢到就存入快取並將資料庫中查詢到的結果返回,

查詢不到返回null

(1)什麼是快取穿透?

一般的快取系統,都是按照key去快取查詢,如果不存在對應的value,就應該去後端系統查詢(比如DB)。如果key對應的value是一定不存在的,並且對該key併發請求量很大,就會對後端系統造成很大的壓力。這就叫做快取穿透。(訪問一個不存在的key的時候,回去頻繁的查詢資料庫,造成資料庫的壓力過大)

 

(2)如何避免?

1:對查詢結果為空的情況也進行快取,快取時間設定短一點,或者該key對應的資料insert了之後清理快取。

2:對一定不存在的key進行過濾。可以把所有的可能存在的key放到一個大的Bitmap中,查詢時通過該bitmap過濾。

就是說將不存在的key進行過濾,過濾出來一個大陣列,將下次查詢不到的key值與大陣列拼裝。在我們下一次去查詢快取的時

候,判斷是否在這個大陣列中存在這個key,如果存在就說明資料庫中的value也是空的,就直接返回null就可以了,但是存在一

定缺陷,當沒有key值的使用者達到巔峰的時候,陣列一定不小了,也給伺服器造成了一部分的壓力

二、快取雪崩

(1)什麼是快取雪崩?

當快取伺服器重啟或者大量快取集中在某一個時間段失效,這樣在失效的時候,也會給後端系統(比如DB)帶來很大壓力。

(2)如何避免?

1:在快取失效後,通過加鎖或者佇列來控制讀資料庫寫快取的執行緒數量。比如對某個key只允許一個執行緒查詢資料和寫快取,其他執行緒等待。

2:不同的key,設定不同的過期時間,讓快取失效的時間點儘量均勻。

部分關於微信公眾號開發:

1、微信公眾號開發流程
    1、去微信公眾平臺申請
    2、填寫認證資訊
    3、等待稽核
    4、稽核完成之後拿到appid和appsecret
    5、配置伺服器資訊,填寫一個外網能夠訪問的url
    6、輸出微信給出的echo $_GET[‘echostr’];
    7、儲存伺服器資訊

2、linux下壓縮檔案和解壓檔案的命令
    壓縮 : gzip        tar -zcvf
    解壓 : gunzip      tar -zxvf

3、755許可權代表什麼

    _ rwx r_x r_x

    第一個代表 _ 代表的是 當前的這個是一個檔案 d表示是一個目錄
    rwx 每三個一組  第一組代表  所屬主  使用者自己的許可權為 讀寫執行
                  第二組     所屬組   組內容的許可權為   讀和執行
                  第三組     其他人   讀執行
    去掉執行許可權:
        chmod -x 檔名

4、如何將賬號和微信賬號繫結
        微信的網頁授權介面去獲取使用者的opneid
        在我們的系統新增繫結流程
        講openid和我們協同的賬號繫結   (id和openid進行關聯)
        使用者在通過微信進入公眾號的時候,可以獲取到使用者的openid
        根據openid找到對應的賬號,記錄session資訊,這樣使用者就顯示為登入狀態了

5、微信公眾號群發訊息可以通過幾種形式群發。
        1、群發   is_to_all : true 給所有使用者傳送 是有限制的
        2、根據openid列表進行群發
        3、根據標籤進行群發

6、介面安全如何保證
        1、加密(對稱加密,非對稱加密)
        2、簽名
        3、鑑權

7、對稱加密和非對稱加密的區別
        1、對稱加密效率高,但是安全性沒有非對稱加密高
        2、非對稱加密安全性搞,但是效率比對稱加密低
        3、非對稱加密長度有限制,金鑰長度1024的時候只能加密117個字元,需要分段加密解密

8、修改檔案許可權使用那個命令
        chmod  修改許可權
        chown  修改檔案的所有者和所屬組
        chgrp  修改檔案所屬組

9、php實現字串反轉。【不使用strlen之外其他函式】

方法1

        $len = strlen($str);

        $new = ”;
        while( $len ){

            $new .= $str[$len-1];
            $len –;
        }
        echo $new;

方法2:

function text($str){
$newArrOne = [];//初始化一個新的陣列
$newStrOne = '';//初始化一個新的字串
$newArrOne = str_split($str);
$arrCount = count($newArrOne);
for ($i=$arrCount-1; $i>=0; $i--) {
$newStrOne.=$newArrOne[$i];
}
return $newStrOne;
}
echo text(123);

方法3:

function getRev($str,$encoding='utf-8'){
$result = '';
$len = mb_strlen($str);
for($i=$len-1; $i>=0; $i--){
$result .= mb_substr($str,$i,1,$encoding);
}
return $result;
}
$string = '123';
echo getRev($string);

方法4:

print strrev('This is not a palindrome.');

方法5:

function text($str){
$newStrTwo = '';//初始化一個新的字串
$arrCountTwo = strlen($str);
for ($i=1; $i <= $arrCountTwo; $i  ) {
$newStrTwo.=substr($str, -$i, 1);
}
return $newStrTwo;
}
echo text(123);

10、寫出至少三種取出檔案字尾名的方法
       

$file = ‘需要進行獲取副檔名的檔案.php’;

//第一種,根據.拆分,獲取最後一個元素的值
function getExt1{
return end(explode(“.”,$file);)
}
//第二種,獲取最後一個點的位置,擷取
function getExt2{
return substr($file,strrpos($file,’.’) 1);
}
//第三種,根據.拆分,獲取最後一個元素的值
function getExt3($file) {
return array_pop(explode(‘.’,$file)); 
}

//第四種,pathinfo 
function getExt5($file) {
$arr = pathinfo($file);
return $arr[‘extension’];
//或者這樣return pathinfo($file,PATHINFO_EXTENSION);
}

//第五種,正則,子模式
function getExt6$file){
preg_match(”/(gif | jpg | png)$/”,$file,$match);
$match=$match[0];

//第六種,正則反向引用
function getExt7($file){
$match=preg_replace(“/.*\.(\w )/” , “\\1” ,$file );
echo $match;
}

11、linux下如何給php新增新的擴充套件。
        1、wget php的redis擴充套件下載下來
        2、tar -zxvf 檔名
        3、cd 目錄 /
        4、 /usr/local/php/bin/phpize
        5、./configure –prefix=/usr/local/php/bin/php-config
        6、make  make install
        7、修改php.ini  extension=redis.io
        8、重啟php-fpm
        9、列印phpinfo

12、tp5 如何讀取配置檔案配置項 RSA。php 的配置項
        1、
        use  Think\Config;
        config::get(‘RSA.配置項’);

        2、
        config() -> get(‘RSA.配置項’);

13,判斷是否是迴文:

<?php

 function ishuiwen($str){

  $len=strlen($str);

  $l=1;

  $k=intval($len/2) 1;

   for($j=0;$j<$k;$j ){

    if (substr($str,$j,1)!=substr($str,$len-$j-1,1))

     {

  $l=0;

  break;

   }

 }

 if ($l==1)

 {

 return 1;

 }

 else

 {

 return -1;

  }

 }

 $str=12321;

 echo ishuiwen($str);

?>