整合營銷服務(wù)商

          電腦端+手機端+微信端=數(shù)據(jù)同步管理

          免費咨詢熱線:

          PHP常用知識,掌握才能做好一個合格程序員

          PHP常用知識,掌握才能做好一個合格程序員

          6. 什么是OOP?什么是類和對象?什么是類屬性?

          OOP(object oriented programming),即面向?qū)ο缶幊蹋渲袃蓚€最重要的概念就是類和對象。

          世間萬物都具有自身的屬性和方法,通過這些屬性和方法可以區(qū)分出不同的物質(zhì)。

          屬性和方法的集合就形成了類,類是面向?qū)ο缶幊痰暮诵暮突A(chǔ),

          通過類就將零散的用于實現(xiàn)某個功能的代碼有效地管理起來了。

          類只是具備了某些功能和屬性的抽象模型,而實際應(yīng)用中需要一個一個實體,也就是需要對類進行實例化,

          類在實例化之后就是對象。★類是對象的抽象概念,對象是類的實例化。

          OOP具有三大特點:1. 封裝性(又叫做隱藏性);2. 繼承性; 3. 多態(tài)性。

          OOP的優(yōu)點:1、代碼重用性高(省代碼) 2、使程序的可維護性高(擴展性) 3、靈活性

          67. 常用的屬性的訪問修飾符有哪些?分別代表什么含義?

          private,protected,public。

          類外:public ,var

          子類中:public,protected ,var

          本類中:private,protected,public ,var

          如果不使用這三個關(guān)鍵詞,也可以使用var關(guān)鍵字。但是var不可以跟權(quán)限修飾詞一起使用。var定義的變量,子類中可以訪問到,類外也可以訪問到,相當(dāng)于public

          類前面:只能加final,abstract

          屬性前面:必須有訪問修飾符(private,protected,public,var)

          方法前面:static,final,private,protected,public ,abstract

          68. $this和self、parent這三個關(guān)鍵詞分別代表什么?在哪些場合下使用?

          $this 當(dāng)前對象

          self 當(dāng)前類

          parent 當(dāng)前類的父類

          $this在當(dāng)前類中使用,使用->調(diào)用屬性和方法。

          self也在當(dāng)前類中使用,不過需要使用::調(diào)用。

          parent在類中使用。

          69.類中如何定義常量、如何類中調(diào)用常量、如何在類外調(diào)用常量。

          類中的常量也就是成員常量,常量就是不會改變的量,是一個恒值。

          定義常量使用關(guān)鍵字const.

          例如:const PI=3.1415326;

          無論是類內(nèi)還是類外,常量的訪問和變量是不一樣的,常量不需要實例化對象,

          訪問常量的格式都是類名加作用域操作符號(雙冒號)來調(diào)用。

          即:類名 :: 類常量名;

          70. 作用域操作符::如何使用?都在哪些場合下使用?

          調(diào)用類常量

          調(diào)用靜態(tài)方法

          71. 什么是魔術(shù)方法?常用的魔術(shù)方法有哪幾個?

          以__開頭的系統(tǒng)自定義的方法。

          __construct()

          __destruct()

          __autoload()

          __call()

          __tostring()

          72. 什么是構(gòu)造方法和析構(gòu)方法?

          構(gòu)造方法就是在實例化一個對象的同時自動執(zhí)行的成員方法,作用就是初始化對象。

          php5之前,一個跟類名完全相同的方法是構(gòu)造方法,php5之后魔術(shù)方法__construct()就是構(gòu)造方法。

          如果類中沒有定義構(gòu)造方法,那么php會自動生成一個,這個自動生成的構(gòu)造方法沒有任何參數(shù),

          沒有任何操作。

          構(gòu)造方法的格式如下:

          function __construct(){}

          或者:function 類名(){}

          構(gòu)造方法可以沒有參數(shù),也可以有多個參數(shù)。

          析構(gòu)方法的作用和構(gòu)造方法正好相反,是對象被銷毀時被自動調(diào)用的,作用是釋放內(nèi)存。

          析構(gòu)方法的定義方法為:__destruct();

          因為php具有垃圾回收機制,能自動清除不再使用的對象,釋放內(nèi)存,一般情況下可以不手動創(chuàng)建析構(gòu)方法。

          73. __autoload()方法的工作原理是什么?

          使用這個魔術(shù)函數(shù)的基本條件是類文件的文件名要和類的名字保持一致。

          當(dāng)程序執(zhí)行到實例化某個類的時候,如果在實例化前沒有引入這個類文件,那么就自動執(zhí)行__autoload()函數(shù)。

          這個函數(shù)會根據(jù)實例化的類的名稱來查找這個類文件的路徑,當(dāng)判斷這個類文件路徑下確實存在這個類文件后

          就執(zhí)行include或者require來載入該類,然后程序繼續(xù)執(zhí)行,如果這個路徑下不存在該文件時就提示錯誤。

          使用自動載入的魔術(shù)函數(shù)可以不必要寫很多個include或者require函數(shù)。

          74. 什么是抽象類和接口?抽象類和接口有什么不同和相似的地方?

          抽象類是一種不能被實例化的類,只能作為其他類的父類來使用。

          抽象類是通過關(guān)鍵字 abstract 來聲明的。

          抽象類與普通類相似,都包含成員變量和成員方法,兩者的區(qū)別在于,抽象類中至少要包含一個抽象方法,

          抽象方法沒有方法體,該方法天生就是要被子類重寫的。

          抽象方法的格式為:abstract function abstractMethod();

          因為php中只支持單繼承,如果想實現(xiàn)多重繼承,就要使用接口。也就是說子類可以實現(xiàn)多個接口。

          接口類是通過interface關(guān)鍵字來聲明的,接口類中的成員變量和方法都是public的,方法可以不寫關(guān)鍵字public,

          接口中的方法也是沒有方法體。接口中的方法也天生就是要被子類實現(xiàn)的。

          抽象類和接口實現(xiàn)的功能十分相似,最大的不同是接口能實現(xiàn)多繼承。在應(yīng)用中選擇抽象類還是接口要看具體實現(xiàn)。

          子類繼承抽象類使用extends,子類實現(xiàn)接口使用implements。

          抽象類至少有一個抽象方法嗎??????

          答:如果一個類聲明成抽象類,里面可以沒有抽象方法

          如果一個類中有抽象方法,這個類必須是抽象類

          75. __call的參數(shù)有幾個,類型是什么,意義是什么?

          魔術(shù)方法__call()的作用是當(dāng)程序調(diào)用一個不存在或不可見的成員方法時,php會先調(diào)用__call()方法,

          將那個不存在的方法的方法名和參數(shù)都存儲下來。

          __call()包含兩個參數(shù), 第一個參數(shù)是那個不存在的方法的方法名,是個字符串類型;

          第二個參數(shù)是那個不存在的方法的所有參數(shù),是個數(shù)組類型。

          本人認為__call()方法的意義更多在于調(diào)試,可以定位到錯誤。同時可以捕捉異常,如果某個方法不存在,

          則執(zhí)行其它可替代方法。

          76. smarty模板技術(shù)的用途是什么?

          為了php與html分開,美工和程序員各司其職,互不干擾。

          77. smarty配置主要有哪幾項?

          1. 引入smarty.class.php;

          2. 實例化smarty對象;

          3. 重新修改默認的模板路徑;

          4. 重新修改默認的編譯后文件的路徑;

          5. 重新修改默認的配置文件的路徑;

          6. 重新修改默認的cache的路徑。

          7. 可以設(shè)置是否開啟cache。

          8. 可以設(shè)置左側(cè)和右側(cè)定界符。

          78. smarty在使用過程中需要注意哪些細節(jié)?

          Smarty是基于MVC概念的一種模板引擎,它將一個頁面程序分成了兩部分來實現(xiàn):即視圖層和控制層,

          也就是說smarty技術(shù)將用戶UI與php代碼分離開。

          這樣程序員和美工各司其職,互不干擾。

          smarty運用過程中要注意以下幾個問題:

          1.正確配置smarty。主要要實例化smarty對象,配置smarty模板文件的路徑;

          2.php頁面中使用assign賦值 和 display顯示頁面;

          3.smarty模板文件中不允許出現(xiàn)php代碼段,所有的注釋,變量,函數(shù)都要包含在定界符內(nèi)。

          A.{}

          B. foreach

          C. if else

          D. include

          E. literal

          79. MVC的概念是什么?各層主要做什么工作?

          MVC(即模型-視圖-控制器)是一種軟件設(shè)計模式或者說編程思想。

          M指Model模型層,V是View視圖層(顯示層或者用戶界面),C是Controller控制器層。

          使用mvc的目的是實現(xiàn)M和V分離,從而使得一個程序可以輕松使用不同的用戶界面。

          在網(wǎng)站開發(fā)中,

          模型層一般負責(zé)對數(shù)據(jù)庫表信息進行增刪改查,

          視圖層負責(zé)顯示頁面內(nèi)容,

          控制器層在M和V之間起到調(diào)節(jié)作用,控制器層決定調(diào)用哪個model類的哪個方法,

          執(zhí)行完畢后由控制器層決定將結(jié)果assign到哪個view層。

          80. oop中的多態(tài)性跟方法重寫有什么關(guān)系?

          答:

          81. java語言中方法重寫和重載分別代表什么意思?準確說php支持方法的重載嗎?很多參考書中提到的php重載實際上該如何正確理解?

          答:

          php不支持方法的重載,很多書里提到的PHP‘重載’應(yīng)該是‘重寫’

          82. final關(guān)鍵字能定義類中的成員屬性嗎?

          答:不能,類的成員屬性只能有public ,private , protected ,var 來定義

          83. final關(guān)鍵字定義的類能夠被繼承嗎?

          答:final定義的類不能被繼承

          84. 說說static關(guān)鍵字的使用場合?static能用在class前嗎?

          static可以跟public,protected,private一起使用嗎?構(gòu)造方法可以是static的嗎?

          答: static可以在屬性和方法前面使用,調(diào)用static屬性或者方法時,只要將類載入就可用,不用實例化

          static不能用在class的前面

          static可以跟public,protected,private一起使用,在方法的前面;

          ▲構(gòu)造方法不能是static

          85. 接口可以實例化嗎?抽象類能實例化嗎?

          答:接口和抽象類都不能被實例化

          86. class前面能加訪問修飾符嗎?如果能加,只能是哪幾個訪問修飾符?可以是權(quán)限訪問修飾符public,protected,private嗎?

          答:class前面可以加final,static;

          ★class前面不能加public,protected,private

          87. 類中屬性前可以不加訪問修飾符嗎?成員變量前的修飾符只能是public,protected,private嗎?還可以是哪幾個?

          答:類中的屬性必須加修飾符,除了那3個以外,還可以加var

          88. 如果echo一個數(shù)組,頁面輸出什么?echo一個對象呢?print一個數(shù)組或者對象呢?

          答:頁面只能輸出“Array”;echo一個對象會出現(xiàn)“Catchable fatal error: Object of class t2 could not be converted to string in G:\php2\t2.php on line 33”

          print一個數(shù)組時也只是輸出“Array”,print一個對象出現(xiàn)“Catchable fatal error: Object of class t2 could not be converted to string in G:\php2\t2.php ”

          ▲print和echo是一樣的

          89. __tostring()魔術(shù)方法在什么時候被自動執(zhí)行? __tostring()魔術(shù)方法必須要return返回值嗎?

          當(dāng)echo或者print一個對象時,就是自動觸發(fā)。而且__tostring()必須要返回一個值

          90. 什么是抽象方法?

          答:在方法前面有abstract,而且方法沒有方法體,連“{ }”也不能有

          91. 如果一個類中有一個方法是抽象方法,而這個類沒有定義成抽象類,會報錯嗎?

          答:會,"Fatal error: Class t2 contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (t2::ee) in"

          92. 如果一個類是抽象類,而類中的方法都是非抽象的方法,會報錯嗎?

          答:不會報錯,如果一個類是抽象類,其中可以沒有抽象方法,但是一個類中有個方法是抽象方法,那么這個類一定是一個抽象類

          94. final 關(guān)鍵字的應(yīng)用應(yīng)注意的問題?

          使用final關(guān)鍵字定義的類,禁止繼承。

          使用final關(guān)鍵字定義的方法,禁止重寫。

          95. 如果一個類既要繼承一個父類,又要實現(xiàn)多個接口,該如何寫?

          書寫格式例如: class MaleHuman extends Human implements Animal,Life { ... }

          96. 什么是單點入口呢?

          所謂單點入口就是整個應(yīng)用程序只有一個入口,所有的實現(xiàn)都通過這個入口來轉(zhuǎn)發(fā),

          比如說在上面我們就使用index.php作為程序的單點入口,當(dāng)然這個是可以由你自己任意控制的。

          單點入口有幾大好處:

          第一、一些系統(tǒng)全局處理的變量,類,方法都可以在這里進行處理。比如說你要對數(shù)據(jù)進行初步的過濾,你要模擬session處理,你要定義一些全局變量,甚至你要注冊一些對象或者變量到注冊器里面

          第二、程序的架構(gòu)更加清晰明了。

          97. PHP提供了2套正則表達式函數(shù)庫,分別是哪兩套?【

          (1) PCRE Perl兼容正則表達式 preg_ 為前綴

          (2) POSIX 便攜式的操作系統(tǒng)接口 ereg_ 為前綴

          98. 正則表達式的組成?

          由原子(普通字符,如英文字符)、

          元字符(有特殊功用的字符)

          模式修正字符

          一個正則表達式中,至少包含一個原子

          99. 不常用魔術(shù)方法的觸發(fā)時機?

          __isset() __unset()的觸發(fā)時機

          __sleep()、 __wakeup() 在對對象進行串行化的時候調(diào)用

          如果序列化對象的時候,不寫__sleep()方法,則所有的成員屬性都會被序列化,而定義了__sleep()方法,則只序列化指定數(shù)組中的變量。

          因此,如果有非常大的對象而并不需要完全儲存下來時此函數(shù)也很有用。

          使用 __sleep 的目的是關(guān)閉對象可能具有的任何數(shù)據(jù)庫連接,提交等待中的數(shù)據(jù)或進行類似的清除任務(wù)。此外,如果有非常大的對象而并不需要完全儲存下來時此函數(shù)也很有用。

          使用 __wakeup 的目的是重建在序列化中可能丟失的任何數(shù)據(jù)庫連接以及處理其它重新初始化的任務(wù)。

          100. OOP的三大特性是什么?

          1. 封裝性:

          也稱為信息隱藏,就是將一個類的使用和實現(xiàn)分開,只保留部分接口和方法與外部聯(lián)系,或者說只公開了一些供開發(fā)人員使用的方法。

          于是開發(fā)人員只需要關(guān)注這個類如何使用,而不用去關(guān)心其具體的實現(xiàn)過程,這樣就能實現(xiàn)MVC分工合作,也能有效避免程序間相互依賴,

          實現(xiàn)代碼模塊間松藕合。

          2. 繼承性:

          就是子類自動繼承其父級類中的屬性和方法,并可以可以添加新的屬性和方法或者對部分屬性和方法進行重寫。繼承增加了代碼的可重用性。

          php只支持單繼承,也就是說一個子類只能有一個父類。

          3. 多態(tài)性:

          子類繼承了來自父級類中的屬性和方法,并對其中部分方法進行重寫。

          于是多個子類中雖然都具有同一個方法,但是這些子類實例化的對象調(diào)用這些相同的方法后卻可以獲得完全不同的結(jié)果,這種技術(shù)就是多態(tài)性。

          多態(tài)性增強了軟件的靈活性。

          101.常見框架

          thinkPHP

          yii

          ZendFramework

          CakePhp

          sy

          102. 常用魔術(shù)方法的觸發(fā)時機?

          1)__autoload() :當(dāng)程序?qū)嵗硞€類,而該類沒有在當(dāng)前文件中被引入。此時會觸發(fā)執(zhí)行__autoload()。程序希望通過該方法,自動引入這個類文件。該方法有一個參數(shù),即就是那個忘記引入的類的名稱。__autoload()方法的工作原理是什么?當(dāng)程序執(zhí)行到實例化某個類的時候,如果在實例化前沒有引入這個類文件,那么就自動執(zhí)行__autoload()函數(shù)。這個函數(shù)會根據(jù)實例化的類的名稱來查找這個類文件的路徑,當(dāng)判斷這個類文件路徑下確實存在這個類文件后,就執(zhí)行include或者require來載入該類,然后程序繼續(xù)執(zhí)行,如果這個路徑下不存在該文件時就提示錯誤。使用自動載入的魔術(shù)函數(shù)可以不必要寫很多個include或者require函數(shù)。

          2)__construct() :這個是魔術(shù)構(gòu)造方法。構(gòu)造方法是實例化對象的時候自動執(zhí)行的方法,作用就是初始化對象。該方法可以沒有參數(shù),也可以有多個參數(shù)。如果有參數(shù),那么new這個對象的時候要記得寫上相應(yīng)的參數(shù)。在php5以前,沒有魔術(shù)構(gòu)造方法,普通構(gòu)造方法是一個跟類名同名的方法來實現(xiàn)構(gòu)造的。如果一個類中既寫了魔術(shù)構(gòu)造方法,又定義了普通構(gòu)造方法。那么php5以上版本中,魔術(shù)方法起作用,普通構(gòu)造方法不起作用。反之,在php5以前版本中,不認識魔術(shù)構(gòu)造方法,只是把該方法當(dāng)做普通的方法。

          3)__destruct() :這個是魔術(shù)析構(gòu)方法。析構(gòu)方法的作用和構(gòu)造方法正好相反,是對象被銷毀時被自動調(diào)用的,作用是釋放內(nèi)存。析構(gòu)方法沒有參數(shù)。

          4)__call() :當(dāng)程序調(diào)用一個不存在或不可見的成員方法時,自動觸發(fā)執(zhí)行__call()。它有兩個參數(shù),分別是未訪問到的方法名稱和方法的參數(shù)。而第二個參數(shù)是數(shù)組類型。

          5)__get() :當(dāng)程序調(diào)用一個未定義或不可見的成員屬性時,自動觸發(fā)執(zhí)行__get()。它有一個參數(shù),表示要調(diào)用的屬性的名稱。

          6)__set():當(dāng)程序試圖寫入一個不存在或不可見的成員屬性時,PHP就會自動執(zhí)行__set()。它包含兩個參數(shù),分別表示屬性名稱和屬性值。

          7)__tostring() :當(dāng)程序使用echo或print輸出對象時,會自動調(diào)用該方法。目的是希望通過該方法將對象轉(zhuǎn)化為字符串,再輸出。__tostring() 無參數(shù),但是該方法必須有返回值。

          8)__clone() :當(dāng)程序clone一個對象的時候,能觸發(fā)__clone()方法,程序希望通過這個魔術(shù)方法實現(xiàn):不僅僅單純地克隆對象,還需要克隆出來的對象擁有原來對象的所有屬性和方法。

          103. MVC的概念是什么?

          MVC(即模型-視圖-控制器)是80年代發(fā)明的一種軟件設(shè)計模式或者說編程思想。

          M指模型層,V是指視圖層(顯示層或者用戶界面),C是指控制層。

          使用mvc的目的是實現(xiàn)M和V分離,從而使得一個程序可以輕松使用不同的用戶界面。

          C存在的目的則是在M和V之間起到調(diào)節(jié)作用,確保M和V的同步,一旦M改變,V應(yīng)該能同步更新。

          將M和V分離,就可以做到同一個網(wǎng)頁,在不同節(jié)日到來的時候能顯示不同的頁面風(fēng)格,這只需要提前制作多個視圖層模板頁面,

          而無需更改M層程序。

          MVC做到了編程中的分工合作,代碼的可重用性得到最大化體現(xiàn),程序邏輯更加清晰而富有條理,便于后期維護管理。

          104、 訪問權(quán)限修飾符有哪幾種,對比解釋

          答:1、public 表示公共的,在本類中和子類中以及類外,可以對其調(diào)用

          2、protected表示受保護的,可以在本類中和子類中調(diào)用

          3、private表示私有的,只能在本類中調(diào)用

          4、var,效果等同于public

          105、 Class關(guān)鍵詞前可以有哪些修飾詞

          a) Final修飾,表示該類是最終的,無法繼承

          b) Abstract修飾,表示該類是抽象類

          106、 作用域操作符在那些場合下使用

          答:作用于操作符的使用場合

          a) 本類中:

          i. self::類常量

          ii. self::靜態(tài)屬性

          iii. self::方法() parent::方法()

          b) 子類中:

          i. parent::類常量

          ii. parent::靜態(tài)屬性(public或者protected)

          iii. parent::方法()(public或者protected)

          c) 類外:

          i. 類名::類常量

          ii. 類名::靜態(tài)屬性(public)

          iii. 類名::靜態(tài)方法(public)

          107、 $this,self, parent分別代表什么?哪些場合下使用

          答:$this代表的是當(dāng)前對象

          self代表的是當(dāng)前的類

          parent代表的是當(dāng)前類的父類

          使用場合:

          $this只能使用在當(dāng)前類中,通過$this->可以調(diào)用當(dāng)前類中的屬性和方法;

          self只能在當(dāng)前類中使用,通過作用域操作符::訪問當(dāng)前類中的類常量、當(dāng)前類中的靜態(tài)屬性、當(dāng)前類中的方法;

          parent只能使用在有父類的當(dāng)前類中,通過作用域操作符::訪問父類中的類常量、父類中的靜態(tài)屬性、父類中的方法。

          108、 說明是接口、抽象類二者有何相同和不同的地方?

          1、接口是幫助php實現(xiàn)功能意義上的多繼承的,用interface來聲明,其方法沒有方法體,使用implemens關(guān)鍵詞來實現(xiàn)接口。

          接口中只能包含抽象方法和類常量,不可以包含成員屬性。

          2、抽象類是一種不能被實例化的類,只能作父類,用abstract class來定義,抽象類和普通類可以沒有區(qū)別,類中可以包含成員屬性、類常量、方法。

          子類得用extends來繼承,而且只能是單繼承。

          兩者相同點是都不可以被實例化,都是需要被繼承才可以使用。

          兩者的最大區(qū)別是接口可以實現(xiàn)多繼承,而抽象類只能是單繼承。

          接口中不能包含成員屬性,而抽象類中可以有成員屬性。

          接口中的抽象方法必須是public或者無訪問修飾詞,接口中的抽象方法不能用abstract來修飾。

          抽象類中的方法可以是普通方法,也可以是抽象方法,如果是抽象方法,一定需要使用abstract來修飾。

          109、 解釋PHP中單例模式?

          又叫做單態(tài)模式、單元素模式、singleton pattern。

          單例模式指在PHP的應(yīng)用程序的范圍內(nèi)只對指定的類創(chuàng)建一個實例。使用單例模式的類稱為單例類。

          在php中單例類必須要有一個私有的構(gòu)造方法,還要有一個私有的魔術(shù)克隆方法(該方法體中為空)

          和一個私有的靜態(tài)的成員屬性$_instance.

          私有構(gòu)造方法防止除自身以外的類來實例化它。私有的方法體為空的克隆方法防止該類被克隆。

          $_instance用來存儲被自身實例化后的對象。

          還必須要有一個公共的靜態(tài)的方法getInstance()。該方法返回已經(jīng)存儲了實例對象的$_instance。

          110、 什么是SQL注入?

          SQL注入攻擊是黑客對數(shù)據(jù)庫進行攻擊的常用手段之一。一部分程序員在編寫代碼的時候,

          沒有對用戶輸入數(shù)據(jù)的合法性進行判斷,注入者可以在表單中輸入一段數(shù)據(jù)庫查詢代碼并提交,

          程序?qū)⑻峤坏男畔⑵礈惿梢粋€完整sql語句,服務(wù)器被欺騙而執(zhí)行該條惡意的SQL命令。注入者根據(jù)程序返回的結(jié)果,

          成功獲取一些敏感數(shù)據(jù),甚至控制整個服務(wù)器,這就是SQL注入。

          111、 如何防止SQL注入?

          要對提交的信息進行過濾,對單引號進行轉(zhuǎn)義。

          首先可以在php.ini中設(shè)置,讓所有的單引號在提交后都進行轉(zhuǎn)義?;蛘呤褂胊ddslashes().

          112、 FCKEditor自動過濾的解決辦法?

          如果您需要編輯模板頁,默認的FCK設(shè)置是會去掉<HTML></HTML><BODY></BODY>標簽,而且會給你加上<P></P>標簽的,如果需要保留的話,只要更改下設(shè)置可以了。

          在fckconfig.js里面有:FCKConfig.FullPage=false ;

          改為:FCKConfig.FullPage=true;

          如果想去掉自動添加<P>的代碼就可以在這里設(shè)置

          默認是

          FCKConfig.EnterMode='p' ; // p | div | br

          FCKConfig.ShiftEnterMode='br' ; // p | div | br

          改成

          FCKConfig.EnterMode='br' ; // p | div | br

          FCKConfig.ShiftEnterMode='p' ; // p | div | br

          113、 $_REQUEST、$_GET、$_POST、$_COOKIE 的關(guān)系和區(qū)別:

          1.關(guān)系:$_REQUEST包含了$_GET、$_POST、$_COOKIE等的所有內(nèi)容,是它們的集合體。

          2.通過$_REQUEST獲取變量值,PHP頁面因為不確定它是哪種傳值方式,

          因此會根據(jù)php.ini中的配置來接收值。

          php.ini里可以設(shè)置,variables_order=“GPC”。其含義是GET,POST,COOKIE.

          所以PHP頁面會先從$_GET中獲取,再從$_POST中獲取,然后從$_COOKIE中獲取。

          新獲得的值會覆蓋之前獲取到的值。

          因此從表現(xiàn)形式上看,$_REQUEST最后是獲取$_COOKIE中的值,如果$_COOKIE中沒有值,

          會獲取$_POST中的值,如果$_POST沒有獲取到 ,就去$_GET中獲取。

          如果$_GET中也沒有該值,那么$_REQUEST就返回null。

          114、 什么是多條件查詢(復(fù)合查詢),如何實現(xiàn)多條件查詢?

          如何實現(xiàn)萬能查詢呢?查詢的時候要填寫查詢條件,這些條件會通過表單進行提交。

          首先需要檢查提交的條件是否為空。如果不為空,就認為這個值是要被當(dāng)作條件,

          我們就可以使用字符串連接的方式來組合一個sql查詢語句。

          當(dāng)執(zhí)行后獲取查詢結(jié)果。

          115. 文件上傳需要注意哪些細節(jié)?怎么把文件保存到指定目錄?怎么避免上傳文件重名問題?

          1). 首現(xiàn)要在php.ini中開啟文件上傳;

          2). 在php.ini中有一個允許上傳的最大值,默認是2MB。必要的時候可以更改;

          3). 上傳表單一定要記住在form標簽中寫上enctype="multipart/form-data";

          4). 提交方式 method 必須是 post;

          5). 設(shè)定 type="file" 的表單控件,并且必須具有name屬性值;

          6). 為了上傳成功,必須保證上傳文件的大小是否超標、文件類型是否符合要求,上傳后存放的路徑是否存在;

          7). 表單提交到接收頁面,接收頁面使用$_FILES來接收上傳的文件。

          $_FILES是個多維數(shù)組。第一維下標是上傳控件的name,二維下標分別為name/type/tmp_name/size/error。分別代表

          文件名、文件類型、上傳到臨時目錄下的臨時文件名、文件大小、是否有錯誤。

          如果是批量上傳,那么二維下標就是數(shù)組,而并非是字符串。

          8). 文件上傳后是被放置在服務(wù)器端臨時路徑下,需要使用move_uploaded_file ()函數(shù),才可以將上傳后的

          文件保存到指定目錄。

          9). 為了避免上傳文件重名,可以通過上傳的文件名獲取到文件后綴,然后使用時間戳+文件后綴的方式為文件重新命名。

          116. 使用GD2庫創(chuàng)建圖像的步驟?

          1). 創(chuàng)建一個畫布:

          imagecreate();

          2). 設(shè)置畫布背景顏色,使用RGB設(shè)置顏色:

          imagecolorallocate();

          3). 設(shè)置文字顏色:

          imagecolorallocate();

          4). 在畫布上書寫文字:

          imagestring();

          5). 以 JPEG 格式將圖像輸出到瀏覽器或文件:【根據(jù)圖片格式不同,函數(shù)還可以是imagepng()、imagegif()等】

          imagejpeg();

          6). 清除圖像資源:

          imagedestroy();

          117. GD2庫生成縮略圖的步驟是什么?

          1). 讀取希望生成縮略圖的源圖像,創(chuàng)建圖像對象:【根據(jù)圖片格式不同,函數(shù)也相應(yīng)不同】

          $src_image=imagecreatefromjpeg();

          2). 獲取原圖像的寬度和高度$srcW,$srcH,根據(jù)縮放比例計算出新圖像的寬度和高度$dstW、$dstH:

          3). 創(chuàng)建一個真色彩的圖像對象,寬度和高度設(shè)置成剛才計算出的寬度和高度:

          $dst_image=imagecreatetruecolor($dstW,$dstH);

          4). 拷貝圖像并調(diào)整大小:

          imagecopyresized();

          5). 將圖像輸出:【根據(jù)圖片格式不同,函數(shù)也相應(yīng)不同】

          imagejpeg();

          6). 清除圖像資源(將源圖像資源和目標圖像資源都清除)

          imagedestroy();

          118. GD2庫給圖片增加水印如何做?

          1. 添加簡單的文本水?。?/p>

          利用imagestring()函數(shù)就可以在圖片上寫文本水印。

          2. 增加一個圖形水?。?/p>

          1). 讀取希望增加水印的源圖片,創(chuàng)建圖像對象:【根據(jù)圖片格式不同,函數(shù)也相應(yīng)不同】

          $image=imagecreatefromjpeg();

          2). 創(chuàng)建一個水印圖片的圖像對象:

          $watermark=imagecreatefrompng();

          3). 拷貝并合并圖像:

          imagecopymerge();

          4). 將圖像輸出:【根據(jù)圖片格式不同,函數(shù)也相應(yīng)不同】

          imagejpeg();

          5). 清除圖像資源(將源圖像資源和水印圖像資源都清除)

          imagedestroy();

          119. 什么是事務(wù)?什么是回滾?事務(wù)的作用是什么?

          事務(wù)就是組合起來的幾個獨立的sql操作。如果其中一項失敗,那么就讓這幾個組合起來的sql操作都

          回退到未執(zhí)行狀態(tài)。這就是事務(wù)的回滾。

          mysql中MyISAM存儲引擎的表不支持事務(wù),只有InnoDB 存儲引擎的表才支持事務(wù),為了讓事務(wù)正常執(zhí)行,

          就需要讓參與事務(wù)的所有數(shù)據(jù)表都設(shè)置成innoDB類型。

          事務(wù)被包裝在了 BEGIN 和 COMMIT 語句之間。在沒有使用 COMMIT 語句的情況下,對數(shù)據(jù)庫的操作不是永久的,

          一旦運行了 ROLLBACK,就會被回退。只有執(zhí)行了COMMIT,數(shù)據(jù)表中的信息才被改動。

          事務(wù)的目的就是為了保證數(shù)據(jù)的完整性。

          120. 模擬SESSION機制實現(xiàn)數(shù)據(jù)庫存放會話數(shù)據(jù)有什么作用?【備用】

          如果使用默認的SESSION機制,大家都知道默認的SESSION_ID是存放在COOKIE中,用戶的身份是靠SESSION_ID來識別的,

          而COOKIE文件是存放在用戶瀏覽器的客戶端,這樣就會帶來一個問題,當(dāng)用戶在辦公室選擇一些商品到購物車,

          在準備下訂單付款的時候,用戶選擇了支付寶在線的支付方式,恰巧辦公室的電腦上面沒有安裝支付寶的數(shù)字證書,

          而在用戶家里的電腦安裝過數(shù)字證書,所以呢,用戶就需要回家去支付。但是回家登錄商城之后,

          發(fā)現(xiàn)購物車中精心挑選的商品都不存在了。這是為什么呢?問題就在家里電腦上的并沒有存放SESSION_ID的cookie文件,

          因而就無法正確的讀取服務(wù)器上對應(yīng)session文件中的數(shù)據(jù),所以無法將原來的選擇的商品息讀取過來。

          這樣的購物車功能給用戶的用戶體驗式非常糟糕的,所以我們就需要采取模擬SESSION機制使用數(shù)據(jù)庫來存放會話數(shù)據(jù)。

          121. 什么是無限極分類?

          要實現(xiàn)無限極分類,數(shù)據(jù)庫建表是關(guān)鍵。

          表結(jié)構(gòu)中至少需要三個字段,如果想避免遞歸循環(huán),那么需要四個字段。

          1. id ,當(dāng)前數(shù)據(jù)的唯一標識;

          2. typename ,類型名稱;

          3. parentid , 當(dāng)前類型的上一層父類型的id;

          4. path , 其中存儲當(dāng)前類型的id和它所有父級類型的id。

          這些id之間采用“-”隔開。

          5. 當(dāng)通過以下sql語句就可以實現(xiàn),相同頂級類下的信息都在一起集中顯示。

          select * from 表名 where 條件 order by path;

          122. 分頁原理是什么?

          數(shù)據(jù)分頁需要以下幾個條件:

          1. 參與分頁的總條數(shù) 【$msg_count】 ,該值通過數(shù)據(jù)庫查詢可以獲取到;

          2. 每頁顯示的條數(shù)【$pagesize】 ,這個數(shù)值由自己定義;

          3. 當(dāng)前頁的頁碼數(shù) 【$page】,該數(shù)值通過地址欄傳遞和接收;

          4. 可以通過以上資料計算出總頁數(shù) 【$pagecount】 ,此處需要借助ceil();

          【$pagecount=ceil($msg_count/$pagesize);】

          5. 數(shù)據(jù)庫查詢借助sql語句中的【limit】來實現(xiàn)數(shù)據(jù)的變化:

          例如:

          select * from 表名 where 條件 limit $startnum , $pagesize;

          而$startnum=($page-1)*$pagesize;

          123、 如何在smarty模板語言中使用php代碼?

          借助于兩個smarty內(nèi)建函數(shù)。

          1. inluce_php 函數(shù)用于在模板中包含 php 腳本。例如:

          {include_php file="test.php"}

          2. php 標簽允許在模板中直接嵌入 php 腳本。例如:

          {php}

          echo "這個是php內(nèi)建函數(shù)的作用";

          {/php}

          124、 請列出至少五個smarty中的變量調(diào)節(jié)符并說明功能?

          default 例如:{$arr|default:’xxxx’} ,默認變量調(diào)節(jié)器,當(dāng)變量為空時顯示給定的默認值;

          truncate 例如:{$articleTitle|truncate:10} , 切割字符串長度為指定的長度;

          count_characters 例如:{$articleTitle|count_characters} ,獲取字符串長度;

          strip_tags 例如: {$articleTitle|strip_tags} ,去除字符串中的所有html標簽;

          date_format 例如:{$smarty.now|date_format(‘’)} ,格式化時間戳。

          125、 寫程序?qū)崿F(xiàn)如下功能:

          a.如何判斷一個字符串中是否存在一個字符?

          echo strstr('abcdefgcd' , 'cd');

          echo strpos('ab0defgcd' , 'cd');

          b.如何判斷一個字符串中一個字符出現(xiàn)的次數(shù)?

          echo substr_count('abcdefgcd' , 'cd');

          c.如何去掉一個字符串的最后一個字符

          echo substr('abcdefgcd' , 0 , -1);

          126、 如何使用smarty的緩存、步驟?什么叫單模板多緩存?

          如果給整個網(wǎng)站開啟緩存,那么$smarty->caching=1,此時緩存的時間為smarty.class.php中默認的時間,也就是3600秒。

          如果對每一個頁面獨立設(shè)置緩存,那么$smarty->caching=2 ,緩存時間就會跟display的參數(shù)模板頁相掛鉤,也就是可以實現(xiàn)對每個模板頁設(shè)置不同的緩存時間。

          用法例如:

          if(!$smarty->is_cached('index.html')) {

          //此處可以執(zhí)行數(shù)據(jù)庫操作

          $smarty->cache_lifetime=3600*6;

          }

          $smarty->display('index.html');

          對于例如新聞單條這樣的頁面,新聞的模板都是一個,如果開啟緩存,那么所有的新聞單頁的緩存都是一個,根本不會隨著id的變化而變換內(nèi)容。所以為了區(qū)分不同的頁面緩存,需要使用單模板多緩存技術(shù)。具體做法是以id作為display的第二個參數(shù)來實現(xiàn)。此外對于具有分頁的列表頁,也必須在display中使用第二個參數(shù),可以使用新聞類型id和當(dāng)前頁面合并成第二個參數(shù)。

          127、 寫一個遞歸函數(shù)完成以下功能:向函數(shù)中傳一個多維數(shù)組,對數(shù)組中所有的值做判斷

          ,如果值是’number’則設(shè)置該值為0?(提示:該題考的是遞歸的應(yīng)用,因為傳入的數(shù)組不確定是多少維的,所以需要遞歸判斷)

          function recursive_array($arr) {

          if(is_array($arr)) {

          foreach($arr as $key=>$value) {

          if(is_array($value)) {

          $arr[$key]=recursive_array($value);

          } else {

          if($value=='number') {

          $arr[$key]='0'; }

          }

          }

          }

          return $arr;

          }

          128、 使用jquery寫一個全選的例子?

          //全選與取消全選

          function selectAll(flag) {

          for(var i=0; i<$("#fonds input").size(); i++) {

          $("#fonds input").get(i).checked=flag;

          }

          }

          //判斷復(fù)選框已經(jīng)被勾選了多少個?

          function checkFonds() {

          var count=0;

          for(var i=0; i<$("#fonds input").size(); i++) {

          if($("#fonds input").get(i).checked==true) {

          count++;

          }

          }

          alert(count);

          }

          //利用后代選擇器和get()來獲取指定的控件

          $(“div a”).get(2)

          129、 請說明smarty中fetch方法的功能?

          Fetch方法可以獲取到頁面所有的內(nèi)容,并且賦值到一個變量中。

          如果第四個參數(shù)為true,則等同于display,直接輸出到瀏覽器中。

          如果第四個參數(shù)為false,則不輸出。

          Display方法就是第四個參數(shù)為true的fetch方法。

          Display=Fetch() + echo()

          130、 寫出關(guān)于文件上傳的相關(guān)函數(shù)?

          strrchr($filename , '.');

          explode('.' , $filename);

          end($arr);

          strrpos($filename , '.');

          substr($filename , $pos+1);

          pathinfo($filename , PATHINFO_EXTENSION);

          date(‘YmdHis’)

          time()

          rand();

          mt_rand()

          move_uploaded_file()

          131、 如何將SESSION存放在數(shù)據(jù)庫中,可以結(jié)合數(shù)據(jù)表設(shè)計說明.

          默認情況下php.ini中session.save_handler=files,也就是session是以文件形 式存儲的。

          如果想更改為數(shù)據(jù)庫或其它存儲方式,那么需要更改設(shè)置,讓 session.save_handler=user。

          除了在php.ini中配置外,還可以在PHP頁面中單獨配置,用

          ini_set ('session.save_handler, 'user')來設(shè)置session的存儲方式,設(shè)置為用戶自定義存儲方式。

          設(shè)置好存儲方式后,需要使用session_set_save_handler()函數(shù)。

          該函數(shù)是設(shè)置用戶級別的session保存過程的函數(shù)。該函數(shù)有6個參數(shù),這6個參數(shù)其實是6個自定義函數(shù)的名稱,分別代表對session的開啟,關(guān)閉,讀,寫 ,銷毀,gc(垃圾回收)。

          示例代碼如下:

          function open () { }

          function close() { }

          function read () { }

          function write () {}

          function destroy () {}

          function gc () {}

          session_set_save_handler ("open", "close", "read", "write", "destroy", "gc");

          session_start();

          現(xiàn)在你就可以象往常一樣地使用session了。

          數(shù)據(jù)庫結(jié)構(gòu)如下:

          Session_id , session_value ,expire_time , 分別存儲sessionid的id和值以及失效時間。

          132、 常用的正則表達式寫法:

          中文:/^[\u4E00-\u9FA5]+$/

          手機號碼:/^(86)?0?1\d{10}$/

          EMAIL:

          /^[\w-]+[\w-.]?@[\w-]+\.{1}[A-Za-z]{2,5}$/

          密碼(安全級別中):

          /^(\d+[A-Za-z]\w*|[A-Za-z]+\d\w*)$/

          密碼(安全級別高):

          /^(\d+[a-zA-Z~!@#$%^&(){}][\w~!@#$%^&(){}]*|[a-zA-Z~!@#$%^&(){}]+\d[\w~!@#$%^&(){}]*)$/

          習(xí)CSS注入的目的是學(xué)習(xí)計算機知識,千萬不要做違反法律的事情,不然等待你的是法律的嚴懲。

          CSS僅僅只是一種用來表示樣式的語言嗎?當(dāng)然不是!CSS就已被安全研究人員運用于滲透測試當(dāng)中。使用屬性選擇器和iFrame,并通過CSS注入來竊取敏感數(shù)據(jù)的方法。但由于該方法需要iFrame,而大多數(shù)主流站點都不允許該操作,因此這種攻擊方法并不實用。這里為大家詳細介紹一種不需要iframe且只需10秒,就能為獲得CSRF token的方法。

          一、背景

          CSS屬性選擇器開發(fā)者可以根據(jù)屬性標簽的值匹配子字符串來選擇元素。 這些屬性值選擇器可以做以下操作:

          • 如果字符串以子字符串開頭,則匹配
          • 如果字符串以子字符串結(jié)尾,則匹配
          • 如果字符串在任何地方包含子字符串,則匹配

          屬性選擇器能讓開發(fā)人員查詢單個屬性的頁面HTML標記,并且匹配它們的值。一個實際的用例是將以“https://example.com”開頭的所有href屬性變?yōu)槟撤N特定的顏色。而在實際環(huán)境中,一些敏感信息會被存放在HTML標簽內(nèi)。在大多數(shù)情況下CSRF token都是以這種方式被存儲的:即隱藏表單的屬性值中。

          可以將CSS選擇器與表單中的屬性進行匹配,并根據(jù)表單是否與起始字符串匹配,加載一個外部資源,例如背景圖片,來嘗試猜測屬性的起始字母。通過這種方式,攻擊者可以進行逐字猜解并最終獲取到完整的敏感數(shù)值。想要解決這個問題受害者可以在其服務(wù)器實施內(nèi)容安全策略(CSP),防止攻擊者從外部加載CSS代碼。

          二、無 iFrames

          要做到無iFrame,使用一種方法:創(chuàng)建一個彈窗,然后在設(shè)置計時器后更改彈出窗口的位置。使用這種方仍然可以加載受害者的CSS,不再依賴于受害者是否允許iFrame。因為最初的彈出是通過用戶事件觸發(fā)的,沒有被瀏覽器阻止。為了強制重載,在CSS注入間彈出一個虛擬窗口,如下:

          但由于CSRF是針對客戶端的攻擊,因此如果能想出一種不需要服務(wù)器的方法,那么就可以節(jié)省大量的開銷和簡化操作。為了接收客戶端加載資源,可以利用Service Workers來攔截和讀取請求數(shù)據(jù)。Service Workers目前只適用于同源請求,在演示中受害者和攻擊者頁面已處于同一源上。

          不久后,chrome很可能會合并這個實驗性的功能,允許Service Workers攔截跨域請求。這樣,就可以確保在客戶端的攻擊100%的執(zhí)行,并強制用戶在10秒內(nèi)點擊鏈接執(zhí)行CSRF攻擊,演示如下:

          三、Demo

          如上所述,因為不想運行一個web服務(wù)器,所以使用service workers攔截和模擬服務(wù)器端組件。目前,該演示只適用于Chrome瀏覽器。首先創(chuàng)建了一個易受攻擊的目標,它存在一個基于DOM的CSS注入漏洞,并在頁面放置了一個敏感token。再對腳本標簽添加了一些保護措施,對左尖括號和右尖括號進行了編碼。

          接下來將強制加載受害者的CSS,并且使用上述方法,可一次竊?。ú陆猓┮粋€敏感字符。在接收端,定義一個攔截請求的service worker,并通過post-message將它們發(fā)送回域,然后將token存儲在本地存儲中以供后續(xù)使用。你也可以想象一個后端Web服務(wù)器,通過Web套接字或輪詢將CSRF token回發(fā)給攻擊者域。

          如果你的瀏覽器支持的話,只需點擊打開頁面任意位置,你將看到CSRF token將逐一被猜解出來。

          四、結(jié)束語

          反射型CSS注入實際上比存儲型CSS注入更致命,因為存儲型CSS注入需要一個服務(wù)器在受害者渲染之前來更新CSS。一段時間以來,CSS注入在嚴重程度上來回變化。過去IE瀏覽器是允許用戶在CSS中執(zhí)行Javascript代碼的。這個演示也從某種程度上表明了CSS注入,以及渲染不受信任的CSS仍會導(dǎo)致嚴重的安全問題。所以在設(shè)計軟件一定要測試,才能及時發(fā)現(xiàn)和修復(fù)各種漏洞。

          果你們公司的業(yè)務(wù)是用PHP語言開發(fā)的,那么使用的環(huán)境十有八九就是LNMP,在日常的運維工作中,占到9成以上的故障是遇到性能問題。

          你可能會想,我們的業(yè)務(wù)運行的好好的,為啥平白無故就出現(xiàn)性能問題?原因有太多可能,比如代碼改動、異常訪問、網(wǎng)絡(luò)波動、服務(wù)器硬件故障等等。

          引起性能問題的原因有這么多,那如何定位呢?本章就來給大家介紹一個性能追蹤的方法,這個方法在我運維職業(yè)生涯里屢試不爽,幫了我不少大忙。

          < 1 > PHP-FPM的slow log

          如果你所運維的網(wǎng)站或者應(yīng)用為PHP的,那我相信你一定對LAMP或者LNMP不陌生。我主張使用LNMP,原因無他,就一點 -- 我們可以通過slow log很方便地追蹤到問題點。先來看配置方法吧。

          1)編輯配置文件(假設(shè)php安裝路徑為/usr/local/php, 配置文件路徑/usr/local/php/etc/php-fpm.conf)

          # vim /usr/local/php/etc/php-fpm.conf #更改或增加兩行內(nèi)容
          slowlog=/data/logs/php-slow.log
          request_slowlog_timeout=2
          

          說明:slowlog定義日志路徑和名字,request_slowlog_timeout定義超時時間,單位秒,即一個php腳本執(zhí)行時間超過了該時間,則會記錄日志。

          2)重啟php-fpm服務(wù)

          具體重啟命令,根據(jù)你自己的環(huán)境來決定。配置文件修改后,不重啟或者不重載服務(wù)是不生效的。

          3)測試

          在測試站點里新建一個test.php文件,寫入如下內(nèi)容:

          <?php
           echo "1";
           sleep (5);
           echo "2";
          

          然后在瀏覽器里或者使用curl命令去訪問

          # curl http://ip/test.php
          

          4)結(jié)果分析

          訪問test.php時,我們能感覺到它短暫卡死,大概5秒后出現(xiàn)結(jié)果。此時到/data/logs/php-slow.log里查看,有如下內(nèi)容:

          [pool www] pid 6368
          script_filename=/data/wwwroot/aminglinux.cc/test.php
          [0x00007ff8c821f090] sleep() /data/wwwroot/aminglinux.cc/test.php:3
          

          這個slow log,不僅可以記錄哪一個文件慢,而且也可以記錄具體哪一行的什么函數(shù)。有了它,一旦網(wǎng)站訪問卡頓,我們就非常方便地找到問題點了。

          < 2 > 線上生產(chǎn)環(huán)境演示案例

          問題描述:網(wǎng)站訪問變卡頓了,不是不能訪問,而是變慢了。

          解決過程:

          1)登錄服務(wù)器查看負載,結(jié)果不到1,并不高

          2)vmstat 1查看發(fā)現(xiàn)r列時不時出現(xiàn)不高于5的數(shù)字,說明有些進程比較忙

          3)用top命令查看,php-fpm進程排在前面

          4)查看slow log,結(jié)果如下:
          [29-1月-2019 16:54:59] [pool www] pid 20287
          script_filename=/data/wwwroot/www.example.com/redirect.php
          [0x00000000031d83c0] mysql_query() /data/wwwroot/www.example.com/include/db_mysql.class.php:84
          [0x00000000031d6bb0] query() /data/wwwroot/www.example.com/redirect.php:105
          [29-1月-2019 16:54:59] [pool www] pid 23066
          script_filename=/data/wwwroot/www.example.com/redirect.php
          [0x000000000319b5a0] mysql_query() /data/wwwroot/www.example.com/include/db_mysql.class.php:84
          [0x0000000003199d90] query() /data/wwwroot/www.example.com/redirect.php:122
          

          通過slow log發(fā)現(xiàn)是redirect.php里面有查詢數(shù)據(jù)庫的操作慢導(dǎo)致網(wǎng)站訪問卡頓。所以,還需要登錄數(shù)據(jù)庫服務(wù)器近一步分析為什么MySQL查詢慢,這個就涉及到了MySQL的慢查詢?nèi)罩荆唧w詳細的操作我不再闡述。

          < 3 > 使用Xdebug+Webgrind

          如果網(wǎng)站跑在了LAMP環(huán)境中,就無法使用php-fpm的slow log了,那如何分析瓶頸點?沒關(guān)系你還可以使用這個Xdebug+Webgrind,其中Xdebug是一個開放源代碼的PHP程序調(diào)試器(即一個Debug工具),可以用來跟蹤,調(diào)試和分析PHP程序的運行狀況。Webgrind是一個網(wǎng)頁版的性能分析工具,它的主要作用就是分析Xdebug生成的cachegrind文件,以一種界面友好詳盡的方式來展示性能數(shù)據(jù)。

          Xdebug安裝

          Xdebug官方網(wǎng)站:http://xdebug.org/.

          1)下載源碼

          如果你用的PHP版本較高,建議下載最新版本

          # wget https://xdebug.org/files/xdebug-2.7.0beta1.tgz
          2)編譯安裝
          

          # tar zxf xdebug-2.7.0beta1.tgz

          # cd xdebug-2.7.0beta1

          # /usr/local/php-fpm/bin/phpize

          # ./configure --with-php-config=/usr/local/php-fpm/bin/php-config

          # make && make install

          3)配置

          # vi /usr/local/php-fpm/etc/php.ini #在最后面增加
          [xdebug]
          zend_extension=xdebug.so
          xdebug.trace_output_dir=/tmp/xdebug
          xdebug.profiler_output_dir=/tmp/xdebug
          xdebug.profiler_enable=1
          xdebug.profiler_enable_trigger=1
          4)檢查
          # /usr/local/php-fpm/bin/php -m |grep -C 1 Xdebug
          [Zend Modules]
          Xdebug
          5)創(chuàng)建Xdebug目錄
          

          # mkdir /tmp/xdebug

          # chmod 777 !$

          6)重啟php-fpm或者apache服務(wù)

          因為修改了php.ini配置文件,需要重啟對應(yīng)的服務(wù),才可以生效,我這里用的是php-fpm

          # /etc/init.d/php-fpm restart
          

          Webgrind安裝

          1)下載

          Webgrind官方github地址https://github.com/jokkedk/webgrind

          # wget https://codeload.github.com/jokkedk/webgrind/zip/v1.5.0
          # mv v1.5.0 webgrind-1.5.0.zip
          # unzip webgrind-1.5.0.zip
          

          2)為Webgrind配置站點

          Webgrind其實是一個PHP網(wǎng)站程序,需要為其設(shè)置一個虛擬主機,我用的是LNMP環(huán)境,所以需要配置Nginx, 當(dāng)然你也可以直接把webgrind程序目錄丟到一個站點內(nèi),通過二級目錄去訪問。下面是我的Nginx虛擬主機配置文件內(nèi)容:

          server {

          listen 80;

          server_name webgrind.aminglinux.cc;

          root /data/wwwroot/webgrind;

          index index.html index.htm index.php;

          location ~ \.php$ {

          fastcgi_pass 127.0.0.1:9001;

          fastcgi_index index.php;

          fastcgi_param SCRIPT_FILENAME /data/wwwroot/webgrind$fastcgi_script_name;

          include fastcgi_params;

          }

          3)配置webgrind

          假如新配置的虛擬主機目錄為/data/wwwroot/webgrind

          # mv webgrind-1.5.0/* /data/wwwroot/webgrind/

          # vim config.php #修改$storeageDir和$profileDir

          static $storageDir='/tmp/xdebug';

          static $profilerDir='/tmp/xdebug';

          4)性能追蹤

          首先訪問要追蹤性能的PHP網(wǎng)站,然后查看/tmp/xdebug目錄下是否生成文件

          # ls /tmp/xdebug/

          cachegrind.out.11442 cachegrind.out.11443 cachegrind.out.11443.091dcb

          我的已經(jīng)生成3個文件,然后在瀏覽器訪問即可,不過需要你先選擇腳本文件(右上角),點擊update之后才會出現(xiàn)分析內(nèi)容。

          5)圖形顯示

          我們還可以把PHP代碼中的各個函數(shù)調(diào)用關(guān)系以圖形的形式展現(xiàn)出來,這樣更加直觀。前提是需要python和dot兩個工具的支持,python默認機器上自帶,但是dot需要安裝

          # yum install -y graphviz
          

          點擊右上角的“show call graph”按鈕,就會出現(xiàn)漂亮的調(diào)用圖

          關(guān)注微信公眾號:安徽思恒信息科技有限公司,了解更多技術(shù)內(nèi)容……


          主站蜘蛛池模板: 日韩一区二区a片免费观看| 一本一道波多野结衣AV一区| 无码一区二区三区免费| 另类国产精品一区二区| 亚洲一区二区三区首页| 亚洲第一区在线观看| 亚洲国产成人久久一区二区三区 | 国产激情无码一区二区| 精品成人一区二区三区免费视频| 无码国产精品一区二区免费3p| 狠狠做深爱婷婷综合一区 | 一区二区三区精密机械| 亚洲国产精品一区二区久久| 黑人大战亚洲人精品一区| 精品人妻少妇一区二区三区| 精品一区二区三区3d动漫| 国产91精品一区| 国产亚洲福利一区二区免费看| eeuss鲁片一区二区三区| 一区二区三区在线观看| 亚洲性色精品一区二区在线| 亚洲性色精品一区二区在线| 一本大道在线无码一区| 亚洲高清一区二区三区电影 | 亚洲福利视频一区| 日韩精品在线一区二区| 成人精品视频一区二区三区不卡 | 日韩精品视频一区二区三区| 国产另类TS人妖一区二区| 2014AV天堂无码一区| 精品亚洲综合在线第一区| 久久久久人妻一区精品性色av | 日本一区中文字幕日本一二三区视频 | 国产成人久久一区二区不卡三区 | 久久国产香蕉一区精品| 国产一区三区三区| 末成年女AV片一区二区| 欧美日韩一区二区成人午夜电影| 日本一区免费电影| 国产午夜精品免费一区二区三区 | 在线精品日韩一区二区三区|