1. session和cookie的區(qū)別
1、cookie數(shù)據(jù)存放在客戶的瀏覽器上,session數(shù)據(jù)放在服務(wù)器上。
2、cookie不是很安全,別人可以分析存放在本地的COOKIE并進(jìn)行COOKIE欺騙 考慮到安全應(yīng)當(dāng)使用session。
3、session會(huì)在一定時(shí)間內(nèi)保存在服務(wù)器上。當(dāng)訪問增多,會(huì)比較占用你服務(wù)器的性能 考慮到減輕服務(wù)器性能方面,應(yīng)當(dāng)使用COOKIE。
4、單個(gè)cookie保存的數(shù)據(jù)不能超過4K,很多瀏覽器都限制一個(gè)站點(diǎn)最多保存20個(gè)cookie。
5、所以個(gè)人建議: 將登陸信息等重要信息存放為SESSION 其他信息如果需要保留,可以放在COOKIE中
2. MySQL優(yōu)化
當(dāng)MySQL數(shù)據(jù)量達(dá)到千萬級(jí),并發(fā)量大時(shí),即使是簡(jiǎn)單的查詢,MySQL的相應(yīng)也會(huì)變慢,可以通過以下方式處理:
- 更換性能更好的硬件,加大內(nèi)存
- 增加MySQL查詢緩存與key緩存
- 使用第三方如memcache等NoSQL技術(shù)
- 數(shù)據(jù)庫進(jìn)行分區(qū)處理,減小表大小
- 其他:避免SQL語句中使用NULL判斷避免Where中使用Mysql函數(shù)操作避免使用like ‘%%’形式數(shù)據(jù)比較兩邊類型要一致,如 name=1,如果name為字符類型將進(jìn)行全表搜索在常用的列上增加索引對(duì)文本字段使用“前綴索引”,減少索引文件大小經(jīng)常使用 explain 分析sql執(zhí)行效率使用Mysql慢查詢機(jī)制監(jiān)控查詢狀態(tài)
3. Memcache和redis,MongoDB的異同
從以下幾個(gè)維度,對(duì) redis、memcache、mongoDB 做了對(duì)比。
1、性能
都比較高,性能對(duì)我們來說應(yīng)該都不是瓶頸。
總體來講,TPS 方面 redis 和 memcache 差不多,要大于 mongodb。
2、操作的便利性
memcache 數(shù)據(jù)結(jié)構(gòu)單一。(key-value)
redis 豐富一些,數(shù)據(jù)操作方面,redis 更好一些,較少的網(wǎng)絡(luò) IO 次數(shù),同時(shí)還提供 list,set,
hash 等數(shù)據(jù)結(jié)構(gòu)的存儲(chǔ)。
mongodb 支持豐富的數(shù)據(jù)表達(dá),索引,最類似關(guān)系型數(shù)據(jù)庫,支持的查詢語言非常豐富。
3、內(nèi)存空間的大小和數(shù)據(jù)量的大小
redis 在 2.0 版本后增加了自己的 VM 特性,突破物理內(nèi)存的限制;可以對(duì) key value 設(shè)置過
期時(shí)間(類似 memcache)
memcache 可以修改最大可用內(nèi)存,采用 LRU 算法。Memcached 代理軟件 magent,比如建立
10 臺(tái) 4G 的 Memcache 集群,就相當(dāng)于有了 40G。 magent -s 10.1.2.1 -s 10.1.2.2:11211 -b
10.1.2.3:14000 mongoDB 適合大數(shù)據(jù)量的存儲(chǔ),依賴操作系統(tǒng) VM 做內(nèi)存管理,吃內(nèi)存也比較厲害,服務(wù)
不要和別的服務(wù)在一起。
4、可用性(單點(diǎn)問題)
對(duì)于單點(diǎn)問題,
redis,依賴客戶端來實(shí)現(xiàn)分布式讀寫;主從復(fù)制時(shí),每次從節(jié)點(diǎn)重新連接主節(jié)點(diǎn)都要依賴整
個(gè)快照,無增量復(fù)制,因性能和效率問題,
所以單點(diǎn)問題比較復(fù)雜;不支持自動(dòng) sharding,需要依賴程序設(shè)定一致 hash 機(jī)制。
一種替代方案是,不用 redis 本身的復(fù)制機(jī)制,采用自己做主動(dòng)復(fù)制(多份存儲(chǔ)),或者改成
增量復(fù)制的方式(需要自己實(shí)現(xiàn)),一致性問題和性能的權(quán)衡
Memcache 本身沒有數(shù)據(jù)冗余機(jī)制,也沒必要;對(duì)于故障預(yù)防,采用依賴成熟的 hash 或者環(huán)
狀的算法,解決單點(diǎn)故障引起的抖動(dòng)問題。
mongoDB 支持 master-slave,replicaset(內(nèi)部采用 paxos 選舉算法,自動(dòng)故障恢復(fù)),auto sharding 機(jī)制,對(duì)客戶端屏蔽了故障轉(zhuǎn)移和切分機(jī)制。
5、可靠性(持久化)
對(duì)于數(shù)據(jù)持久化和數(shù)據(jù)恢復(fù),
redis 支持(快照、AOF):依賴快照進(jìn)行持久化,aof 增強(qiáng)了可靠性的同時(shí),對(duì)性能有所影
響
memcache 不支持,通常用在做緩存,提升性能;
MongoDB 從 1.8 版本開始采用 binlog 方式支持持久化的可靠性
6、數(shù)據(jù)一致性(事務(wù)支持)
Memcache 在并發(fā)場(chǎng)景下,用 cas 保證一致性redis 事務(wù)支持比較弱,只能保證事務(wù)中的每個(gè)操作連續(xù)執(zhí)行
mongoDB 不支持事務(wù)
7、數(shù)據(jù)分析
mongoDB 內(nèi)置了數(shù)據(jù)分析的功能(mapreduce),其他不支持
8、應(yīng)用場(chǎng)景
redis:數(shù)據(jù)量較小的更性能操作和運(yùn)算上
memcache:用于在動(dòng)態(tài)系統(tǒng)中減少數(shù)據(jù)庫負(fù)載,提升性能;做緩存,提高性能(適合讀多寫
少,對(duì)于數(shù)據(jù)量比較大,可以采用 sharding)
MongoDB:主要解決海量數(shù)據(jù)的訪問效率問題。
表格比較:
memcache redis 類型 內(nèi)存數(shù)據(jù)庫 內(nèi)存數(shù)據(jù)庫
數(shù)據(jù)類型 在定義 value 時(shí)就要固定數(shù)據(jù)類型 不需要
有字符串,鏈表,集 合和有序集合
虛擬內(nèi)存 不支持 支持
過期策略 支持 支持
分布式 magent master-slave,一主一從或一主多從
存儲(chǔ)數(shù)據(jù)安全 不支持 使用 save 存儲(chǔ)到 dump.rdb 中
災(zāi)難恢復(fù) 不支持 append only file(aof)用于數(shù)據(jù)恢復(fù)
性能
1、類型——memcache 和 redis 都是將數(shù)據(jù)存放在內(nèi)存,所以是內(nèi)存數(shù)據(jù)庫。當(dāng)然,memcache 也可用于緩存其他東西,例如圖片等等。
2、 數(shù)據(jù)類型——Memcache 在添加數(shù)據(jù)時(shí)就要指定數(shù)據(jù)的字節(jié)長(zhǎng)度,而 redis 不需要。
3、 虛擬內(nèi)存——當(dāng)物理內(nèi)存用完時(shí),可以將一些很久沒用到的 value 交換到磁盤。
4、 過期策略——memcache 在 set 時(shí)就指定,例如 set key1 0 0 8,即永不過期。Redis 可以通
過例如 expire 設(shè)定,例如 expire name 10。
5、 分布式——設(shè)定 memcache 集群,利用 magent 做一主多從;redis 可以做一主多從。都可
以一主一從。
6、 存儲(chǔ)數(shù)據(jù)安全——memcache 斷電就斷了,數(shù)據(jù)沒了;redis 可以定期 save 到磁盤。
7、 災(zāi)難恢復(fù)——memcache 同上,redis 丟了后可以通過 aof 恢復(fù)。
4. 遞歸寫一個(gè)數(shù)的階乘,遞歸列出文件夾的文件和文件夾
階乘遞歸
<?php
header('Content-type:text/html;charset=utf-8');
function jc($num){
if($num <0 ){
die('不能輸入負(fù)數(shù)!');
}
if($num==0||1){
$re = 1;
}
if($num>1){
$re= $num * jc($num - 1);
}
return $re;
}
echo jc(10);
?>
遞歸顯示文件夾下所有目錄和文件
header('Content-type:text/html;charset=utf-8');
function showDir($dirName){
//如果不是目錄返回false
if(!is_dir($dirName)) return false;
//輸出父級(jí)目錄
echo '<span style="color:red">' . $dirName . '</span><br/>';
//掃描目錄
$scDir = glob($dirName . '/*');
//循環(huán)目錄下面所有的文件和錄
foreach ($scDir as $v) {
//是目錄,則遞歸
if(is_dir($v)) showDir($v);
//是文件,則輸出文件名
if(is_file($v)) echo $v . '<br/>';
}
}
showDir('./');
5. js,php寫出9×9乘法表
js代碼:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>js寫九九乘法表</title>
<style>
table {
width: 800px;
height: 300px;
border-collapse: collapse;
}
table td {
border: 1px solid #069;
}
body {
text-align: center;
}
h1 {
font-family: "微軟雅黑", Verdana, sans-serif, "宋體";
color: #666;
font-weight: bold;
margin-bottom: 30px;
}
</style>
<script type="text/javascript">
document.write("<table>");
var str = "js寫九九乘法表";
document.write("<h1>" + str + "</h1>");
for ( var i = 1; i <= 9; i++) {
document.write("<tr>");
for ( var j = 1; j <= i; j++) {
document.write("<td>" + i + "×" + j + "=" + (i * j) + "</td>");
}
document.write("</tr>");
}
document.write("</table>");
</script>
</head>
<body>
</body>
</html>
php寫九九乘法表代碼:
<?php
header('Content-type:text/html;charset=utf-8');
echo "<h1>php寫九九乘法表</h1>";
for($i=1;$i<=9;$i++){
for($j=1;$j<=$i;$j++){
echo $i.'×'.$j.'='.$i*$j.' ';
}
echo '<br>';
}
echo "<hr>";
//倒著
for($i=9;$i>=1;$i--){
for($j=1;$j<=$i;$j++){
echo $i.'×'.$j.'='.$i*$j.' ';
}
echo '<br>';
}
?>
6. include和require的區(qū)別
require()語句的性能與include()相類似,都是包括并運(yùn)行指定文件。不同之處在于:對(duì)include()語句來說,在執(zhí)行文件時(shí)每次都要進(jìn)行讀取和評(píng)估;而對(duì)于require()來說,文件只處理一次(實(shí)際上,文件內(nèi)容替換require()語句)。這就意味著如果可能執(zhí)行多次的代碼,則使用require()效率比較高。另外一方面,如果每次執(zhí)行代碼時(shí)是讀取不同的文件,或者有通過一組文件迭代的循環(huán),就使用include()語句。需要注意的是,require和include要引入的文件的路徑要寫正確,如果出錯(cuò),include會(huì)報(bào)一個(gè)警告錯(cuò)誤,程序會(huì)繼續(xù)運(yùn)行,而require則會(huì)報(bào)一個(gè)致命錯(cuò)誤,程序就此停止。
7. 獲取一個(gè)文件的擴(kuò)展名
# 方法1:
function get_extension($file) {
return substr($file, strrpos($file, '.')+1);
}
$file = './123/a/f/abc.txt.rar';
echo get_extension($file);//輸出rar
# 注釋:
echo strrpos("You love php, I love php too!","php");//結(jié)果是21.查找 "php" 在字符串中最后一次出現(xiàn)的位置:
echo substr("Hello world",6);//輸出world.注意是從0開始,第6個(gè)字母是w
# 方法2:
function get_extension($file){
return end(explode('.', $file));//把$file這個(gè)字符串以.炸開成數(shù)組,取其最后一個(gè)元素
}
# 注釋:
$people = array("Bill", "Steve", "Mark", "David");
echo end($people);//輸出David
# 方法3:
function get_extension($file) {
$info = pathinfo($file); //獲取文件信息的數(shù)組
return $info['extension']; //獲取文件信息數(shù)組的擴(kuò)展名的值
}
# 方法4:
function get_extension($file){
return pathinfo($file, PATHINFO_EXTENSION);
}
8. js和php的正則驗(yàn)證郵箱和手機(jī)號(hào)
驗(yàn)證130-139,150-159,180-189號(hào)碼段的手機(jī)號(hào)碼:
<script type="text/javascript">
var myreg = /^(((13[0-9]{1})|(15[0-9]{1})|(18[0-9]{1}))+\d{8})$/;
if(!myreg.test($("#phone").val()))
{
alert('請(qǐng)輸入有效的手機(jī)號(hào)碼!');
return false;
}
</script>
寫成函數(shù)形式:
function validatemobile(mobile)
{
if(mobile.length==0)
{
alert('請(qǐng)輸入手機(jī)號(hào)碼!');
document.form1.mobile.focus();
return false;
}
if(mobile.length!=11)
{
alert('請(qǐng)輸入有效的手機(jī)號(hào)碼!');
document.form1.mobile.focus();
return false;
}
var myreg = /^(((13[0-9]{1})|(15[0-9]{1})|(18[0-9]{1}))+\d{8})$/;
if(!myreg.test(mobile))
{
alert('請(qǐng)輸入有效的手機(jī)號(hào)碼!');
document.form1.mobile.focus();
return false;
}
}
9. js和php實(shí)現(xiàn)字符串和數(shù)組的轉(zhuǎn)換
<script type="text/javascript">
//字符串轉(zhuǎn)數(shù)組,使用split()函數(shù)
var str="How are you doing today?"
document.write(str.split(" ") + "<br />");//輸出['How','are','you','doing','today?']
document.write(str.split("") + "<br />");
document.write(str.split(" ",3));
</script>
<hr />
<script type="text/javascript">
//數(shù)組轉(zhuǎn)字符串,用join()
var arr = new Array(3);
arr[0] = "George"
arr[1] = "John"
arr[2] = "Thomas"
document.write(arr.join());
document.write("<br />");
document.write(arr.join("."));
</script>
10. php如何連接MySQL?
<?php
$dsn='mysql:host=127.0.0.1;dbname=c65';//dsn是數(shù)據(jù)源,包括數(shù)據(jù)庫類型(IBM的DB2、甲骨文的Oracle、微軟的SQL和Access、Sybase的Sybase、MySQL AB公司的MySQL等),主機(jī)地址host(本地是localhost或者127.0.0.1,也可以連接遠(yuǎn)程服務(wù)器地址),數(shù)據(jù)庫名dbname
$username='root';//用戶名
$password='';//此root用戶沒有密碼
try {//
$pdo=new PDO($dsn,$username,$password);//實(shí)例化PDO,通過PDO連接數(shù)據(jù)庫
} catch (PDOException $e) {//如果連接出錯(cuò),會(huì)拋出異常。然后被catch接到
echo '<span style="color: red;">'.$e->getMessage().'</span>';//輸出錯(cuò)誤信息
}
?>
11. 解析php數(shù)組函數(shù)array_filter,array_push,in_array的用法。
array_filter用法鏈接
array_push用法鏈接
in_array用法鏈接
<?php
$a=array("red","green");
array_push($a,"blue","yellow");
print_r($a);
?>
#注釋:array_push() 函數(shù)向第一個(gè)參數(shù)的數(shù)組尾部添加一個(gè)或多個(gè)元素(入棧),然后返回新數(shù)組的長(zhǎng)度。
#該函數(shù)等于多次調(diào)用 $array[] = $value。
12. echo,print(),print_r(),var_dump()的用法
13. Ajax有哪些方法可以實(shí)現(xiàn)跨域?它們有哪些局限性?
14. 硬件加速是什么?如何開啟設(shè)備的硬件加速?
15. <canvas>標(biāo)簽的用法
參考鏈接 請(qǐng)查看源碼
16. Mysql數(shù)據(jù)庫千萬級(jí)數(shù)據(jù)處理優(yōu)化
17. php用最簡(jiǎn)單的代碼寫一個(gè)獲取3個(gè)數(shù)中最大值的函數(shù)
18. js中window.onload和JQ中的ready有何不同?
1.執(zhí)行時(shí)間
window.onload必須等到頁面內(nèi)包括圖片的所有元素加載完畢后才能執(zhí)行。
$(document).ready()是DOM結(jié)構(gòu)繪制完畢后就執(zhí)行,不必等到加載完畢。
2.編寫個(gè)數(shù)不同
window.onload不能同時(shí)編寫多個(gè),如果有多個(gè)window.onload方法,只會(huì)執(zhí)行一個(gè)
$(document).ready()可以同時(shí)編寫多個(gè),并且都可以得到執(zhí)行
3.簡(jiǎn)化寫法
window.onload沒有簡(jiǎn)化寫法
$(document).ready(function(){})可以簡(jiǎn)寫成$(function(){});
19. 如何不使用sumit按鈕來提交表單?
20. 怎樣抓取遠(yuǎn)程圖片到本地?
21. 怎么獲取一個(gè)文件的擴(kuò)展名?
第1種方法:
function get_extension($file){
substr(strrchr($file, '.'), 1);
}
第2種方法:
function get_extension($file){
$info = pathinfo($file); //返回文件信息的數(shù)組
return $info['extension']; //返回文件擴(kuò)展名
}
第3種方法(推薦)
function get_extension($file){
return pathinfo($file, PATHINFO_EXTENSION);
}
22. 抽獎(jiǎng)活動(dòng)的php程序。
23. 1萬個(gè)過濾詞,像微博這樣的網(wǎng)站是如何過濾的?
24. 簡(jiǎn)述Ajax原理
25. MySQL運(yùn)算和MySQL函數(shù)
26. mysql_fetch_row()和mysql_fetch_array()的用法和區(qū)別
27. MySQL指令和MySQL優(yōu)化提升課程
28. Linux 各種shell命令,vi命令
29. shell 命令:刪除文件名包含'abc'的所有文件
30. 什么是事務(wù),它是如何實(shí)現(xiàn)的
31. 翻轉(zhuǎn)字符串
<?php
$str = 'abcde';
for ($i=0, $j = strlen($str)-1; $i < $j; $i++, $j--) {
$tmp = $str[$j];
$str[$j] = $str[$i];
$str[$i] = $tmp;
}
echo $str;
$str = 'abcdef';
function demo($str){
$arr=array();
$newStr='';
$arr=str_split($str);
for($i=count($arr)-1;$i>=0;$i--){
$newStr.=$arr[$i];
}
return $newStr;
}
echo demo($str);
$str = 'abcdef';
echo strrev($str);
32. 列出幾個(gè)php中的全局函數(shù)和全局變量
33. 寫出你知道的魔術(shù)方法并簡(jiǎn)述其功能
34. 遞歸轉(zhuǎn)換數(shù)組的鍵名為大寫
35. php中json_decode()和json_encode()的使用方法
36. Rbac的作用,實(shí)現(xiàn)方法和原理
37. MySQL分區(qū)
38. PHP寫鏈?zhǔn)綘I銷的思路
39. 網(wǎng)頁提示401和404是什么情況?
40. Linux下memcached配置
41. 常用的加密函數(shù)。
42. $_GET和$_POST的區(qū)別:
通過 GET 方法從表單發(fā)送的信息對(duì)任何人都是可見的(所有變量名和值都顯示在 URL 中)。GET 對(duì)所發(fā)送信息的數(shù)量也有限制。限制在大于 2000 個(gè)字符。不過,由于變量顯示在 URL 中,把頁面添加到書簽中也更為方便。
GET 可用于發(fā)送非敏感的數(shù)據(jù)。
通過 POST 方法從表單發(fā)送的信息對(duì)其他人是不可見的(所有名稱/值會(huì)被嵌入 HTTP 請(qǐng)求的主體中),并且對(duì)所發(fā)送信息的數(shù)量也無限制。
此外 POST 支持高階功能,比如在向服務(wù)器上傳文件時(shí)進(jìn)行 multi-part 二進(jìn)制輸入。
不過,由于變量未顯示在 URL 中,也就無法將頁面添加到書簽。
43. 不通過submit提交表單的方法。
44. PHP - 驗(yàn)證 E-mail
$email = test_input($_POST["email"]);
$preg = "/([\w\-]+\@[\w\-]+\.[\w\-]+)/";
if (!preg_match($preg,$email)) {
$emailErr = "無效的 email 格式!";
}
注釋:preg_match() 函數(shù)檢索字符串的模式,如果模式存在則返回 true,否則返回 false。
45. PHP - 驗(yàn)證 URL
$website = test_input($_POST["website"]);
if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%
=~_|]/i",$website)) {
$websiteErr = "無效的 URL";
}
46. SVN版本控制用法
47. PHP的意思:
PHP(外文名:PHP: Hypertext Preprocessor,中文名:“超文本預(yù)處理器”)是一種通用開源腳本語言。
49. 把日期字符串07/26/2016轉(zhuǎn)換成2016/07/26格式
<?php
$date = '07/26/2016';
echo preg_replace('/(\d+)\/(\d+)\/(\d+)/', '$3/$1/$2', $date);//輸出2016/07/26
# 注釋:3個(gè)()所匹配的內(nèi)容分別是$1,$2,$3.替換成$3/$1/$2的格式。
如果這篇文章對(duì)你有幫助,不妨點(diǎn)個(gè)贊哦
(˙?˙)?--?