是什麼 ,在什麼地方用,注意什麼,特點,如何配置(相關關聯),出現的問題(缺點),引出解決辦法或另一種方法
+-
PHP:Hypertext Preprocessor
一、get和post的區別
1. get是從服務器上獲取數據,post是向服務器傳送數據。
2. get是把參數數據隊列加到提交表單的ACTION屬性所指的URL中,值和表單內各個字段一一對應,在URL中可以看到。post是通過HTTP
post機制,將表單內各個字段與其內容放置在HTML HEADER內一起傳送到ACTION屬性所指的URL地址。用戶看不到這個過程。
3. 對於get方式,服務器端用Request.QueryString獲取變量的值,對於post方式,服務器端用Request.Form獲取提交的數據。
4. get傳送的數據量較小,不能大於2KB。post傳送的數據量較大,一般被默認爲不受限制。但理論上,IIS4中最大量爲80KB,IIS5中爲100KB。
5. get安全性非常低,post安全性較高。但是執行效率卻比Post方法好。
二、session與cookie的區別
1、cookie數據存放在客戶的瀏覽器上,session數據放在服務器上。
2、cookie不是很安全,別人可以分析存放在本地的COOKIE並進行COOKIE欺騙
考慮到安全應當使用session。
3、session會在一定時間內保存在服務器上。當訪問增多,會比較佔用你服務器的性能
考慮到減輕服務器性能方面,應當使用COOKIE。
4、單個cookie保存的數據不能超過4K,很多瀏覽器都限制一個站點最多保存20個cookie。
5、所以個人建議:
將登陸信息等重要信息存放爲SESSION
其他信息如果需要保留,可以放在COOKIE中
6、cookie有5個參數(名,值,有效期,服務器路徑,域名,規定是否通過安全的 HTTPS 連接來傳輸 cookie)
三、數據庫中的事務是什麼
事務是作爲一個邏輯單元執行的一系列操作,一個邏輯工作單元必須有四個屬性,稱爲 ACID(原子性、一致性、隔離性和持久性)屬性,只有這樣才能成爲一個事務:
原子性
事務必須是原子工作單元;對於其數據修改,要麼全都執行,要麼全都不執行。
一致性
事務在完成時,必須使所有的數據都保持一致狀態。在相關數據庫中,所有規則都必須應用於事務的修改,以保持所有數據的完整性。
事務結束時,所有的內部數據結構(如 B 樹索引或雙向鏈表)都必須是正確的。
隔離性
由併發事務所作的修改必須與任何其它併發事務所作的修改隔離。事務查看數據時數據所處的狀態,要麼是另一併發事務修改它之前的狀態,
要麼是另一事務修改它之後的狀態,事務不會查看中間狀態的數據。這稱爲可串行性,因爲它能夠重新裝載起始數據,
並且重播一系列事務,以使數據結束時的狀態與原始事務執行的狀態相同。
持久性
事務完成之後,它對於系統的影響是永久性的。該修改即使出現系統故障也將一直保持。
begin 開始一個事務
rollback事務回滾
commit事務確認
注:rollback和commit不能並列使用,當同時使用時,只有前面一個生效
MYSQL默認是自動提交的
可以通過set autocommit=0 來設置 禁止自動提交
可以通過set autocommit=1 來設置 開啓自動提交
四、PHP打印 日期
<?php
echo date('Y-m-d H:i:s', strtotime('-1 day')); //前一天
echo '<br>';
echo date('Y-m-d H:i:s', strtotime('-1 week'));//前一週
echo '<br>';
echo date('Y-m-d H:i:s');//現在時間
echo '<br>';
echo date('Y-m-d H:i:s', strtotime('next Monday'));//下一個星期一
echo '<br>';
echo date('Y-m-d H:i:s', strtotime('last Monday'));//上一個星期一
echo “現在的時間是:” .date(h:i:sa); //a - 小寫的上午和午後(am 或 pm)
?>
/* 時間差 */
<?php
$startdate = strtotime("2012-01-01");
$enddate = strtotime("2012-02-14");
$days = round(($enddate-$startdate) / 86400)+1;
echo $days;
?>
先用5升的水壺裝滿水,倒入六升的水壺中.六升的水壺中還空出 一升水體積.
2.再用把盛五升水水壺裝滿水,倒入容積六升的水壺中,壺中還剩4升水.
3.把容積六升水中的水倒掉,再把容積五升的水壺倒滿水,把這些水倒入容積六升的壺中,容積五升的水壺中這時剛好剩下三升水.
五、能夠使Html和PHP分離開的模板
smarty ,phptal ,template、 PHPlib Template 、 FastTemplate
Smarty , Dwoo , TinyButStrong , Template Lite , Savant , phemplate , XTemplate
echo $a[0]; echo $a{0}; echo chr(ord($a));
七、echo(),print(),print_r()的區別
echo
可以一次輸出多個值,多個值之間用逗號分隔。echo是語言結構(language construct),而並不是真正的函數,因此不能作爲表達式的一部分使用。
print()
函數print()打印一個值(它的參數),如果字符串成功顯示則返回true,否則返回false。
printf()
printf()源於C語言中的printf()。該函數輸出格式化的字符串。
print_r()和var_dump()
print_r()可以把字符串和數字簡單地打印出來,而數組則以括起來的鍵和值得列表形式顯示,並以Array開頭
有兩個參數,第二個參數爲true的時候,返回值,而不顯示。
八、PHP可以和sql server/oracle等數據庫連接嗎
Oracle
<?php
$dbconn=oci_connect("你的賬號","你的密碼","你的數據庫名稱");//請把中文件設置爲你的值;
$stmt=oci_parse($dbconn, "select * from scott.hallo");
oci_execute($stmt, OCI_DEFAULT);
echo $conn."----selecting\n\n";
while (oci_fetch($stmt))
{
echo ($conn."[".oci_result($stmt, "TEST")."]\n\n");
}
echo ($conn . "----done\n\n");
?>
九、php5權限控制修飾符
public(公共), private(私用), protected(繼承)
九點一:魔術方法
__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep, __wakeup, __toString, __set_state, __clone and __autoload
1、__get、__set
這兩個方法是爲在類和他們的父類中沒有聲明的屬性而設計的
__get( $property ) 當調用一個未定義的屬性時訪問此方法
__set( $property, $value ) 給一個未定義的屬性賦值時調用
這裏的沒有聲明包括當使用對象調用時,訪問控制爲proteced,private的屬性(即沒有權限訪問的屬性)
2、__isset、__unset
__isset( $property ) 當在一個未定義的屬性上調用isset()函數時調用此方法
__unset( $property ) 當在一個未定義的屬性上調用unset()函數時調用此方法
與__get方法和__set方法相同,這裏的沒有聲明包括當使用對象調用時,訪問控制爲proteced,private的屬性(即沒有權限訪問的屬性)
3、__call
__call( $method, $arg_array ) 當調用一個未定義的方法是調用此訪求
這裏的未定義的方法包括沒有權限訪問的方法
4、__autoload
__autoload 函數,它會在試圖使用尚未被定義的類時自動調用。通過調用此函數,腳本引擎在 PHP 出錯失敗前有了最後一個機會加載所需的類。
注意: 在 __autoload 函數中拋出的異常不能被 catch 語句塊捕獲並導致致命錯誤。
5、__construct、__destruct
__construct 構造方法,當一個對象創建時調用此方法,使用此方法的好處是:可以使構造方法有一個獨一無二的名稱,無論它所在的類的名稱是什麼.這樣你在改變類的名稱時,就不需要改變構造方法的名稱
__destruct 析構方法,PHP將在對象被銷燬前(即從內存中清除前)調用這個方法
默認情況下,PHP僅僅釋放對象屬性所佔用的內存並銷燬對象相關的資源.
析構函數允許你在使用一個對象之後執行任意代碼來清除內存.
當PHP決定你的腳本不再與對象相關時,析構函數將被調用.
在一個函數的命名空間內,這會發生在函數return的時候.
對於全局變量,這發生於腳本結束的時候.如果你想明確地銷燬一個對象,你可以給指向該對象的變量分配任何其它值.通常將變量賦值勤爲NULL或者調用unset.
6、__clone
PHP5中的對象賦值是使用的引用賦值,如果想複製一個對象則需要使用clone方法,在調用此方法是對象會自動調用__clone魔術方法
如果在對象複製需要執行某些初始化操作,可以在__clone方法實現
7、__toString
__toString方法在將一個對象轉化成字符串時自動調用,比如使用echo打印對象時
如果類沒有實現此方法,則無法通過echo打印對象,否則會顯示:Catchable fatal error: Object of class test could not be converted to string in
此方法必須返回一個字符串
在PHP 5.2.0之前,__toString方法只有結合使用echo() 或 print()時
才能生效。PHP 5.2.0之後,則可以在任何字符串環境生效(例如通過printf(),使用%s修飾符),但
不能用於非字符串環境(如使用%d修飾符)。從PHP 5.2.0,如果將一個未定義__toString方法的對象
轉換爲字符串,會報出一個E_RECOVERABLE_ERROR錯誤。
8、__sleep、__wakeup
__sleep 串行化的時候用
__wakeup 反串行化的時候調用
serialize() 檢查類中是否有魔術名稱 __sleep 的函數。如果這樣,該函數將在任何序列化之前運行。它可以清除對象並應該返回一個包含有該對象中應被序列化的所有變量名的數組。
使用 __sleep 的目的是關閉對象可能具有的任何數據庫連接,提交等待中的數據或進行類似的清除任務。此外,如果有非常大的對象而並不需要完全儲存下來時此函數也很有用。
相反地,unserialize() 檢查具有魔術名稱 __wakeup 的函數的存在。如果存在,此函數可以重建對象可能具有的任何資源。
使用 __wakeup 的目的是重建在序列化中可能丟失的任何數據庫連接以及處理其它重新初始化的任務。
9、__set_state
當調用var_export()時,這個靜態 方法會被調用(自PHP 5.1.0起有效)。
本方法的唯一參數是一個數組,其中包含按array(’property’ => value, …)格式排列的類屬性。
10、__invoke
當嘗試以調用函數的方式調用一個對象時,__invoke 方法會被自動調用。
PHP5.3.0以上版本有效
11、__callStatic
它的工作方式類似於 __call() 魔術方法,__callStatic() 是爲了處理靜態方法調用,
PHP5.3.0以上版本有效
PHP 確實加強了對 __callStatic() 方法的定義;它必須是公共的,並且必須被聲明爲靜態的。同樣,__call() 魔術方法必須被定義爲公共的,所有其他魔術方法都必須如此。
十、寫一個函數,儘可能高效的,從一個標準 url 裏取出文件的擴展名
例如: http://www.sina.com.cn/abc/de/fg.
public string GetExtended(string url)
{
return url.Substring(url.LastIndexOf('.'));
}
例如: http://www.sina.com.cn/abc/de/fg.php?id=1 需要取出 php 或 .php
function getExt($url){
$arr = parse_url($url);
$file = basename($arr['path']);
$ext = explode(".",$file);
return $ext[1];
}
十一、php5的構造函數和析構函數是?
構造函數:__construct() 在類實例化對象的同時執行該函數;析構函數:distruct() 在類實例化的對象銷燬時執行。
十二、寫一個函數,算出兩個文件的相對路徑
如 $a = '/a/b/c/d/e.php';
$b = '/a/b/12/34/c.php';
計算出 $b 相對於 $a 的相對路徑應該是 ../../c/d將()添上
function getRelativePath($a, $b) {
$returnPath = array(dirname($b));
$arrA = explode('/', $a);
$arrB = explode('/', $returnPath[0]);
for ($n = 1, $len = count($arrB); $n < $len; $n++) {
if ($arrA[$n] != $arrB[$n]) {
break;
}
}
if ($len - $n > 0) {
$returnPath = array_merge($returnPath, array_fill(1, $len - $n, '..'));
}
$returnPath = array_merge($returnPath, array_slice($arrA, $n));
return implode('/', $returnPath);
}
遍歷文件夾及文件:
function show($dirs){
$dir = opendir($dirs);
echo "<ul>";
while($f=readdir($dir)){
if($f!='.' && $f!='..'){
echo "<li>{$f}</li>";
if(is_dir("$dirs/{$f}")){
show("$dirs/{$f}");
}
}
}
echo "</ul>";
}
getFiles("C:\web\HTML5Upload");
//getFiles($_SERVER['DOCUMENT_ROOT']);
十三、如何 實現網站靜態化
使用php的ob緩存實現頁面靜態化 引出ob緩存,一鍵生成時過期時間一致。
方法一:使用現成的插件,比如:ISAPI_Rewrite、IIS Rewrite、Apache
HTTP服務器的mod_rewrite等,它們都是基於正則表達式解析器開發的重寫引擎。它們的使用方法查看它們自帶的幫助即可。
方法二:自己寫的代碼實現動態網頁靜態化,方法也有好幾種:
1、創建FSO對象,利用此對象將所需的內容動態創建到文件中生成HTML頁面;
2、利用模板技術,將模板中特殊代碼的值替換爲從表單或是數據庫字段中接受過來的值 生成HTML文件;
3、使用Server.Transfer轉換技術,
方法三:使用HttpWebRequest請求客戶端的方式,獲取返回資源,生成靜態頁面。一般這樣只需要獲取網頁內容即可,其它資源可放置在服務器上,自動加載。(注:此方法缺點明顯,需要大量更改匹配URL,建議慎用)
方法四:在asp中有IhttpModule接口。Ihttpmodule可以簡單理解爲一個可以在執行像.aspx,或者mvc中control/action前,添加我們自定義的操作的東西。
分類:服務器負載
確認服務器硬件是否足夠支持當前的流量。
優化數據庫訪問。
禁止外部的盜鏈
控制大文件的下載
使用不同主機分流主要流量
使用流量分析統計軟件。
客戶端 $_SERVER[REMOTE_ADDR]
服務器 $_SERVER[SERVER_ADDR]
十六、include和require 的區別
include和require 都能把另外一個文件包含到當前文件中
include引入文件的時候,如果碰到錯誤,會給出提示,並繼續運行下邊的代碼。
require引入文件的時候,如果碰到錯誤,會給出提示,並停止運行下邊的代碼。
十七、如何修改session的生存時間
一:在php.ini 中設置 session.gc_maxlifetime
= 1440 //默認時間
二:代碼實現
$lifeTime = 24 * 3600; // 保存一天
session_set_cookie_params($lifeTime);
session_start();
$html = file_get_contents('http://www.baidu.com/');
使用URL獲取內容
使用sinope
十九、在HTTP 1.0中,狀態碼401的含義是什麼;如果返回“找不到文件”的提示,用header函數
狀態碼401的含義是:未授權(Unauthorized)
如果返回“找不到文件”的提示 用:Header("http/1.0 403 Forbidden");
(一)、1字開頭:這一類型 的狀態碼,代表請求已被接受,需要繼續處理。這類響應是臨時響應,史包含狀態行和某些可選 的響應頭信息,並以空行結束。
100 發出請求
101 切換協議
(二)、2字開頭的狀態碼,請求已 成功被 器 接收、理解
200 交易成功
201 已創建
202 已接受
203 非權威性信息
204 無內存
205 重置內容
206 部分內容
207 多狀態
(三)、3字開頭:需要客戶端採取進一步的操作才能完成請求。通常,這些狀態碼用來重定向,後續的請求地址在本次響應的location域中指明
301 永久移除
302 臨時移除
(四)、4字開頭:
1、語義有誤,當前請求無法被服務器理解。除非進行修改,否則客戶端不應該重複提交這個請求
2、請求參數有誤
400 錯誤請求
401訪問被拒絕
402 【爲將來可能的需求而預留的】
403禁止訪問
404 沒有發現文件
(五)、代表了服務器在處理請求的過程中有錯誤或者異常狀態發生,也有可能是服務器意識到以的軟硬件資源無法完成對請求的處理,除非這是一個HEAD請求,澡是服務器應當包含一個解釋當前錯誤狀態以及這個善是臨時的還是永久的解釋 信息實體。瀏覽器應當向用戶展示任何在當前響應中被 包含的實體
500 內部服務器錯誤
501 頁眉值指定了未實現的配置
502 無效響應
503 服務器不可用
504 網關超時
505 服務器不支持
二十、談談對MVC的認識
MVC(Model-View-Controller),即把一個應用的輸入、處理、輸出流程按照Model、View、Controller的方式進行分離,這樣一個應用被分成三個層——模型層、視圖層、控制層。
視圖(View):代表用戶交互界面,MVC設計模式對於視圖的處理是限於視圖上數據的採集和處理,以及用戶的請求,而不包括在視圖上的業務流程的處理。
模型(Model):業務流程/狀態的處理以及業務規則的制定。業務流程的處理過程對其它層來說是黑箱操作,模型接受視圖請求的數據,並返回最終的處理結果。業務模型的設計可以說是MVC的核心。
控制(Controller):可以理解爲從用戶接收請求, 將模型與視圖匹配在一起,共同完成用戶的請求,但是它卻不做任何的數據處理。
二十一、php設計模式
1、單例模式 2、工廠模式 3、觀察者模式 4、命令鏈模式 5、策略模式
1、 單例模式:
a) 一個類在整個應用中,只有一個對象實例的設計模式
b) 類必須自行創建這個實例
c) 必須自行向整個系統提供這個實例
三私:私有靜態成員變量、構造函數、克隆函數
一公:公共的靜態方法
2、工廠模式
可以根據輸入的參數或者應用程序配置的不同一創建一種專門用來實例化並返回其它類的實例的類
3、觀察者模式
觀察者模式提供了組件之間緊密耦合的另一種方法。
該模式:一個對象通過添加一個方法(該方法允許另一個對象,即觀察者註冊自己)全本身變得可觀察。當可觀察的對象更改時,它會將消息發送到已註冊的觀察者。這些觀察者使用該信息執行的操作與可觀察的對象無關。
二十二、HTTP & HTTPS
http ()超文本傳輸協議 |
https (Secure Hypertext Transfer Protocol)安全超文本傳輸協議 |
1、 效率更高 2、 使用端口80來和TCP/IP進行通信, 信息明文傳輸
|
1、 安全性更高 2、 端口443,使用SSL作爲HTTP應用層的子層(SSL使用40位關鍵字作爲RC4流的加密算法 SSL:安全保密協議,運行在TCP/IP層之上、應用層之下 3、 使用https需要到CA申請一個用於證明服務器用途類型的證書 |
|
|
1、 http的URL以http://開頭,而https的URL以https://開頭 2、 http是不安全的,而https是安全的 3、 http標準端口80,面https©的標準商品443 4、 在OSI網絡模型中,http工作於應用層,https工作在傳輸層 5、 http無法加密,而https對傳輸的數據進行加密 6、 http無需證書,而https需要CA機構wosign頒發的SSL證書 |
二十三、MySql字符類型
二十四、《索引》
(1) 唯一索引:唯一的任務就是加快訪問速度,唯一索引的目的是爲了避免重複的數據。
(2) 普通索引:普通索引允許被索引的數據列包含重複的值。優點1、簡化MySQL對這個索引的管理工作,使工作更有效率。2、MySQL會對新插入的數據自動檢測是否有重複的值。 大多時候創建唯一索引的目的往往是爲了避免重複的數據,而不是提高訪問速度。
(3) 主索引 :即主鍵索引,關鍵字PRIMARY
(4) 外鍵索引:外鍵約束
(5) 複合索引:索引可以覆蓋多列數據。如 INDEX(columnA,columnB)。這種索引的特點是MySQL可以有選擇的使用這樣的一個索引,比如:INDEX(A,B,C)可以當做A或(A,B )的索引來使用,但不能當做B或(B,C)來使用。
(6) 索引的長度:在爲CHAR和VARCHAR類型的數據列定義索引時,可以把索引的長度限制爲一個給定的字符個數,這個數字必須小於這個字段所允許的最大字符個數。
(7) 全文索引:針對內容開頭的字符進行檢索操作,如果檢索的內容是多個字段構成、數據量較大,全文索引是必要的。註解:InnoDB數據表不支持全文索引。
二十五、索引的優缺點
1、優點:
a)可以保證數據庫表中每一行的數據的唯一性
b)可以大大加快數據的索引速度
c)加速表與表之間的連接,物別是在實現數據的參考完事性方面特別有意義
d)在使用分組和排序子句進行數據檢索時,同樣可以顯著減少查詢中分組和排序的時間
f)通過使用索引,可以在時間查詢的過程中,使用優化隱藏器,提高系統的性能
2、缺點:
a) 創建索引和維護索引要耗費時間,這種時間隨着數據量的增加而增加
b) 索引需要佔物理空間,除了數據表佔用數據空間之外,每一個索引還要佔用一定的物理空間,如果需要建立聚簇索引,那麼需要佔用的空間會更大
c) 以表中的數據進行增、刪、改的時候,索引也要動態的維護,這就降低了整數的維護速度
4、 建立索引的原則
a) 在經常需要搜索的列上,可以加快搜索的速度
b) 在作爲主鍵的列上,強制該列的唯一性和組織表中數據的排列結構
c) 在經常用在連接的列上,這些列主要是一外鍵,可以加快連接的速度
d) 在經經常需要根據範圍進行搜索的列上創建索引,國爲索引已經排序,其指定的範圍是連續的
e) 在經常需要排序的列上,國爲索引已經排序,這樣井底可以利用索引的排序,加快排序井底時間
f) 在經常使用在where子句中的列上,加快條件的判斷速度
二十六、Myisam 和 Innodb優缺點
|
MyISAM |
InnoDB |
構成上的區別: |
每個MyISAM在磁盤上存儲成三個文件。第一個文件的名字以表的名字開始,擴展名指出文件類型。 數據文件的擴展名爲 .MYD(MYData) 索引文件的擴展名是 .MYI(MYIndex) |
基於磁盤的資源是InnoDB表空間數據文件和它的日誌文件,InnoDB 表的大小隻受限於操作系統文件的大小,一般爲 2GB |
事務處理上方面: |
MyISAM類型的表強調的是性能,其執行數度比InnoDB類型更快,但是不提供事務支持 |
InnoDB提供事務支持事務, 外部鍵等高級數據庫功能 |
SELECT UPDATE,INSERT,Delete操作 |
MyISAM表格可以被壓縮, 而且它們支持全文搜索 不支持熱備,不支持事務
執行大量的SELECT,MyISAM是更好的選擇 |
1.如果你的數據執行大量的INSERT或UPDATE,出於性能方面的考慮,應該使用InnoDB表 3. LOAD TABLE FROM MASTER操作對InnoDB是不起作用的,解決方法是首先把InnoDB表改成MyISAM表,導入數據後再改成InnoDB表,但是對於使用的額外的InnoDB特性(例如外鍵)的表不適用 |
對AUTO_INCREMENT的操作 |
每表一個AUTO_INCREMEN列的內部處理。 |
如果你爲一個表指定AUTO_INCREMENT列,在數據詞典裏的InnoDB表句柄包含一個名爲自動增長計數器的計數器,它被用在爲該列賦新值。 |
表的具體行數 |
select count(*) from table,MyISAM只要簡單的讀出保存好的行數,注意的是,當count(*)語句包含 where條件時,兩種表的操作是一樣的 |
InnoDB 中不保存表的具體行數,也就是說,執行select count(*) from table時,InnoDB要掃描一遍整個表來計算有多少行 InnoDB不支持full text類型的索引。
|
鎖 |
表鎖 |
提供行鎖(locking on row level),提供與 Oracle 類型一致的不加鎖讀取(non-locking read in |
存儲 |
在 MyISAM 中,表被存放在單獨的文件中 |
InnoDB 是一套放在 MySQL 後臺的完整數據庫系統,InnoDB 有它自己的緩衝池,能緩衝數據和索引,InnoDB 還把數據和索引存放在表空間裏面,可能包含好幾個文件,這和 MyISAM 表完全不同,InnoDB 表的大小隻受限於操作系統文件的大小 |
備份 擴展 |
MyISAM不支持熱備 MyIASM是IASM表的新版本,有如下擴展: 1) 二進制層次的可移植性。 2) NULL列索引 3) 對變長行比ISAM表有更少的碎片 4) 支持大文件 5) 更好的索引壓縮 6) 更好的鍵嗎統計分 7) 更好和更快的auto_increment處理 |
InnoDB支持熱備,但是需要專門的工具 |
二十七、Mysql備份
(一)備份的目的
a)做災難恢復:對損壞的數據進行恢復和還原
b)需求改變: 因需求改變而需要把數據還原到改變以前
c)測試: 測試新功能是否可用
(二) 備份需要考慮的問題
a)可以容忍多長時間的數據
b)恢復數據要在多長時間內完成
c)恢復的時候是否需要持續提供服務
d)恢復的對像,是整個庫,多個表,還是單個庫,單個表
(三)備份的類型
1、根據是否需要數據庫離線
a) 冷備(cold backup):需要關mysql服務,讀寫請求均不允許狀態下進行
b) 溫備(warm backup):服務在線,但只支持讀請求,不允許寫請求
c) 熱備(hot backup):備份的同時,業務不受影響
注:
1) 這種類型的數據取決於業務的需求,而不是備份工具
2) MyISAM不支持熱備,InnoDB支持熱備,但是需要專門的工具
2、根據要備份的數據集合的範圍
a)完全備份:full backup,備份全部字符集
b)增量備份:incremental backup 上次完全備份或增量備份以來改變了的數據,不能單獨使用,要藉助完全備份
c)差異備份:differential backup 上次完全備份以來改變了的數據
建議恢復策略:
1) 完全 + 增量 + 二進制日誌
2) 完全 + 差異 + 二進制日誌
3、根據備份數據或文件
a)物理備份:直接備份數據文件
優點:備份和恢復都比較簡單,能夠跨myslq的版本,恢復速度快,屬於文件系統級別的
建議:不要假設備份一定可用,要測試
Mysql>check talbes; 檢測表是否可用
b)邏輯備份:備份表中的數據和代碼
優點:恢復簡單、備份的結果爲ASCII文件,可以編輯。與存儲引擎無關,可以通過網絡備份和恢復
缺點:備份或恢復都需要mysql 服務器進程參與,備份結果佔據更多的空間,浮點數可能會丟失精度,還原後,縮影需要重建
(四)、備份的對象
1、數據
2、配置文件
3、代碼:存儲過程、存儲函數、觸發器
4、os相關的配置文件
5、複製相關的配置
6、二進制日誌
(五)、備份和恢復的實現
參閱:http://www.jb51.net/article/41570.htm
二十八、Redis五種常用數據類型
1、 String
2、 Hash
3、 List
4、 Set
5、 Sort Set
6、 Pub/Sub
7、 transation
二十九、序列化和反序列化
1、 序列化:serialize()
2、 反序列化:unserialize()
三十、PHP 五種視覺的設計模式
· 工廠模式:
1、 是一種類,具有創建對象的某些方法
· 單元素模式:
2、 資源是獨佔的,有且只有一個此類型的資源。
· 觀察者模式:
3、 觀察者模式提供了避免組件之間耦合的另一種方法,該模式非常簡單:一個對象通過添加方法(該方法允許另一個對象,即觀察者自己)使本身變得可觀察。當可觀察的對象更改時,它會將消息發送到已註冊的觀察者。
· 命令鏈模式:
4、 以鬆散耦合主題爲基礎,發送消息、命令和請求,或通過一組處理程序發送任意內容。每個處理程序都會自行判斷自己能否處理請求,如果可以,該請求被處理,進程停止。
· 策略模式:
5、 此算法是從複雜類提取的,因而可以方便地替換。
三十一、mb_substr
1、$str = "中文截取無亂碼";
/*中文截取
mb_substr($str,$start,$lenth,$encoding);
$str :需要截取的字符串
$start :開始截取的位置
$length :要截取的字數
$encoding :字符編碼,utf-8,GB2312,GBK
*/
echo mb_substr($str,2,3,'utf8');
/*獲取中文長度
$str :要計算長度的字符串
$encoding :字符編碼,utf-8,GB2312,GBK
*/
echo mb_strlen($str,'utf-8');
此外可參考 http://blog.sina.com.cn/s/blog_8edc37a801016l7r.html
substr($str,int start[,int length]):從$str中strat位置開始提取[length長度的字符串]
str_replace(search,replace,$str):從$str中查找search用replace來替換
str_split($str,len):把$str按len長度進行分割返回數組
strtolower($str) 字符串轉換爲小寫
strtoupper($str) 字符串轉換爲大寫
ucfirst($str) 將函數的第一個字符轉換爲大寫
ucwords($str) 將每個單詞的首字母轉換爲大寫
2、實現字符串反轉:strrev($str);
3、php中將utf8轉換成bgk :iconv(“utf8”,”gbk”,$str)
4、截取.
strstr()函數的作用是:返回一個字符串在另一個字符串中首次出現的位置到後者末尾的子字符串(大小寫敏感)。
三十二、支付寶支付的三種方式
1、擔保交易 2、即時到賬 3、擔保交易和即時到賬
負載均衡配置:1、權重 2、輪循(或加權輪循) 3、hash(分部IP段) 4、隨機
三十三、冒泡排序
三十四、PHP版本差別
PHP5.2 以前:autoload, PDO 和 MySQLi, 類型約束 、JSON 支持
PHP5.3:棄用的功能,匿名函數,新增魔術方法,命名空間,後期靜態綁定Heredoc 和 Nowdoc, const, 三元運算符,Phar
PHP5.4:Short Open Tag, 數組簡寫形式,Traits, 內置 Web 服務器,細節修改
PHP5.5:yield, list() 用於 foreach, 細節修改
PHP5.6: 常量增強,可變函數參數,命名空間增強
三十五、Apache與Nginx的優缺點
|
nginx |
apache |
資源、性能 |
佔用更少的內存和資源、抗併發 安裝、配置都比較簡單 靜態處理性能比Apache高3倍以上 負載均衡能國比apache高 |
rewrite功能強大,相對穩定 |
處理請求 |
異步非阻塞 |
阻塞型 |
進程 |
異步 |
同步多進程模型,一個連接對應一個進程 |
|
|
|
三十六、對稱加密 與 非對稱加密
1、 對稱加密與解密使用的是同樣的密鑰,但由於需要將密鑰在網絡傳輸,所以安全性不高
2、 非對稱加密使用了一對密鑰,公鑰與私鑰,把以安全性高,但加密與解密速度慢
3、 解決的辦法是將對稱加密的密鑰使用非對稱加密的公鑰進行加密,然後發送出去,接收方使用私鑰進行解密得到對稱加密的密鑰,然後雙方可以使用對稱加密來進行溝通
(一)對稱加密(Symmetric Cryptography)
對稱加密是最快速、最簡單的一種加密方式,加密(encryption)與解密(decryption)用的是同樣的密鑰(secret key),這種方法在密碼學中叫做對稱加密算法。
(二)非對稱加密(Asymmetric Cryptography)
允許在不安全的媒體上的通訊雙方交換信息,安全地達成一致的密鑰,這就是“公開密鑰系統”。相對於“對稱加密算法”這種方法也叫做“非對稱加密算法”。
三十七、數據庫三大範式
1、 第一範式指:數據庫表的每一列都是不可分割的基本數據項
2、 第二範式指:要求數據庫表中的每個實例或行必須可以被唯一區分
3、 第三範式指:要求一個數據表中不包含已存在的非主關鍵字的信息
三十八、ob系列函數
1、ob_start() //打開緩衝區,所有輸出的信息不直接發送到瀏覽器,而是保存在緩衝區裏面
2、ob_clean() //刪除內部緩衝區的內容,不關閉緩衝區(不輸出)
3、ob_end_clean() //刪除內部緩衝區的內容,關閉緩衝區(不輸出)
4、ob_get_clean() //返回內部緩衝區的內容,關閉緩衝區。【相當於執行 ob_get_contents() and ob_end_clean()】
5、ob_flush() //發送內部緩衝區的內容到瀏覽器,刪除緩衝區的內容,不關閉緩衝區。
6、ob_end_flush() //發送內部緩衝區的內容到瀏覽器,刪除緩衝區的內容,關閉緩衝區
7、ob_get_flush() //返回內部緩衝區的內容,並關閉緩衝區的內容
8、ob_get_contents()//返回緩衝區的內容,不輸出
9、ob_get_length() //返回內部緩衝區的長度,如果緩衝區未被激活,該函數返回 false
三十九、驗證email
/^([0-9A-Za-z\\-_\\.]+)@([0-9a-z]+\\.[a-z]{2,3}(\\.[a-z]{2})?)$/i
^[_.0-9a-z-]+@([0-9a-z][0-9a-z-]+.)+[a-z]{2,3}$
四十、接口安全
簽名(隨機數)
其它一些常規的: 對稱加密、非對稱加密(公鑰與私鑰),md5
四十一、redis 與 memcache
1.Redis中,並不是所有的數據都一直存儲在內存中的,這是和Memcached相比一個最大的區別。
memecache 把數據全部存在內存之中,斷電後會掛掉,數據不能超過內存大小
redis有部份存在硬盤上,這樣能保證數據的持久性。
災難恢復--memcache掛掉後,數據不可恢復; redis數據丟失後可以通過aof恢復
2.Redis不僅僅支持簡單的k/v類型的數據,同時還提供list,set,hash等數據結構的存儲。
3.Redis支持數據的備份,即master-slave模式的數據備份。
4.Redis支持數據的持久化,可以將內存中的數據保持在磁盤中,重啓的時候可以再次加載進行使用。
四十二、php傳值與傳引用的區別:
傳值:將實參賦值給形參,形參的改變,不會影響到實參的值。
傳引用:真正以地址的方式傳遞參數,傳遞以後,實參與形參都是同一個對象,只是名字不同而已,形參的改變,會影響到實參的值。
四十三、Nginx 負載均衡
TCP/IP
1) 鏈路層
2) 網絡層
3) 運輸層:兩臺主機上的應用程序提供 端 到 端 的通信
4) 應用層:處理特定的應用程序細節
Telnet 運程登錄
FTP 文件傳輸協議
SMTP 簡單的郵件傳送協議
SNMP 簡單網絡管理協議
四十四、Linux基本命令,目錄結構
arch 顯示機器的處理器架構(1)
文件搜索
locate \*.ps 尋找以 '.ps' 結尾的文件 - 先運行 'updatedb' 命令
掛載一個文件系統
1,linux裏把文件/etc/aaa中的內容追加到/usr/bbb中的內容的後面
df -hl 查看磁盤剩餘空間 df -h 查看每個根路徑的分區大小 du -sh [目錄名] 返回該目錄的大小 du -sm [文件夾] 返回該文件夾總M數 |
關機 (系統的關機、重啓以及登出 )
文件和目錄
磁盤空間 下載、解壓
1)對於.tar結尾的文件
2)對於.gz結尾的文件
# zip all.zip *.jpg 下載命令 wget + 空格 + 要下載文件的url路徑 ===================================== Shell 腳本: 必須以 #!/bin/sh 開頭 簡單例子:判斷這個目錄下有沒有文件(File)
#!/bin/bash |
++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1、桌面共享:使用 Trim view
2、不清楚的東西先不要反問(反問要看準時機)
3、不以技術 論 技術
4、以本身的優勢平衡不足
5、掛羊頭賣狗肉(如果問到想法)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++
四十五、
1、 TCP/IP,YII/TP 執行原理
TCP (傳輸控制協議) - 應用程序之間通信
IP (網際協議) -計算機之間的通信
YII可參考(MVC) http://blog.csdn.net/wzllai/article/details/7658802
2、負載均衡和http(幾層協議配置)【lvs四層,nginx七層,web一般四臺】
3、數據怎麼優化
索引優化
1、 索引優化原則
數據類型越小越好,越簡單越好,避免空值
2、 索引順序:最左原則
例如:index(a,b) 當 where 中有 a 或 a、b 時索引會被使用,只有 b 時不會被使用。(不同的數據庫或不同的版本可能會有不同)
3、 聚集索引、B+樹、主鍵
一個表只能有一個聚集索引,聚集索引以B+樹形式存儲,所以,聚集索引的規則決定了索引存放的物理順序(聚集索引對需要最快速縮小查詢訪問及最快速進行字段排序時,非常有用),需要特別注意
查詢優化
1、 儘量避免表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引
2、 儘量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描
select id from t where num is null
可以在num上設置默認值0,確保表中num列沒有null值,然後這樣查詢:
select id from t where num=0
3、儘量避免在 where 子句中使用 != 或 <> 或 or 操作符,否則將放棄引擎而進行全表掃描
4、頁面空值,輸出php,404,是什麼原因,解決辦法是什麼
空值:錯誤被屏蔽、可查看log日誌
404 :rewrite規則
輸出php:apache未開啓
開啓apache的錯誤級別
【 error_reporting(0)//禁用錯誤報告;
error_reporting(E_ALL)//報告所有錯誤;
error_reporting(E_ERROR | E_WARNING | E_PARSE);//報告運行時錯誤;
】
error_reporting(2047):
E_ALL能從不良編碼實踐到無害提示到出錯的所有信息.E_ALL 對於開發過程來說有點太細,因爲它在屏幕上爲一些小事(例如變量未初始化)也顯示提示,會搞糟瀏覽器的輸出
所以不建議使用2047,最好把默認值改爲:error_reporting = E_ALL & E_NOTICE
5、單點登錄原理、路由規則
6、memcache緩存什麼數據
一、經常被讀取並且實時性要求不強可以等到自動過期的數據。例如網站首頁最新文章列表、某某排行等數據。
二、經常被讀取並且實時性要求強的數據。比如用戶的好友列表,用戶文章列表,用戶閱讀記錄等。
三、統計類緩存,比如文章瀏覽數、網站PV等。
四、活躍用戶的基本信息或者某篇熱門文章。
五、session數據
四十六、PHP 全局變量 - 超全局變量
$GLOBALS
$_SERVER
$_REQUEST
$_POST
$_GET
$_FILES
$_ENV
$_COOKIE
$_SESSION
四十七、數組相關
1、向數組中插入一個值用什麼函數
如果用 array_push() 來給數組增加一個單元,還不如用 $array[] = ,因爲這樣沒有調用函數的額外負擔
如果第一個參數不是數組,array_push() 將發出一條警告。這和 $var[] 的行爲不同,後者會新建一個數組
例如:
<?php
$stack = array("orange", "banana");
array_push($stack, "apple", "raspberry");
print_r($stack);
?>
結果:Array( [0] => orange [1] => banana [2] => apple [3] => raspberry )
l array_pop() - 將數組最後一個單元彈出(出棧)
l array_shift() - 將數組開頭的單元移出數組
l array_unshift() - 在數組開頭插入一個或多個單元
l 字符串分割爲數組:explode(在哪裏分割字符串,要分割的字符串,返回的數組元素的最大數目《可選》)
l array_merge_recursive()函數與array_merge()相同
· array_merge()會覆蓋前面存在的鍵/值對
· array_merge_recursive()將把兩個值合併在一起
l array_combine()函數會得到一個新數組,它由一組提交的鍵和對應的值組成
n 兩個輸入數組必須大小相同,不能爲空
l array_slice() 拆分數組
n offset 爲正值時,拆分將從距數組開頭的offset 位置開始;
n 如果offset 爲負值,則拆分從距數組末尾的offset 位置開始。
n 如果省略了可選參數length,則拆分將從offset 開始,一直到數組的最後一個元素
n 果給出了length 且爲正數,則會在距數組開頭的offset+length 位置結束
n 負數相反
l array_splice()函數會刪除數組中從offset開始到offset+length 結束的所有元素
l array_intersect()函數返回一個保留了鍵的數組,這個數組只由第一個數組中出現的且在其他每個輸入數組中都出現的值組成(取交集)
l array_intersect_assoc()與array_intersect()基本相同,只不過他在比較中還考慮了數組的鍵
l array_diff()返回出現在第一個數組中但其他輸入數組中沒有的值。這個功能與array_intersect()相反(差集)
l array_diff_assoc()與array_diff()基本相同,只是它在比較時還考慮了數組的鍵
l array_key_exists()查找指定的鍵值,成功返回 true 失敗 返回 false
l shuffle() 函數
<?php
$my_array = array("red","green","blue","yellow","purple");
shuffle($my_array);
print_r($my_array);
?>
Array ( [0] => purple [1] => yellow [2] => red [3] => green [4] => blue )
2、 將一個數組打散
str_split(string $string,[, int $split_length = 1 ])該函數將一個字符串轉化爲一個數組 ,第一個參數爲需要轉換的字符串,第二個可選參數爲數組每個元素的長度,缺省值爲1 如下例
<?php
$str = "Hello Friend";
$arr1 = str_split($str);
$arr2 = str_split($str,
3);
print_r($arr1);
print_r($arr2);
?>
Array ( [0] => H [1] => e [2] => l [3] => l [4] => o [5] => [6] => F [7] => r [8] => I
[9] => e [10]=> n [11] => d )
Array ( [0] => Hel [1] => lo [2] => Fri [3] => end )
3、一個sql中有兩個索引字段,運行時會先執行哪個。如何查看索引?
顯示一個表所有索引的SQL語句是:
show index from 數據庫名.表名
看某表某一列上的索引使用下面的SQL語句:
show index from 數據庫名.表名 where column_name like '列名'
敏感詞過濾:如果有一個六千字的詞庫,怎麼去匹配一個 100字的短語,並把其中的敏感詞替換成xx
Mysql主從配置用的是內網還是公網
棧存儲、堆存儲,REST接口
四十八、Mysql 每天 1億條數據的增量如何優化、分頁。 主從同步原理,不同步的解決方案?
四十九、魔術方法
1。__construct()
實例化對象時被調用,當__construct和以類名爲函數名的函數同時存在時,__construct將被調用,另一個不被調用。
2。__destruct()
當刪除一個對象或對象操作終止時被調用。
3。__call()
對象調用某個方法,若方法存在,則直接調用;若不存在,則會去調用__call函數。
4。__get()
讀取一個對象的屬性時,若屬性存在,則直接返回屬性值;若不存在,則會調用__get函數。
5。__set()
設置一個對象的屬性時,若屬性存在,則直接賦值;若不存在,則會調用__set函數。
6。__toString()
打印一個對象的時被調用。如echo $obj;或print $obj;
7。__clone()
克隆對象時被調用。如:$t=new Test();$t1=clone $t;
8。__sleep()
serialize之前被調用。若對象比較大,想刪減一點東東再序列化,可考慮一下此函數。
9。__wakeup()
unserialize時被調用,做些對象的初始化工作。
10。__isset()
檢測一個對象的屬性是否存在時被調用。如:isset($c->name)。
11。__unset()
unset一個對象的屬性時被調用。如:unset($c->name)。
12。__set_state()
調用var_export時,被調用。用__set_state的返回值做爲var_export的返回值。
13。__autoload()
實例化一個對象時,如果對應的類不存在,則該方法被調用。
魔術常量:
1。__LINE__
返回文件中的當前行號。
2。__FILE__
返回文件的完整路徑和文件名。如果用在包含文件中,則返回包含文件名。自 PHP 4.0.2 起,__FILE__ 總是包含一個絕對路徑,而在此之前的版本有時會包含一個相對路徑。
3。__FUNCTION__
返回函數名稱(PHP 4.3.0 新加)。自 PHP 5 起本常量返回該函數被定義時的名字(區分大小寫)。在 PHP
4 中該值總是小寫字母的。
4。__CLASS__
返回類的名稱(PHP 4.3.0 新加)。自 PHP 5 起本常量返回該類被定義時的名字(區分大小寫)。在 PHP
4 中該值總是小寫字母的。
5。__METHOD__
返回類的方法名(PHP 5.0.0 新加)。返回該方法被定義時的名字(區分大小寫)。
五十、JQuery
$.ajax({
type: "POST",
url: "some.php",
data: "name=John&location=Boston",
success: function(msg){
alert( "Data Saved: " + msg );
}
});