關於php以及web開發的基礎知識

1.PHP是什麼

php中文全稱’超文本預處理器’,是服務器端動態腳本語言,相對於java來說是一種弱類型的語言

2.CGI

CGI:通用網關接口(Common Gateway Interface),是Web 服務器和請求處理程序之間傳輸數據的一種標準或協議,只要遵循這個標準就可以用任何動態語言實現處理程序.
通常所說的CGI是指CGI程序,即實現了CGI接口標準的程序.

3.CGI程序的工作方式

Web服務器一般只處理靜態文件請求(如 jpg、htm、html),如果碰到一個動態腳本請求(如php),web服務器主進程,就派生出一個新的進程來啓動CGI程序,也就是將動態腳本請求交給CGI程序來處理。啓動CGI程序需要一個過程,比如,讀取配置文件,加載擴展等。CGI程序啓動後,就會解析動態腳本,然後將結果返回給Web服務器,最後Web服務器再將結果返回給客戶端,剛纔派生的進程也會隨之關閉。
這樣,每次用戶請求動態腳本,Web服務器都要重新派生一個新進程,去啓動CGI程序,由CGI程序來處理動態腳本,處理完後進程隨之關閉。
這種工作方式的效率是非常低下的。

4.FastCGI

FastCGI是cgi的升級模式,它將CGI解釋器進程保持在內存中並因此獲得高效的性能。
FastCGI進程管理器需要單獨啓動,啓動FastCGI後,會生成一個FastCGI主進程和多個子進程(子進程其實就是CGI解釋器進程)。
當客戶端請求Web服務器上的動態腳本時,Web服務器會將動態腳本通過TCP協議交給FastCGI主進程,FastCGI主進程根據情況,安排一個空閒的子進程來解析動態腳本,處理完成後將結果返回給Web服務器,Web服務器再將結果返回給客戶端。該客戶端請求處理完畢後,FastCGI子進程並不會隨之關閉,而是繼續等待主進程安排工作任務。

5.PHP-FPM

PHP-FPM,FastCGI進程管理器(FastCGI Process Manager),提供了更好的PHP進程管理方式,可以有效控制內存和進程、可以平滑重載PHP配置等。
php-fpm作爲一種fast-cgi進程管理服務,會監聽端口,一般默認監聽9000端口,並且是監聽本機.

6.PHP-FPM的作用

php-fpm用於接收和處理辣子web服務器(如nginx)的請求,當它接到請求後創建一個主進程(通常以操作系統中跟用戶的身份運行),控制何時以及如何把http請求轉發給一個或多個子進程處理.
php-fpm還控制着什麼時候創建(處理web應用更多的流量)和銷燬(子進程運行時間太久或不在需要了)php子進程.php-fpm進程池中的每個進程存在的時間都比單個http請求長,可以處理10,50,100,500或更多的http請求(在php的配置文件中進行修改)

7.php工作流程

  1. 在瀏覽器中輸入url,回車向服務器發送請求.
  2. 服務器接收請求進行判斷.一下部分在cgi的工作流程中有提到過,如果請求的是靜態資源如htm,jpg等由服務器直接返回,如果是請求的是php請求那麼將請求轉發給php-fpm.
  3. php-fpm再將請求交給嵌入了php解釋器的某個php子進程處理,php進程找到相應的php腳本後,讀取腳本,吧php腳本編譯成操作碼(或字節碼)格式,然後執行編譯得到的操作碼,動態生成相應
  4. 把http響應發給niginx或apache服務器返回客戶端
  5. 客戶端瀏覽器渲染結果

以上流程是我不斷補充的結果,個人認爲相對於其他描述來說更爲詳細,比如更大多數人將第3部描述爲"php解析腳本"
該流程可概述爲:

瀏覽器發送請求 ->
服務器端判斷返回靜態資源或轉發給php解釋器 ->
php解釋器生成相應 ->
客戶端渲染結果

8.udp和tcp的區別(個人學習總結並不完整)

