1.nginx使用哪一種網路協定?
nginx是應用層我覺得從下往上的話傳輸層用的是tcp/ip 應用層用的是http
fastcgi負責調度進程
2. 沒有輸出結果, 可能是什麼原因, 簡述的解決此問題的過程(提示: 語法沒有問題)
可能伺服器上面沒有開啟短標籤short_open_tag =設定為Off,,php.ini開啟短標籤控制參數: short_open_tag = On
3. 簡述下列程式的輸出結果, 簡單說明為何, 如何解決這類問題?
$tmp = 0 == "a"? 1: 2;
echo $tmp = 0 == "a"? 1: 2;
echo $tmp;
?>
結果1 int和string型別強制轉換造成的,0==="a"
0 == 0 一定是true啊
PHP是弱型別。 。
$tmp = 0 === "a"? 1: 2;
echo $tmp; 這樣就是2
4. 已知一個字串如下: $str = "1109063 milo 1";
用一行程式碼將該字元串內的1109063賦值給$uid, milo賦值給$user, 1賦值給$type
空格如下
list($uid, $user, $type) = explode(" ", $str);
t
list ($uid, $user, $type) = explode("t", $str);
list($uid, $user, $type) = sscanf($str, "%d %s %d");
$n = sscanf($auth, "%dt%s %s", $id, $first, $last);
5. 分別列出以下類型的有符號和無符號範圍TINYINT SMALLINT MEDIUMINT INT
TINYINT-2 ^7 - 2^7-10 ~ 2^8-1
SMALLINT-2^15 - 2^15-1 0 ~ 2^16-1
MEDIUMINT-2^23 - 2^23-1 0 ~ 2^24 -1
INT-2^31 - 2^31-1 0 ~ 2^32-1
6. 將下面的陣列用一行拼成一個字串i am milo! day up!
$arr$arr = array(
'I', 'AM', 'MILO!', 'DAY', 'DAY', 'UP!'
);
?>
$str = strtolower(implode(" ",$arr)) ;
7. 呼叫下列函數取得函數並取得count的值
function get_list($cnd = array(), &$count = false)
{
// 偽程式碼處理$cnd 並賦值datas = 'i am call back';
$count && $count = rand(1, 10000);
return $datas;
}
?>
$count=1;
}
?>
$count=1;
}
?>
$count=1;
}
?>
$count=1; count);
echo $count;
8. 幾種方式去取代session機制, 簡單描述各自的優劣
mysql、memcache、cookie維持一種唯一狀態識別碼
9. 下列HTTP狀態碼出現的可能原因,如何處理
200, 301, 404, 502, 503
200
請求已成功,請求所希望的回應頭或資料體將隨此回應傳回。
301
被請求的資源已永久移動到新位置,並且將來任何對此資源的引用都應該使用本響應返回的若干個 URI 之一。如果可能,擁有連結編輯功能的用戶端應自動把請求的位址修改為從伺服器回饋回來的位址。除非額外指定,否則這個回應也是可緩存的。 新的永久性的 URI 應在回應的 Location 域中傳回。除非這是一個 HEAD 請求,否則回應的實體中應包含指向新的 URI 的超連結及簡短說明。 如果這不是一個 GET 或 HEAD 請求,因此瀏覽器禁止自動進行重定向,除非得到使用者的確認,因為請求的條件可能因此發生變化。 注意:對於某些使用 HTTP/1.0 協定的瀏覽器,當它們發送的 POST 請求得到了一個301回應的話,接下來的重定向請求將會變成 GET 方式。 🎜404 🎜 請求失敗,請求所希望得到的資源未被在伺服器上發現。沒有資訊能夠告訴使用者這個狀況到底是暫時的還是永久的。假如伺服器知道情況的話,應使用410狀態碼來告知舊資源因為某些內部的設定機制問題,已經永久的不可用,而且沒有任何可以跳轉的位址。 404這個狀態碼被廣泛應用於當伺服器不想揭示到底為何請求被拒絕或沒有其他適合的回應可用的情況下。 🎜502 🎜 作為網關或代理工作的伺服器嘗試執行請求時,從上游伺服器接收到無效的回應。 🎜503 🎜 由於臨時的伺服器維護或過載,伺服器目前無法處理請求。這個狀況是臨時的,並且將在一段時間以後恢復。如果能夠預期延遲時間,那麼回應中可以包含一個 Retry-After 頭用以標示這個延遲時間。如果沒有給予這個 Retry-After 訊息,那麼客戶端應以處理500回應的方式處理它。 注意:503狀態碼的存在並不意味著伺服器在過載的時候必須使用它。某些伺服器只不過是希望拒絕客戶端的連線。 🎜200 OK 一切正常,對GET和POST請求的應答文件跟在後面。 🎜301 Moved Permanently 客戶請求的文件在其他地方,新的URL在Location頭中給出,瀏覽器應該自動地訪問新的URL
404 Not Found 無法找到指定位置的資源。這也是一個常用的應答。
502 Bad Gateway 伺服器作為網關或代理時,為了完成請求存取下一個伺服器,但該伺服器傳回了非法的回應。
503 Service Unavailable 伺服器因維護或負載過重而未能應答。例如,Servlet可能在資料庫連線池已滿的情況下傳回503。伺服器回傳503時可以提供一個Retry-After頭。
10. 有以下資料庫, 用原生態mysql擴展去連接並查詢user表的前十行
host: 192.168.0.254
port: 3306
user: link = mysql_connect("192.168.0.254:3306","one","piece") or die('Could not connect: '.mysql_error());
mysql_select_db('db_mysql_error());
mysql_select_db('db_mysql_error());
mysql_select_db('db_ob_user',$link); query mysql_query("select * from user limit 10");
while($rs = mysql_fetch_array($query,MYSQL_ASSOC))
{}
11. 用autoload($class) 實現Lib並可以下的類別載入的自動載入目錄的相容目錄子目錄
$request->action = lcfirst(implode(array_map(
'ucfirst',
explode('-', strtolower($request->action))
)));
-------- -------------------------------------------------- --
function __autoload($class)
{
$cls = strtolower(str_replace("_","/",$class));
if(file_exsits(LIB.$cls.'.php'))
include_once(LIB.$cls.'.php');
}
else
{
die("not found {$class} class");
}
} /www.xx.com/lib/');
$author = new Lib_Author();
---------------------------- -------------------------------
function __authload($class)
{
$cls = explode("_", $class);
if(@is_dir($cls[1]))
{
if(@is_file($cls[2]))
{
include_once("CON_PATH".$cls[1].'/' .$cls[2].".php");
}
else
{
dir('error');
}
}
else if(@is_file($clsphp"
{
include_once("CON_PATH".$cls[1].".php");
}
else
{
dir('error');
} -----------------------------
function __autoload($class)
{
$cls = explode("_",$class );
$file = get_file($cls);
if($file=='error')
{
die('error');
}
include_once($file); )
{
if(is_array($dir))
{
foreach($dir as $k=>$v)
{
$tmpdir .= $v.'/';
{
$tmpdir .= $v.'/'; $tmpdir))
{
continue();
}
else if(is_file('CON_PATH'.$tmpdir.".php"))
{
return 'CON_PATH.
else
{
return 'error';
}
}
return 'error';
}
return 'error';
}
}
return ' /cntroller/");
$sb = new controller_sb();
---------------------------------- --
function __autoload_my_classes($classname)
{
# ... your logic to include classes here
}
spl_autoload_register('__autoload_my_--------autoload); ------------------------------------------
12. 用set_error_handle 去捕獲錯誤並且輸出, 等級自己設定
set_error_handle(callback,level)
function callback(int $errno , string $errstr [, string $errfile [, int $errline [, array $errcontext]]] ){ dedler; $errno,$errstr,$errfile,$errline)
{
switch($errno){
case E_USER_ERROR:
echo "error [$errno] $errstr fatal error on line
echo "error [$errno] $errstr fatal error on line
echo "error [$errno] $errstr fatal error on line $
case E_USER_WARNING:
echo "my warning [$errno] $errstr":
break;
case E_USER_NOTICE:
echo "my notice[$errno] $errerrbreak"; : [$errno] $errstr";
break;
}
}
set_erro_handler(dealErrorHandler);
trigger_error("notice", E_USER_NOTICE);
trigger_error("notice", E_USER_NOTICE); ("error", E_USER_ERROR) ;
13. 簡述兩種屏蔽php程式的notice警告的方法
初始化變量,檔案開始設定錯誤等級或修改php.ini 設定error_reporting
set_error_handler 和@抑制錯誤
1.在程式中加入:error_reporting (E_ALL & ~E_NOTICE);
2.或修改php.ini中的:error_reporting = E_ALL
改為:error_reporting = E_ALL &reportE_NOTICED. 0);或修改php.inidisplay_errors=Off
14. instanceof的作用, 經常在什麼設計模式中使用
單例模式,但是其他的模式也會用到
15. 1023用二進位表示, 並簡述計算過程
10-2
1023%2=1
511%2 =1
255%2 =1
127%2 =1
63%2 =1
31%2 =121% =1
3%2 =1
1%2 =1
0 =0
------------------------------- ------------
1023
2^9=
k=9
10 9 8 7 6 5 4 3 2 1
1 1 1 1 1 1 1 1 1 1
----------------------
1023 1
1023-1/2=511 1
511-1/2=255 1
255- 1/2=127 1
127-1/2=63 1
63-1/2=31 1
31-1/2=15 1
15-1/2=7 1
7-1/2=3 1
3-1/2=1 1
--------------------------------------- --------
2-10
只需用將二進制數的各位上的數從最右邊開始,最右邊的第一個數乘以二的零次方,第二個數乘以二的一次方,第三個數乘以二的二次方,依次類推可得第n個數乘以二的(n-1)次方,然後把得到的結果相加即可
例如: 110011=1*2^0+1*2^1+0*2^2+0*2^3+1*2^4+1*2^5=51
這也可以算是一個公式就是An*2 ^(n-1) An表示二進制數最右邊開始的第n個數,
將第一項第二項第三項一直到第n項用式子An*2^(n-1) 計算出來並加在一起即可
16. 下面php程式輸出的內容是什麼? 為什麼?
$str = "aatbbtcc";
@list($a, $b, $c) = explode('t' , $str);
echo $a,$b,$c;
?>
aabbcc;//'t'不會以t切割字串,explode之後申城一個array(0=>"aatbbtcc")所以。 。 。 ,'t'換成"t"就被切割
17. include和require 分別返回什麼錯誤級別
include會系統警告並繼續執行,require會發出系統警告但是會引致致命錯誤令腳本終止運行
18. 現有一個函數, 有不確定幾個的參數(可能有5個也可能有50個), 如何去定義這個函數
方法一: 不借助php內建函數
方法二: 提示func_num_args() func_get_arg() unc_get_args( )
function param()
{
$numargs = func_num_args();
echo "Number of arguments: $numargs
n";
if ($numnums >= 2);
. func_get_arg(1) . "
n";
}
$arg_list = func_get_args();
for ($i = 0; $i n";
}
}
param(1,2,3,4,5);
/**
2 * 範例寫完後,本來認為完事了,結果遇到有人問call_user_func_array(),看了一下手冊
3 * 原來,我上面的那個test函數還可以精簡成如下的例子,
4*/
5 function otest1 ($ a)
6 {
7 echo( '一個參數' );
8 }
9
10 function otest2 ( $a,$b)
11 {
12 echo( '二個參數' 1313;
15 function otest3 ( $a,$b,$c)
16 {
17 echo( '三啦' );
18 }
19
20 function otest () 18 }
19
20 function otest () ;
23 $num=func_num_args();
24 call_user_func_array( 'otest'.$num,$args );
25 }
26
27 otest(1,2);語句)裡面去處理全域變數, 並且改變他的值, 用兩種方法去實現(global和引用&)
$var=1;
function get_pra()
{
global $var;
$var = 'xxx$var = 'xxx ';
echo $var;
}
echo $var.'--';
get_pra();
echo $var;
-------------------- --------------
$test = 1;
$test1 = 2;
function get_yinyong()
{
global $test1;
$GLOBALS["test"] = &$test1 ;
}
echo $test."n";
get_yinyong();
echo $test;
--------------------------- -
20. 應用中我們常會遇到在user表隨機調取10條資料來展示的情況, 簡述你如何實現該功能, 不能使用sql函數以及order by等語句
表user 字段uid, username
估計一個user表中的區間,在此區間用php去一個隨機數,sql語句大於或小於此id去limit幾十條(保證10條資料),再不夠散亂的話,取出來的資料shuffle函數打亂數組,array_rand隨即取出10個
21. 假設下面的sql語句裡面的uid都能獲取到具體值, 經過下面語句查詢後uid的順序是什麼, 如何去按照uid in 輸入的順序去排序
select uid from user where uid in(10, 1, 3, 8, 11, 4, 7);
可觀的結果是1,3,4,7,8,10,11升序,有種情況特殊就是不確定因為中間的某些id人為直接修改可能不是升序了,如果按照uid in的順序需要重新循環一次根據id獲取查詢結果數組中的值放進新數組中即可
22. 用PHP將一個字符串中的字母替換成**
preg_replace('/[a-zA-Z]*/','**',$str);
如果指定的字元就可以str_replace('ooxx','**',$str);
23. 下方2.php中列印結果是什麼? 為什麼?執行順序1.php->2.php
cookie,cookie時間有問題time()+3600
24. 簡述php常用的json編碼函數,如何將json解碼的時候回傳數組
25. mysql 在sql語句中有' / 等字的時候, 要對sql語句的每個具體值做些什麼處理
mysql_real_escape_string
26. 如何在php中設定headerheader頭訊息
header('');
27.有以下幾個腳本, 請問2.php的輸出結果
1.php
setcookie('test', 'cookie_test', 3600);
? .php
$cookie = isset($_COOKIE['test'])? $_COOKIE['test']: 'cookie';
echo $cookie;
ookie a.如果include或include_once不是在函數或方法中被調用,則輸出結果均一樣。
b.如果include或 include_once在函數或方法中被調用,則如果想讓第二次及以後調用時有結果,則必須用include,而不能用include_once,這一點一定要注意。
28. 簡述call_user_func的功能
呼叫函數或類別裡面的函數,傳回第一個參數的值。類似的功能 call_user_func_array
29.訪問假設nginx已經設定server_name www.120.net xxx.120.net
訪問問http://www.120.net/index.php和http://xxx.120.net/ index.php之後
$_SERVER["SERVER_NAME"] 及$_SERVER["REQUEST_URI"]分別是什麼
www.120.net xxx.120.net
/index.php /index.php
30.linux的屬性為drwxr-xr-x 以數字表示其權限是
目錄權限為755所有者u擁有讀寫修改權限所屬群組g擁有讀取、修改權限所屬群組之外o的擁有讀取和修改權限
31.寬頻的1Mbps理論上的下載速度是多少KBps, 計算的方法
1*1024/8
1M=1024KB
1KB=1024B
1B=8bit
第二部分工作class Example{ // The parameterized factory method public static function factory($type) { if (include_once 'Drivers/' . $type . '.php') {
$classname = 'newDriver_' . $type; return 問題classname;
} else {
throw new Exception ('Driver not found');
}
}}// Load a MySQL Driver$mysql = Example::factory('MySQL'); $sqlite = Example::factory('SQLite');
definded('DRIVER','/data/wwwroot/www.want.com/core/driver/');abstract class Example(){ private function __construct() { } public static function factory($type) { if(include_once(DRIVER.$type.'.php')) { return ExampleSon::singleton($type); } else { throw new Exception("Driver is not found! "); } } }class ExampleSon implements Example{ // Hold an instance of the class private static $instance; //靜態私有的類別實例// A private constructor; prevents direct creation of object private function __construct() { echo ' I am constructed'; } // The singleton method public static function singleton() { if (!isset(self::$instance)) { //如果沒有設定靜態私有類別實例,創建之$c = __CLASS__; //取得類別名稱self::$instance = new $c } return self::$instance; } // Example method public function bark() { echo 'Woof!'; } // Prevent users to clone the instance public function __clone( ) //不允許被複製{ trigger_error('Clone is not allowed.', E_USER_ERROR);
}}關鍵字:
1 私有靜態成員變數
2 __CLASS__當前類別名稱4 覆蓋__clone()方法
----十個字:私有靜態量,公共靜態法--------
2. 例舉幾個常用的魔術方法, 並說明作用? 如何在打印一個物件的時候展示我們自訂的內容?
魔術函數
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 新加)。傳回該方法被定義時的名字(區分大小寫)。
3. 類別靜態方法與實例化類別方法比較及優缺點
4. 有論壇
threads表記錄主題以及標題等資訊
posts表記錄主題內容以及回覆內容等資訊
threads 表主鍵為tid
posts 表主鍵為pid, 所屬主題標記為tid
透過tid將threads和posts 一對多關聯起來
現在資料量posts表達到了1億, threads表2000萬, 大約一個主題有5篇回覆
請你設計一下分錶, 將posts表和threads表進行mysql分錶
5. 現在有一個mysql 主庫/叢庫, 請問php mysql查詢的時候怎麼在php程序中實現主從分離? 主從分離有什麼好處配置主從數組文件,自己封鎖幾個model函數,查詢的載入slave配置實例化,破壞資料的操作載入master進行實例化優點:並發負載能力提高,利於資料維護與安全性,提高可用性缺點:資料同步有些延遲
6 . 簡述UCenter的單一登入機制
所謂單一登錄,無非就是幾個站點共用一個使用者中心,實現同步登陸,同步退出。
其實最後還是使用者去登錄,只是採用了ajax (javascript利用src非同步跨域呼叫)使用者不會發現。
而且利用了p3p頭實現了,不同域名,單點登錄(ucenter用的cookie)
缺點就是採用ajax 客服端請求 ,如果有10個以上應用,登錄速度就慢下來了。
7. linux相關有一個套件http://www.120.net/test-1.0.0.tar.gz
a. 將它下載到/usr/local/src
b. 將其原始碼編譯安裝到/ usr/local/test 目錄
c. 他依賴mysql包, 位於/usr/local/mysql 目錄
寫出下載編譯安裝過程
wget - c http://www.120.net/test-1.0.0.tar .gz/usr/local/srctar zxvf /usr/local/src/test-1.0.0.tar.gzcd /usr/local/src/test-1.0.0./configure --prefix=/usr/local/test --exec--prefix=/usr/local/mysqlmake testmake install
8. 使用php 的memcache擴充寫一個取得資料的函數(快取即將過期逾時加鎖)
a. 資料逾時之後去mysql取得, 取得完後加鎖)
a. 資料逾時之後去mysql獲取, 取得完後更新memcache
b. 去mysql取得資料的時候加鎖, 讓一個行程去mysql拉資料, 其他人回傳memcache中的資料 🎜public function get_cache($key) { if($this->memcahe) { $var = $this->memcahe->get($this->pre.$key); $valid = $this->memcahe->get ($this->pre.$key.'_valid'); if($var && !$valid) { $lock = $this->memcahe->get($this->pre.$key.'_lock') ; if(!$lock) { $this->memcahe->set($this->pre.$key.'_lock', true, 0, 60); return false; } } return $var; } return false; }
public function set_cache($key, $var = null, $expire = 0) { if($this->memcahe) { $expire = (int)$expire; $expire = ($expire ? $expire : $this ->expire); $this->memcahe->set($this->pre.$key, $var, 0, $expire+300); $this->memcahe->set($this->pre.$ key.'_lock', false, 0, $expire); $this->memcahe->set($this->pre.$key.'_valid', true, 0, $expire); return true; } return false ; }
9. 簡述隊列, 堆疊的原理
都可以看做是一維數組來操作,隊列先進先出,出列只能在列頭,進列只能在列尾,堆疊是後進先出,進棧和出棧都是從棧頂
堆疊的工作原理是什麼?
堆疊是一種抽象資料結構,其操作機理是後進先出。當你把新條目推進堆疊時,已經在堆疊內的任何條目都會壓到堆疊的深處。同樣的,把一個條目從堆疊移出則會讓堆疊內的其他條目都往堆疊的頂端移動。只有堆疊最頂端的條目能從堆疊中取出,條目離開堆疊的順序和它們被推進堆疊的順序一樣。你不妨回想下自動販賣機的裝貨和取貨過程就明白了。
10. arrayaccess 定義如下用它實作一個陣列
ArrayAccess {
/* Methods */
abstract public boolean offsetExists ( string $offset )
tract public mixed setup $offset , string $value )
abstract public void offsetUnset ( string $offset )
}
class Single implements 阿爾= self::$_Instance) { self::$_Instance = new Single(); } return self::$_Instance; } public function setName($name) { $this->name = $name; } public function getName( ) { return $this->name; } /*** 實作四個方法* offsetExists(),用於識別一個元素是否已定義* offsetGet(),用於傳回一個元素的值* offsetSet(),用於為一個元素設定新值* offsetUnset(),用於刪除一個元素和對應的值 **/ public function offsetSet($offset, $value) { if (is_null($offset)) { $this->container[] = $value; } else { $this->container[$offset] = $value; } } public function offsetGet($offset) { return isset($this->container[$offset]) ? $this->container[$offset] : null ; } public function offsetExists($offset) { return isset($this->container[$offset]); } public function offsetUnset($offset) { unset($this->container[$offset]); }}$s = Single::load();$s->setName("jack");$s["name"] = "mike";echo $s->getName(); //jackecho $s["name"] ; //mike
11. 假設coreseek安裝目錄為/usr/local/coreseek
設定檔為/usr/local/coreseek/etc/test.conf
索引名為post
a. 建立索引
b. c. 重建索引(重建過程中保證搜尋服務仍可用)
indexer -c /usr/local/coreseek/etc/test.conf --allsearchd -c /usr/local/coreseek/etc/test.conf indexer -c /usr/local/coreseek/etc/test.conf --all --rotate12. 假設您有一張posts帖子表對該表進行sphinx增量準實時索引, 描述你的方案
使用“主索引+增量索引「方法有個簡單的實現,在資料庫中增加一個計數表,記錄每次重新建構主索引時,被索引表的最後一個資料id,這樣在增量索引時只需要索引這個id以後的資料即可,每次重新建構主索引時都更新這個表。
13. php程式碼:
$i = 97;$a = ($i++) + (++$i) + $i ;$b = (--$i) + ($i--) + $i + 6;
echo "$i, $a, $b";輸出結果是什麼
97, 295, 299
97
97+99+99
98+98+97+697+99+99
98+98+97+6 14. 下列程式碼,用於取得客戶端IP: if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) { $onlineip = getenv('HTTP_CLIENT_IP'); ('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) { $onlineip = getenv('HTTP_X_FORWARDED_FOR');} elseif(getenv('HTTP_X_FORWARDED_FOR');} elseif(getenv('HT)、cDDDDDDform.St. 'unknown')) { $onlineip = getenv('REMOTE_ADDR');} elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDRn', 'Nunk ')) { $onlineip = $_SERVER['REMOTE_ADDR'];}但是以HTTP_開始的請求header均屬於客戶端可以偽造的信息,在反向代理環境下,如何保證PHP不會接收到偽造的HTTP_CLIENT_IP , HTTP_X_FORWARDED_FOR值?
15. 例如google,baidu等大型網站,當使用不同客戶端(如手機和PC機)訪問相同的URL時,呈現的頁面卻不相同,這是何原理? 如果能給出實際解決方案,可加分。
簡單的可以用user_agent判斷,但是及其初步
可以的話通過伺服器或手機終端特徵或wap網關accept資訊等
16. 生產環境php.ini中magic_quotes_gpc及magic_quotes_runtime值應該設定為什麼? onoff17. PHP呼叫遠端http介面時可使用file_get_contents, 但當遠端主機不可達或回應過慢,會導致本地PHP進程被長時間掛起,從而影響本地伺服器穩定性,如何避免逾時時,PHP進程長時間掛起?
file_get_contents可以設定下逾時時間$ctx = stream_context_create(array( 'http' => array( 'timeout' => 1
)
)
);
file_ com/", 0, $ctx);
curl實作取得遠端http介面也可以,同樣需要設定逾時時間curl_setopt($s,CURLOPT_TIMEOUT,$timeout);
18. 同上題,如何避免DNS查詢過慢導致逾時? 19. mysql字元集set names * 指令設定哪幾個系統變數的值? (ACE) A、Character_set_client B、Character_set_system C、Character_set_results D、Character_set_server E、Character_set_connection F、Character_set_database20. 下列哪一種校對規則不區分大小寫? (A) A、utf8_general_ci B、utf8_general_cs C、utf8_general_bin21. 如何杜絕XSS攻擊?
strip_tags可以初步過濾,也可以自己寫過濾函數針對特殊標籤進行處理,用ascii碼進行替換23. 杜絕CSRF Web應用程式側防禦CSRF漏洞,一般都是利用referer、token或驗證碼,tokenf方式還是比較可信