1.如何取得來訪者的IP地址?
$_SERVER[‘RRMOTE_ADDR’]; $_SERVER[‘CLIENT_IP’]; $_SERVER[‘HTTP_X_FORWARED_FOR’];
2.$_FILES的結構
Array
(
[pic] => Array
(
[name] => 菜單2.jpg
[type] => image/jpeg
[tmp_name] => E:\sssssss\tmp\php1923.tmp
[error] => 0
[size] => 288583
)
)
3.session,cookie的區別
存儲位置: cookie存儲在瀏覽器,session存於服務器.
存儲類型: cookie 能存儲字符串,數字,不能存儲數組,對象 session可以存儲所有類型(除了資源)
存儲大小不同:受瀏覽器的限制,不同瀏覽器對於cookie的個數和大小,有限制. session存儲在文件上,因此可以存儲較大內容.
安全性: 不能夠直接信任cookie數據,因為可以偽造,要加鹽驗證,
session需要利用cookie來傳遞session_id.
禁用cookie后的方法:1、<input type="text" name="PHPSESSID" value="g6fgb641che30nre1bccvgeu23">
cookie和session的設置和過期時間問題
setcookie('test','hello',3600,'/');cookie,只要是根目錄下的都可以訪問
session_start();
$_SESSION["username"]="lhp";
4.函數:
pathinfo();
$url = "http://www.lagou.com/jobs/2499163.html?source=delivered&i=delivered-5";
$res = pathinfo($url);
Array
(
[dirname] => http://www.lagou.com/jobs
[basename] => 2499163.html?source=delivered&i=delivered-5
[extension] => html?source=delivered&i=delivered-5
[filename] => 2499163
)
字符串函數:
截取查找等
addslashes那幾個函數
數組函數:
排序等
php獲取mysql查詢結果集總數的函數是?
mysql_num_rows(資源) // 獲取select語句的返回行數
mysql_affected_rows(); // 獲取insert/update/delete 語句的影響行數
5.請簡述你對MVC設計模式的理解和常見開發設計模式
mvc模式:
m model
v view
c controller
請求訪問controller,經過controller進行邏輯處理,若需要進行數據增刪改查,則通過controller處理好數據然后調用model,再根據model返回的數據進行處理,顯示在view上
開發設計模式
單例模式:讓某個類的實例只有一個,不重復,可以節約資源,防止new的濫用,常用在mysql,購物車
工廠模式:將類的功能實現具體細節封裝起來,開放某些接口,供外部調用,不讓外部了解里面具體細節
觀察者模式:需要觀察者和被觀察者,通過被觀察者的一些狀態的變化,讓觀察者去進行相關業務處理
6.遞歸打印某個磁盤目錄,結構和文件
使用到opendir(),readdir(),closedir();
判斷是否為.和.. 是的話要過濾掉
判斷是否是目錄 是的話則遞歸調用本函數
7.PHP魔術方法(或函數)和魔術變量
__construct(),__destruct(),__get(),__set(),__isset(),__unset(),__unset(),__clone()等
__FILE__ 代表當前文件路徑
__LINE__ 當前行數
__DIR__ 當前目錄
__FUNCTION__ 當前函數名
__CLASS__ 當前類名
7.1 請簡述php異常處理機制 語法
try{
throw new Exception("Error Exception", 1);
}catch(Exception $e){
echo $e -> getMessage ();
}
8.你的代碼在本地正常,上傳到購買的虛擬主機后,顯示空白. 該如何調試?
查看日志.
如果程序沒有日志, 只能看PHP的原始報錯,想想,為什么空白?
php.ini有2個設置:
display_errors,修改為on,
error_reporting(E_ALL);
同時,由於虛擬主機,你無權修改php.ini,
在php腳本中,動態修改ini,用ini_set();
綜上: ini_set(‘display_errors’ , 1);
error_reporting(E_ALL);
9.以下HTTP狀態碼的含義 404,403,200,302,304,500
404 Not Found
403 forbidden
200 OK
302 臨時重定向
304 not modified
500 服務器內部錯誤
10.各種服務的默認端口號:
http:80
https:443
tomcat:8080
mysql:3306
ftp:21
ssh:22
telnet:23
smtp:25
php-fpm:9000
memcached:11211
redis:6379
mongodb:27017
sphinx:9312
11.寫一個最簡單的單例類
final class single{
protected static $ins=null;
protected function __construct(){}
public static function getIns(){
if(self::$ins==null){
self::$ins = new self();
}
return self::$ins;
}
protected function __clone(){}
}
12.說出你用的框架,並比較他們之間的差異
TP, laravel
1. laravel的路由更簡單靈活,直接指向控制器的方法,而tp是通過m/c/a的方式獲取對應參數,來訪問對應模塊下控制器的方法
2. laravel接管了網站的全過程,數據庫(遷移文件,migration)+mvc(路由)+錯誤處理
3. laravel的傳參和獲取參數方式不一樣,它有一個強大的request對象
4. laravel模板blade語法更接近php語法,相對tp里面的改過的smarty模板更簡單
5. laravel引入第三方類庫方式比較好,大大提高開發人員使用第三方類庫的效率
數據庫
13.簡述char與varchar的區別
分別是定長與變長.
以char(M)為例, 可以存儲0-M個字符,存儲不夠M個字符, 仍然占據M個字符的寬度.(不夠M個,右側用空格補齊).
varchar(M),可以存儲0-M個字符,但需要1-2個額外的字節,來標注此字段具體的大小.
14.ddl語句,數據表建立等語句
1.復習秘籍.html 練習一遍
2.show TABLE status [where name='art']
//查看表的詳細信息
//里面有comment標注是 表 還是 視圖
show VARIABLES like '%character%':查看當前字符集設置
15、如何查看SQL語句的執行效率?
16、關系數據庫中,索引的作用主要有哪些,一般什么情況下需要建索引?
並簡述索引都有哪幾種類型,有何區別?
提高查詢速度,有利於排序和分組. (排序和分組如用不上索引,則會產生臨時表和filesort的過程)
根據業務邏輯,分析列查詢的頻度和順序, 建立索引和復合索引.
主鍵索引(primary key), ---->不需要有索引名,因為只有一個主鍵索引
唯一索引(unique key)
---->unique key email(email(10))
括號里面是表字段,外面是索引名字,其他索引一樣
里面的10是指索引的長度,如1234567899@qq.com,只取出了前面10個字符做索引
普通索引(key),
全文索引(fulltext key)--->中文環境下基本無效,一般用第三方方案如sphinx(中文分詞)
多列索引:key xm(xing,ming)用xing和ming兩個字段做索引
冗余索引:在某個字段上有多個索引,如 key xm(xing,ming) ,key m(ming),有兩個 就是冗余索引
16.1、索引:提高了查詢速度,降低了增刪改的速度
索引操作:
查看索引:show index from table tbname,show create table tbname
刪除索引:alter table tbname drop index key1,drop index key1 from tbname
添加索引:alter table tbname add index key1(字段)
添加主鍵索引:alter table tbname add primary key(id)
刪除主鍵索引:alter table tbname drop primary key
17、在使用多列索引或建立多列索引時,我們一般要遵循“最左前綴原則”。請簡單說明“最左前綴原則”。
針對單列索引, 左邊准確而右邊模糊,可以用到索引,反之則不可以.
如 where name like ‘poly%’,可以用到, 而”%poly”則不用到.
針對多列索引, 左邊的列用到索引后,右側的列才有可能用到索引.
例 index(a,b,c), where a=? and b=? ,b列索引會用到.
如果直接 where b=?, 因為a列沒用索引,所以b索引,用不到.
17.1事務
四大特性:隔離性,原子性,一致性,持久性
17.2 mysql引擎
常見三種:
innodb:所有數據在一個文件中
myisam:數據分類存儲
memory:內存
innodb和myisam區別:
innodb(李小心):支持事務,不支持全文索引,行鎖(更細),支持多種索引
myisam(張馬虎):不支持事務,支持全文索引,表鎖,只支持B樹索引
linux
18.查找當前目錄下,所有的.php文件
答: find . -name “*.php”
19. 查找當前目錄下,所有的.php文件並匹配含有”dog”的行
答: find . -name “*.php” | xargs grep dog
20.有一個備份程序 mybackup.sh,需要每天凌晨3點執行一次,crontab命令格式怎么寫?
答: crontab -e 進入編輯狀態.
0 3 * * * /bin/bash mybackup.sh
21.請簡述php會話(session)實現原理,並考慮如下問題:
禁用了cookie,session能否使用?
如何把session存儲數據庫/memcached/redis
如何實現一個嚴格的30分鍾過期的會話?、
如何實踐web服務器集群的會話共享?
如何實現兩個不同域站點的會話共享?
答: 能!
cookie和session的關系
cookie傳遞session_id,供服務器決定session文件.
所以只要能向服務器傳遞session_id,session就能正常使用.
而cookie只是傳遞session_id的一種方式而已.
用url也能傳遞session_id
php.ini 配置如下:
session.use_only_cookies = 0
session.use_trans_sid = 1
OK了.
class sess {
protected static $mem = null;
public static function open() {
if(self::$mem === null) {
self::$mem = new memcache();
self::$mem->connect('localhost' , 11211);
}
}
public static function close() {
self::$mem->close();
}
public static function read($id) {
return self::$mem->get($id);
}
public static function write($id , $data) {
return self::$mem->add($id,$data , false);
}
public static function destroy($id) {
return self::$mem->delete($id);
}
public static function gc($lifetime) {
//
}
}
session_set_save_handler('sess::open', 'sess::close', 'sess::read', 'sess::write', 'sess::destroy', 'sess::gc');
?>
如何實現30分鍾過期的session?
答: 1. 加時間戳, $_SESSION[‘expire’] = time()+1800;
業務邏輯去判斷.
2.ini_set(‘session.cookie_lifetime’ , 1800)
3.或者用memcache,存儲的時候,加上1800的有效期.
4.接管session處理權,第1題中,$mem->connect(‘專門的一台memcached服務器’).
把session文件放在專門的服務器中. 各個web服務器共享此session服務器.
5.如果不跨主域, 如book.163.com, lady.163.com , mil.163.com
在setcookie(‘key’,’value’,’expire’ , /path‘ , ‘.163.com’);
域名只寫到主域名,cookie將會在各個子域名生效.
如果必須跨域,我們依照oauth原理.
22.在不刷新新頁面的前提下,js有哪幾種方式可以向后端服務發起請求?怎么通過前后端的配置實現跨域請求?
ajax (默認不能跨域)
jsonp(可以跨域)
document.createElement(‘img’);
img.src=’xx.com/url’;
也可以通過最新的XHR對象的特點, 在服務端發送頭信息 Access-Control-Allow -Origin: *
同步和異步的區別:
同步需要等待返回結果才能繼續,異步不必等待
23請指出下面幾種編碼分別是什么格式:
%E4%B8%AD%E6%96%87
%D6%D0%CE%C4 URL encoded, php有urlencoded, js用encodeURI
0xe40xb80xad0xe60x960x87 ,十六進制
\u4e2d\u6587 , unicode碼,返回的json數據中常見
中文 , html實體
24、請給出能滿足下面要求的linux命令:
1) 查看系統的運行狀態(CPU/內存/負載等);
top ,
cat /proc/meminfo 查看內層狀態
cat /proc/cpuinfo
w 命令可以看到 load average: 0.00, 0.00, 0.00
2)重啟apache/httpd/nginx服務(寫出一條即可);
apache: /path/to/apache/httpd -k start|stop|restart
nginx: /path/to/nginx/sbin/nginx -s reload
24.1 查看文件大小
25、PHP運行模式:
1) CGI (通用網關接口 / Common Gatew ay I nterface)
CGI 即通用網關接口:每有一個用戶請求,都會先要創建CGI 的子進程,然后處理請求,
處理完后結束這個子進程,
這就是Fork-And-Ex ecute模式。 當用戶請求數量非常多時,會大量擠占系統的資源如
內存, CPU 時間等,造成效能低下。
屬於PH P早期的運行模式,目前使用較少;
2) FastCGI (常駐型CGI / Long-Live CGI )
FastCGI 是CGI 的升級版本, FastCGI 像是一個常駐 (long-live)型的 CGI ,它可以一直執行
着,只要激活后,
不會每次都要花費時間去 Fork 一次 (這是 CGI 最為人詬病的 fork-and-ex ecute 模
式)。
3) Web模塊模式( Apache等Web服務器運行的模式)
模塊的作用是接收Apache傳遞過來的PH P文件請求,並處理這些請求,然后將處理后
的結果返回給Apache。然后在返回給用戶;
4) CLI (命令行運行 / Command Line I nterface)
PH P-CLI 是PH P Command Line I nterface的簡稱,如同它名字的意思,就是PH P在命令行運行的接口,
區別於在Web服務器上運行的PH P環境( PH P-CGI , I SAPI 等)。
PH P 的命令行模式能使得 PH P 腳本能完全獨立於 w eb 服務器單獨運行。
切換目錄到php.ex e所在文件夾;
在cli命令行模式下:
命令行下如何接收參數 命令行下如何接收參數
用$argv來接收參數,
$argv是一個數組,
第0個單元,代表php文件的名稱
第1個單元,代表第1個參數的值
第2個單元,代表第2個參數的值
...
26、lnmp搭建步驟
27、js事件委托
有時候進行某個事件操作,可能操作對象是很多類似的對象,不可能全部綁定同一個方法
這個時候用事件委托,將事件綁定到這些相似對象的上一級,如td綁定到table
var table = document.getElementsByTagName('table')[0];
table.onclick = function(ev){
ev.srcElement.style.background = '#000';
}
28、框架,tp,laravel(隊列?),yii,node.js
29、面向對象 單例模式 幾個類
30、排序算法代碼(冒泡,快速等)
冒泡排序:
1.比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
2.對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最后一對。在這一點,最后的元素應該會是最大的數。
3.針對所有的元素重復以上的步驟,除了最后一個。
4.持續每次對越來越少的元素重復上面的步驟,直到沒有任何一對數字需要比較
代碼:
function bubbleSort($numbers) {
$cnt = count($numbers);
for ($i = 0; $i < $cnt; $i++) {
for ($j = 0; $j < $cnt - $i - 1; $j++) {
if ($numbers[$j] > $numbers[$j + 1]) {
$temp = $numbers[$j];
$numbers[$j] = $numbers[$j + 1];
$numbers[$j + 1] = $temp;
}
}
}
return $numbers;
}
$num = array(20, 40, 60, 80, 30, 70, 90, 10, 50, 0);
var_dump(bubbleSort($num));
快速排序:
通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然后再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列
代碼:
function quickSort(&$arr){
if(count($arr)>1){
$k=$arr[0];
$x=array();
$y=array();
$_size=count($arr);
for($i=1;$i<$_size;$i++){
if($arr[$i]<=$k){
$x[]=$arr[$i];
}elseif($arr[$i]>$k){
$y[]=$arr[$i];
}
}
$x=quickSort($x);
$y=quickSort($y);
return array_merge($x,array($k),$y);
}else{
return $arr;
}
}
31、memcached、redis、mongodb以及它們之間的區別
32、郵件發送協議:SMTP、POP3、IMAP4
33、
33、$GLOBALS和global區別
$GLOBALS:全局變量數組
global:在函數內容聲明某個變量是全局變量中的某一個變量,
然后可以對這個聲明的變量進行全局增刪改查
例如:
$c = 1;
echo $c;//1
function a(){
global $c;
$c = 222;
}
a();
echo $c;//222
34、字符串函數:
正則常用函數:
preg_split()將字符串,按正則一個一個字符分割到數組中
字符串函數:
strrev,反轉字符串
str_split,按指定字符串長度拆成數組
chunk_split,按照指定的長度進行切割字符串並加上其他字符如 123434--->123,434
number_format 千分位格式化數字
35、多練習理解memcached、redis、momgodb
三者應用如下
<?php
$mem = new memcache;
$mem->connect('localhost',11211);
//通過memcached來設置一個自增的id
$_id = $mem->increment('_id');
$mongo = new mongoClient;
$test = $mongo->test;
$book = $test->book;
//用自增的id來放到mongodb的json串中
$data = ['_id'=>$_id,'title'=>$_POST['title']];
$book->insert($data);
$tags = explode(',',$_POST['tags']);
$redis = new redis;
var_dump($redis->connect('localhost',6379));
foreach($tags as $v){
echo $v;
//使用redis來保存標簽tags的內容
$redis->sAdd($v,$_id);
}
echo 'OK';
?>
36、服務器反向代理,集群,負載均衡
反向代理:動靜分離等,
也就是對應不同的請求使用不同的服務器,
如:訪問一個頁面時,用一個服務器來解析html,一個解析php,一個服務器來存圖片並,請求的時候返回圖片資源等
集群:多個服務器,放在一個服務器組里面,當有請求時,將請求給服務器組。
配置例子:
upstream aaaserver{
sever 192.168.3.1:80.......
sever 192.168.3.2:80.......
sever 192.168.3.3:80.......
}
負載均衡:當請求給服務器組時,將請求按照一定(算法、策略),分發給服務器組里面的各個服務器
37、mysql優化
①原則:不查-->少查-->內存查-->磁盤查-->少排序(最好的優化是少查詢)
②表的優化:
a定長和變長字段分離--->核心且常用字段宜建成定長,放一張表
b常用和不常用字段分離
c需要關聯同級的表中,添加冗余字段
如:一個文章表中,展示文章的時候經常要用到作者名,
這個時候可以在文章表中加上用戶(作者)uname,從而不用去連表查用戶表
③列的選擇:
a字段類型優先級--->int>date,time<enum.char>varchar>blob,text
b長度夠用就行--->如age用tinyint最大可存255,用int浪費了3個字節
因為大的字段,浪費內存,影響速度
c盡量避免用null
因為null不利於索引,要用特殊字段來標注
另外查詢也不方便,還需要用is null或is not null
④索引的優化
常用符合索引來優化,同時用幾個字段來索引
38、查看sql語句執行效率
a:使用explain + select語句
b:set profiling=1,show profiles
設計模式,數據庫設計,優化,laravel,tp