udp :
用戶數據報協議 ,udp信息在ip頭的後面,有頭部,端口號,DATA,
在udp的頭部中包括了校驗和 , 用於檢查數據是否正確,檢查的方式是把數據進行求和進行對比,如"89,11,33,32,58,41"求和得到364,而heard頭裏面同樣存儲了校驗和364.
udp中的校驗和以16位形式機型存儲,如果超過了可以表示的最大值,那麼高位數被丟掉,保留低位
當對方接到數據包,重複求和的操作,如果雙方得到一致的結果,那麼數據正確,如果不一致那麼說明數據不完整
udp無法得知數據是否到達,而且不修復,一旦發現接到的數據存在問題則直接丟掉

tcp:
由上我們得知udp的傳輸不保證數據的完整性,而tcp/ip可以認爲是udp的高級形式
tcp發送的數據包有序列號

tcp要求接收方接到並且校驗後給發送方一個確認碼代表收到 ,確認碼簡稱ACK,得知上一個到達發送下一個,如果麼有收到確認碼則再次發送

可能存在特殊的情況,如確認碼可能很久以後纔到達或在傳輸過程中丟失了,tcp在收到重複的確認碼時會刪掉 (這一段筆記只記錄了關鍵字但是因爲時間關係印象模糊了,後續會返回去再找找) ,tcp可以併發

確認碼的成功率和來回的時間可以用於推測網路擁塞
tcp用這個調整同時發送的包的數量,解決擁塞的問題
tcp可以處理亂序和數據包丟失問題,丟了就重發,還可以根據網絡擁擠情況自動調整傳輸率

由上我們可以得出一般講解中的udp與tcp的區別

  1. udp無連接,tcp面向連接

  2. UDP程序結構較簡單

  3. UDP具有較好的實時性,工作效率比TCP高

  4. 流模式(TCP)與數據報模式(UDP);

  5. TCP比UDP更安全,TCP保證數據正確性,UDP可能丟包

  6. TCP保證數據順序,UDP不保證

9.udp與tcp的應用場景

udp:
因爲不保證數據的準確到達,所以應用的對數據完整性要求較低的場景 如果直播,語音,視頻通話
. 我們經常在視頻通話的過程中發現視頻的清晰度忽然降低一般就是因爲有一些數據丟失造成的

TCP:
因爲安全性可靠數據完整,用於文件的傳輸 等等

10.HTTP協議與HTTPS的區別

  1. http是超文本傳輸協議,信息是明文傳輸,https是具有安全性的ssl加密傳輸協議
  2. http和https使用的是完全不同的連接方式,端口也不一樣,前者80 或者443
  3. http連接很簡單,是無狀態的。https協議是由ssl+http協議構建的可進行加密傳輸,身份認證的網絡協議。

11.echo、print、print_r 的區別

echo是php語句,無返回值.
priint,priint_r是函數,有返回值
print() 只能打印出簡單類型變量的值
print_r() 可以打印出複雜類型的變量值(如數組,對象)
echo 輸出一個或多個字符串

12.session和cookie的區別

session與cookie相同:跨頁面不誇用戶,
session與cookie不相同:
1.session可以存儲任意類型的數據,但cookie只能存儲字符串
2.cookie生產在服務端、存儲在客戶端
session產生在服務單、存儲在服務端

13.對於大流量網站,採用什麼方法解決訪問量問題?

  1. 確認服務器的硬件是否足夠支持當前的流量
  2. 優化數據庫的訪問
  3. 禁止外部的盜鏈
  4. 控制大文件的下載
  5. 使用不同主機分流主要流量
  6. 使用流量分析統計軟件

14.獲取客戶端與服務器端ip

$_SERVER[‘REMOTE_ADDR’]:瀏覽當前頁面的用戶計算機的ip地址 //無代理情況下
$_SERVER[‘HTTP_X_FORWARDED_FOR’]:客戶端的ip //有代理情況下
$_SERVER[‘HTTP_CLIENT_IP’]:客戶端的ip

15.語句include和require的區別

除了處理失敗的方式不同之外。require 在出錯時產生 E_COMPILE_ERROR 級別的錯誤。換句話說將導致腳本中止而 include 只產生警告(E_WARNING),腳本會繼續運行。
require不能用在文件的中間

16.http請求返回狀態碼

4xx - 客戶端錯誤
  發生錯誤,客戶端似乎有問題。
  例如,客戶端請求不存在的頁面,客戶端未提供有效的身份驗證信息。
5xx - 服務器錯誤
  服務器由於遇到錯誤而不能完成該請求。

400 請求無效
401 未授權
403 請求被禁止
404 請求資源不存在
405 請求資源被禁止
406 無法接受
407 要求代理身份驗證
500 Internal Server Error 服務端源代碼錯誤
600 源站沒有返回響應頭部,只返回實現內容

17.有一個網頁地址, 比如PHP開發資源網主頁: http://www.phpres.com/index.html,如何得到它的內容?

echo file_get_contents(“http://www.phpres.com/index.html”);

18.PHP中error_reporting的作用

設置錯誤級別與錯誤信息回報

19.面向對象編程的三個特性

封裝、繼承、多態

20.防止SQL注入

  1. 一般使用 addslashes 函數
    addslashes 函數在制定的預定義字符前添加反斜槓
  2. 對字段和密碼MD5加密處理
  3. pdo預處理過濾處理

21.實現中文字串截取無亂碼的方法

mb_substr()

22.請舉例說明在你的開發過程中用什麼方法來加快頁面的加載速度

1 要用到服務器資源時纔打開
2 及時關閉服務器資源,
3 數據庫添加索引,
4 頁面可生成靜態,圖片等大文件單獨服務器。
5 使用代碼優化工具啦

23.is_writeable作用

判斷一個文件是否可寫

24.php的數據類型

1.標量類型:string , int , boolean , float
2.複合類型:array . object
3.特殊類型:resource , null

25.如何在PHP中定義常量

define (“Newconstant”, 30);

26.MVC模式

MVC由Model(模型), View(視圖)和Controller(控制器)組成
Model:數據信息存取層。
View:view層負責將應用的數據以特定的方式展現在界面上。
Controller:通常控制器負責從視圖讀取數據,控制用戶輸入,並向模型發送數據。

27.試述isset()和empty()的區別

isset() 測試變量是否存在 empty() 測試變量是否爲空

28.php常見的設計模式

  1. 單例模式: 保證一個類僅有一個實例,並提供一個訪問他的全局訪問點例如框架中的數據庫連接

  2. 簡單工廠模式: 它具有創建對象的某些方法,可以使用工廠類創建對象,而不直接使用 new。例如初始化數據庫的時候會用到,比如MySQL,MSSQL

  3. 策略模式: 針對一組算法,將每一個算法封裝到具有共同接口的獨立的類中,例如進入個人主頁時,根據瀏覽者的不同,給予不同的顯示與操作

  4. 註冊模式: 提供了在程序中有條理的存放並管理一組全局對象 (object),例如ZF框架中的Zend_Registry::set

  5. 適配器模式: 將不同接口適配成統一的API接口,例如數據操作有mysql、mysqli、pdo等,可利用適配器模式統一接口

  6. 觀察者模式: 一個對象通過添加一個方法使本身變得可觀察。當可觀察的對象更改時,它會將消息發送到已註冊的觀察者。例如實現實現消息推送

  7. 裝飾器模式: 不修改原類代碼和繼承的情況下動態擴展類的功能,例如框架的每個Controller文件會提供before和after方法

  8. 迭代器模式: 提供一個方法順序訪問一個聚合對象中各個元素,在PHP中將繼承 Iterator 類

  9. 原型模式: 實現了一個原型接口,該接口用於創建當前對象的克隆。當直接創建對象的代價比較大時,則採用這種模式。例如,一個對象需要在一個高代價的數據庫操作之後被創建。

29.session的運行機制

session創建時,是否會在服務端記錄一個cookie?cookie裏面的內容是什麼?
session機制是一種服務器端的機制,服務器使用一種類似於散列表的結構(也可能就是使用散列表)來保存信息。
當程序需要爲某個客戶端的請求創建一個session的時候,服務器首先檢查這個客戶端的請求裏是否已包含了一個session標識-稱爲sessionid,如果已包含一個sessionid則說明以前已經爲此客戶端創建過session,服務器就按照sessionid把這個session檢索出來使用(如果檢索不到,可能會新建一個),如果客戶端請求不包含sessionid,則爲此客戶端創建一個session並且生成一個與此session相關聯的sessionid,sessionid的值應該是一個既不會重複,又不容易被找到規律以仿造的字符串,這個sessionid將被在本次響應中返回給客戶端保存。_
保存這個sessionid的方式可以採用cookie,這樣在交互過程中瀏覽器可以自動的按照規則把這個標識發給服務器。一般這個cookie的名字都是類似於SEEESIONID。r
由於cookie可以被人爲的禁止,必須有其他機制以便在cookie被禁止時仍然能夠把sessionid傳遞迴服務器。經常被使用的一種技術叫做URL重寫,就是把sessionid直接附加在URL路徑的後面,附加方式也有兩種,一種是作爲URL路徑的附加信息,表現形式爲http://……/xxx;SEEESIONID=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764比
另一種是作爲查詢字符串附加在URL後面,表現形式爲http://……/xxx?SEEESIONID=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764參
爲了在整個交互過程中始終保持狀態,就必須在每個客戶端可能請求的路徑後面都包含這個SEEESIONID。

30.Cookie的原理及使用

Cookie是網站保存在瀏覽器客戶端的信息,也就是說保存在訪客的機器裏的變量,一般隨着HTTP頭髮送到服務器端。在Cookie生效之後及失效之前,客戶每次發出頁面請求的時候(包括PHP頁面和靜態html頁面),都會把Cookie一塊發送到服務器,只要我們針對它進行相應的處理,就可以實現變量”追隨”。

31.三次握手(three-way handshaking)

原理:

  1. 發送端首先發送一個帶有SYN(synchronize)標誌地數據包給接收方。

  2. 接收方接收後,回傳一個帶有SYN/ACK標誌的數據包傳遞確認信息,表示我收到了。

  3. 最後,發送方再回傳一個帶有ACK標誌的數據包,代表我知道了,表示’握手‘結束。

通俗的說法

  1. Client:嘿,李四,是我,聽到了嗎?

  2. Server:我聽到了,你能聽到我的嗎?

  3. Client:好的,我們互相都能聽到對方的話,我們的通信可以開始了。

32.四次揮手(Four-Way-Wavehand)

  1. 第一次揮手:Client發送一個FIN,用來關閉Client到Server的數據傳送,Client進入FIN_WAIT_1狀態。

  2. 第二次揮手:Server收到FIN後,發送一個ACK給Client,確認序號爲收到序號+1(與SYN相同,一個FIN佔用一個序號),Server進入CLOSE_WAIT狀態。

  3. 第三次揮手:Server發送一個FIN,用來關閉Server到Client的數據傳送,Server進入LAST_ACK狀態。

  4. 第四次揮手:Client收到FIN後,Client進入TIME_WAIT狀態,接着發送一個ACK給Server,確認序號爲收到序號+1,Server進入CLOSED狀態,完成四次揮手

通俗的說法

  1. Client:我所有東西都說完了

  2. Server:我已經全部聽到了,但是等等我,我還沒說完

  3. Server:好了,我已經說完了

  4. Client:好的,那我們的通信結束l

33.apache和niginx的區別

apache :

  1. apache 的 rewrite 比 nginx 強大,在 rewrite 頻繁的情況下,用 apache

  2. apache 發展到現在,模塊超多,基本想到的都可以找到

  3. apache 更爲成熟,少 bug ,nginx 的 bug 相對較多

  4. apache 超穩定

  5. apache 對 PHP 支持比較簡單,nginx 需要配合其他後端用

  6. apache 在處理動態請求有優勢,nginx 在這方面是雞肋,一般動態請求要 apache 去做,nginx 適合靜態和反向。

  7. apache 仍然是目前的主流,擁有豐富的特性,成熟的技術和開發社區

niginx:

  1. 輕量級,採用 C 進行編寫,同樣的 web 服務,會佔用更少的內存及資源

  2. 抗併發,nginx 以 epoll and kqueue 作爲開發模型,處理請求是異步非阻塞的,負載能力比 apache 高很多,而 apache 則是阻塞型的。在高併發下 nginx 能保持低資源低消耗高性能 ,而 apache 在 PHP 處理慢或者前端壓力很大的情況下,很容易出現進程數飆升,從而拒絕服務的現象。

  3. nginx 處理靜態文件好,靜態處理性能比 apache 高三倍以上

  4. nginx 的設計高度模塊化,編寫模塊相對簡單

  5. nginx 配置簡潔,正則配置讓很多事情變得簡單,而且改完配置能使用 -t 測試配置有沒有問題,apache 配置複雜 ,重啓的時候發現配置出錯了,會很崩潰

  6. nginx 作爲負載均衡服務器,支持 7 層負載均衡

  7. nginx 本身就是一個反向代理服務器,而且可以作爲非常優秀的郵件代理服務器

  8. 啓動特別容易, 並且幾乎可以做到 7*24 不間斷運行,即使運行數個月也不需要重新啓動,還能夠不間斷服務的情況下進行軟件版本的升級

34.常用魔術方法

  1. __construct、__destruct

__construct 構造方法,當一個對象被創建時調用此方法,好處是可以使構造方法有一個獨一無二的名稱,無論它所在的類的名稱是什麼,這樣你在改變類的名稱時,就不需要改變構造方法的名稱
__destruct 析構方法,PHP將在對象被銷燬前(即從內存中清除前)調用這個方法
默認情況下,PHP僅僅釋放對象屬性所佔用的內存並銷燬對象相關的資源.,析構函數允許你在使用一個對象之後執行任意代碼來清除內存,當PHP決定你的腳本不再與對象相關時,析構函數將被調用.,在一個函數的命名空間內,這會發生在函數return的時候,對於全局變量,這發生於腳本結束的時候,如果你想明確地銷燬一個對象,你可以給指向該對象的變量分配任何其它值,通常將變量賦值勤爲NULL或者調用unset。

  1. __get、__set

這兩個方法是爲在類和他們的父類中沒有聲明的屬性而設計的

__get( $property ) 當調用一個未定義的屬性時訪問此方法
__set( $property, $value ) 給一個未定義的屬性賦值時調用

  1. __isset、__unset

__isset( $property ) 當在一個未定義的屬性上調用isset()函數時調用此方法
__unset( $property ) 當在一個未定義的屬性上調用unset()函數時調用此方法
與__get方法和__set方法相同,這裏的沒有聲明包括訪問控制爲proteced,private的屬性(即沒有權限訪問的屬性)

  1. __call

__call( $method, $arg_array ) 當調用一個未定義(包括沒有權限訪問)的方法是調用此方法

  1. __callStatic

它的工作方式類似於 __call() 魔術方法,__callStatic() 是爲了處理靜態方法調用,PHP5.3.0以上版本有效,PHP 確實加強了對 __callStatic() 方法的定義;它必須是公共的,並且必須被聲明爲靜態的。同樣,__call() 魔術方法必須被定義爲公共的,所有其他魔術方法都必須如此。

  1. __autoload
    __autoload 函數,它會在試圖使用尚未被定義的類時自動調用。通過調用此函數,腳本引擎在 PHP 出錯失敗前有了最後一機會加載所需的類。

原文鏈接:https://blog.csdn.net/a_jie_2016_05/article/details/88554615

35.抽象類和接口

  1. 抽象類中可以有非抽象的方法而接口中只能夠有抽象的方法!
  2. 一個類可以繼承多個接口,而一個類只能繼承一個抽象類!
  3. 接口的使用方式通過implements關鍵字進行,抽象類則是通過繼承extends關鍵字進行!
  4. 接口中不可以聲明成員變量(包括類靜態變量),但是可以聲明類常量。抽象類中可以聲明各種類型成員變量,實現數據的封裝。(另Java接口中的成員變量都要聲明爲public static final類型)
  5. 接口沒有構造函數,抽象類可以有構造函數。
  6. 接口中的方法默認都是public類型的,而抽象類中的方法可以使用private,protected,public來修飾。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章