亚洲精品中文字幕无乱码_久久亚洲精品无码AV大片_最新国产免费Av网址_国产精品3级片

php語(yǔ)言

PHP最牛面試題

時(shí)間:2024-08-07 04:11:48 php語(yǔ)言 我要投稿
  • 相關(guān)推薦

PHP最牛面試題推薦

  越來(lái)越多的企業(yè)在面試程序員的時(shí)候會(huì)出一些面試題給面試者,那么有哪些面試題是值得參考的呢?以下是小編為大家搜索整理的PHP最牛面試題推薦,希望能給大家?guī)?lái)幫助!更多精彩內(nèi)容請(qǐng)及時(shí)關(guān)注我們應(yīng)屆畢業(yè)生考試網(wǎng)!

PHP最牛面試題推薦

  1.nginx使用哪種網(wǎng)絡(luò)協(xié)議?

  nginx是應(yīng)用層 我覺(jué)得從下往上的話 傳輸層用的是tcp/ip 應(yīng)用層用的是http

  fastcgi負(fù)責(zé)調(diào)度進(jìn)程

  2. 沒(méi)有輸出結(jié)果, 可能是什么原因, 簡(jiǎn)述的解決此問(wèn)題的過(guò)程(提示: 語(yǔ)法沒(méi)有問(wèn)題)

  可能服務(wù)器上面沒(méi)有開(kāi)啟短標(biāo)簽short_open_tag =設(shè)置為Off,,php.ini開(kāi)啟短標(biāo)簽控制參數(shù): short_open_tag = On

  3. 簡(jiǎn)述下面程序的輸出結(jié)果, 簡(jiǎn)要說(shuō)明為什么, 如何解決這類問(wèn)題?

  $tmp = 0 == "a"? 1: 2;

  echo $tmp;

  ?>

  結(jié)果 1 int和string類型強(qiáng)制轉(zhuǎn)換造成的,0==="a"

  0 == 0 肯定是true啊

  PHP是弱類型。。

  $tmp = 0 === "a"? 1: 2;

  echo $tmp; 這樣就是2

  4. 已知一個(gè)字符串如下: $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, "%d\t%s %s", $id, $first, $last);

  5. 分別列出如下類型的有符號(hào)和無(wú)符號(hào)范圍 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. 將下面的數(shù)組用一行拼裝成一個(gè)字符串i am milo! day day up!

  $arr = array(

  'I', 'AM', 'MILO!', 'DAY', 'DAY', 'UP!'

  );

  ?>

  $str = strtolower(implode(" ",$arr));

  7. 調(diào)用如下函數(shù)獲取函數(shù)并獲取count的值

  function get_list($cnd = array(), &$count = false)

  {

  // 偽代碼 處理$cnd 并賦值datas

  $datas = 'i am call back';

  $count && $count = rand(1, 10000);

  return $datas;

  }

  ?>

  $count=1;

  $data = get_list($cnd,&$count);

  echo $count;

  8. 幾種方式去取代session機(jī)制, 簡(jiǎn)單描述各自的優(yōu)劣

  mysql、memcache、cookie保持一種唯一狀態(tài)標(biāo)識(shí)碼

  9. 下列HTTP狀態(tài)碼出現(xiàn)的可能原因, 如何處理

  200, 301, 404, 502, 503

  200

  請(qǐng)求已成功,請(qǐng)求所希望的響應(yīng)頭或數(shù)據(jù)體將隨此響應(yīng)返回。

  301

  被請(qǐng)求的資源已永久移動(dòng)到新位置,并且將來(lái)任何對(duì)此資源的引用都應(yīng)該使用本響應(yīng)返回的若干個(gè) URI 之一。如果可能,擁有鏈接編輯功能的客戶端應(yīng)當(dāng)自動(dòng)把請(qǐng)求的地址修改為從服務(wù)器反饋回來(lái)的地址。除非額外指定,否則這個(gè)響應(yīng)也是可緩存的。   新的永久性的 URI 應(yīng)當(dāng)在響應(yīng)的 Location 域中返回。除非這是一個(gè) HEAD 請(qǐng)求,否則響應(yīng)的實(shí)體中應(yīng)當(dāng)包含指向新的 URI 的超鏈接及簡(jiǎn)短說(shuō)明。   如果這不是一個(gè) GET 或者 HEAD 請(qǐng)求,因此瀏覽器禁止自動(dòng)進(jìn)行重定向,除非得到用戶的確認(rèn),因?yàn)檎?qǐng)求的條件可能因此發(fā)生變化。   注意:對(duì)于某些使用 HTTP/1.0 協(xié)議的瀏覽器,當(dāng)它們發(fā)送的 POST 請(qǐng)求得到了一個(gè)301響應(yīng)的話,接下來(lái)的重定向請(qǐng)求將會(huì)變成 GET 方式。

  404

  請(qǐng)求失敗,請(qǐng)求所希望得到的資源未被在服務(wù)器上發(fā)現(xiàn)。沒(méi)有信息能夠告訴用戶這個(gè)狀況到底是暫時(shí)的還是永久的。假如服務(wù)器知道情況的話,應(yīng)當(dāng)使用410狀態(tài)碼來(lái)告知舊資源因?yàn)槟承﹥?nèi)部的配置機(jī)制問(wèn)題,已經(jīng)永久的不可用,而且沒(méi)有任何可以跳轉(zhuǎn)的地址。404這個(gè)狀態(tài)碼被廣泛應(yīng)用于當(dāng)服務(wù)器不想揭示到底為何請(qǐng)求被拒絕或者沒(méi)有其他適合的響應(yīng)可用的情況下。

  502

  作為網(wǎng)關(guān)或者代理工作的服務(wù)器嘗試執(zhí)行請(qǐng)求時(shí),從上游服務(wù)器接收到無(wú)效的響應(yīng)。

  503

  由于臨時(shí)的服務(wù)器維護(hù)或者過(guò)載,服務(wù)器當(dāng)前無(wú)法處理請(qǐng)求。這個(gè)狀況是臨時(shí)的,并且將在一段時(shí)間以后恢復(fù)。如果能夠預(yù)計(jì)延遲時(shí)間,那么響應(yīng)中可以包含一個(gè) Retry-After 頭用以標(biāo)明這個(gè)延遲時(shí)間。如果沒(méi)有給出這個(gè) Retry-After 信息,那么客戶端應(yīng)當(dāng)以處理500響應(yīng)的方式處理它。   注意:503狀態(tài)碼的存在并不意味著服務(wù)器在過(guò)載的時(shí)候必須使用它。某些服務(wù)器只不過(guò)是希望拒絕客戶端的連接。

  200 OK 一切正常,對(duì)GET和POST請(qǐng)求的應(yīng)答文檔跟在后面。

  301 Moved Permanently 客戶請(qǐng)求的文檔在其他地方,新的URL在Location頭中給出,瀏覽器應(yīng)該自動(dòng)地訪問(wèn)新的URL

  404 Not Found 無(wú)法找到指定位置的資源。這也是一個(gè)常用的應(yīng)答。

  502 Bad Gateway 服務(wù)器作為網(wǎng)關(guān)或者代理時(shí),為了完成請(qǐng)求訪問(wèn)下一個(gè)服務(wù)器,但該服務(wù)器返回了非法的應(yīng)答。

  503 Service Unavailable 服務(wù)器由于維護(hù)或者負(fù)載過(guò)重未能應(yīng)答。例如,Servlet可能在數(shù)據(jù)庫(kù)連接池已滿的情況下返回503。服務(wù)器返回503時(shí)可以提供一個(gè)Retry-After頭。

  10. 有如下數(shù)據(jù)庫(kù), 用原生態(tài)mysql擴(kuò)展去連接并查詢user表的前十行

  host: 192.168.0.254

  port: 3306

  user: one

  pass: piece

  database: db_user

  table: user

  $link = mysql_connect("192.168.0.254:3306","one","piece") or die('Could not connect: '.mysql_error());

  mysql_select_db('db_user',$link);

  $query = mysql_query("select * from user limit 10");

  while($rs = mysql_fetch_array($query,MYSQL_ASSOC))

  {}

  11. 用autoload($class) 實(shí)現(xiàn)Lib目錄下的類的自動(dòng)加載并可以兼容子目錄

  $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");

  }

  }

  defined("LIB",'/data/wwwroot/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($cls[1].".php"))

  {

  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);

  }

  function get_file($dir)

  {

  if(is_array($dir))

  {

  foreach($dir as $k=>$v)

  {

  $tmpdir .= $v.'/';

  if(is_dir('CON_PATH'.$tmpdir))

  {

  continue();

  }

  else if(is_file('CON_PATH'.$tmpdir.".php"))

  {

  return 'CON_PATH'.$tmpdir.".php";

  }

  else

  {

  return 'error';

  }

  }

  return 'error';

  }

  return 'error';

  }

  defined("CON_PATH","/data/wwwroot/www.xx.com/app/cntroller/");

  $sb = new controller_sb();

  ------------------------------------

  function __autoload_my_classes($classname)

  {

  # ... your logic to include classes here

  }

  spl_autoload_register('__autoload_my_classes');

  -----------------------------------------------------------

  12. 用set_error_handle 去捕獲錯(cuò)誤并輸出, 級(jí)別自己定

  set_error_handle(callback,level)

  function callback(int $errno , string $errstr [, string $errfile [, int $errline [, array $errcontext ]]] ){

  }

  function dealErrorHandler($errno,$errstr,$errfile,$errline)

  {

  switch($errno){

  case E_USER_ERROR:

  echo "error [$errno] $errstr fatal error on line $errline in file $errfile";

  break;

  case E_USER_WARNING:

  echo "my warning [$errno] $errstr":

  break;

  case E_USER_NOTICE:

  echo "my notice[$errno] $errstr";

  break;

  default:

  echo "unkonwn error type :[$errno] $errstr";

  break;

  }

  }

  set_erro_handler(dealErrorHandler);

  trigger_error("notice", E_USER_NOTICE);

  trigger_error("warning", E_USER_WARNING);

  trigger_error("error", E_USER_ERROR);

  13. 簡(jiǎn)述兩種屏蔽php程序的notice警告的方法

  初始化變量,文件開(kāi)始設(shè)置錯(cuò)誤級(jí)別或者修改php.ini 設(shè)置error_reporting

  set_error_handler 和 @抑制錯(cuò)誤

  1.在程序中添加:error_reporting (E_ALL & ~E_NOTICE);

  2.或者修改php.ini中的:error_reporting = E_ALL

  改為:error_reporting = E_ALL & ~E_NOTICE

  3.error_reporting(0);或者修改php.inidisplay_errors=Off

  14. instanceof的作用, 經(jīng)常在什么設(shè)計(jì)模式中使用

  單例模式,但是其他的模式也會(huì)用到

  15. 1023用二進(jìn)制表示, 并簡(jiǎn)述計(jì)算過(guò)程

  10-2

  1023%2=1

  511%2 =1

  255%2 =1

  127%2 =1

  63%2 =1

  31%2 =1

  15%2 =1

  7%2 =1

  3%2 =1

  1%2 =1

  0 =0

  -------------------------------------------

  1023

  2^9=

  511

  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

  只需用將二進(jìn)制數(shù)的各個(gè)位上的數(shù)從最右邊開(kāi)始,最右邊的第一個(gè)數(shù)乘以二的零次方,第二個(gè)數(shù)乘以二的一次方,第三個(gè)數(shù)乘以二的二次方,依次類推可得第n個(gè)數(shù)乘以二的(n-1)次方,然后把得到的結(jié)果相加即可

  例如:110011=1*2^0+1*2^1+0*2^2+0*2^3+1*2^4+1*2^5=51

  這也可以算是一個(gè)公式就是An*2^(n-1) An表示二進(jìn)制數(shù)最右邊開(kāi)始的第n個(gè)數(shù),

  將第一項(xiàng)第二項(xiàng)第三項(xiàng)一直到第n項(xiàng)用式子An*2^(n-1) 計(jì)算出來(lái)并加在一起即可

  16. 下面php程序輸出的內(nèi)容是什么? 為什么?

  $str = "aa\tbb\tcc";

  @list($a, $b, $c) = explode('\t', $str);

  echo $a,$b,$c;

  ?>

  aabbcc;//'\t'不會(huì)以\t切割字符串,explode之后申城一個(gè)array(0=>"aa\tbb\tcc")所以。。。,'\t'換成"\t"就被切割

  17. include和require 分別返回什么錯(cuò)誤級(jí)別

  include會(huì)系統(tǒng)警告并繼續(xù)執(zhí)行,require會(huì)發(fā)出系統(tǒng)警告但是會(huì)引致致命錯(cuò)誤令腳本終止運(yùn)行

  18. 現(xiàn)有一個(gè)函數(shù), 有不確定多少個(gè)的參數(shù)(可能有5個(gè)也可能有50個(gè)), 如何去定義這個(gè)函數(shù)

  方法一: 不借助php內(nèi)置函數(shù)

  方法二: 提示func_num_args() func_get_arg() unc_get_args()

  function param()

  {

  $numargs = func_num_args();

  echo "Number of arguments: $numargs

  \n";

  if ($numargs >= 2) {

  echo "Second argument is: " . func_get_arg(1) . "

  \n";

  }

  $arg_list = func_get_args();

  for ($i = 0; $i < $numargs; $i++) {

  echo "Argument $i is: " . $arg_list[$i] . "

  \n";

  }

  }

  param(1,2,3,4,5);

  /**

  2 * 例子寫(xiě)完后,本來(lái)認(rèn)為完事了,結(jié)果遇到有人問(wèn)call_user_func_array(),看了一下手冊(cè)

  3 * 原來(lái),我上面的那個(gè)test函數(shù)還可以精簡(jiǎn)成如下的例子,

  4 */

  5 function otest1 ($a)

  6 {

  7 echo( '一個(gè)參數(shù)' );

  8 }

  9

  10 function otest2 ( $a,$b)

  11 {

  12 echo( '二個(gè)參數(shù)' );

  13 }

  14

  15 function otest3 ( $a,$b,$c)

  16 {

  17 echo( '三個(gè)啦' );

  18 }

  19

  20 function otest ()

  21 {

  22 $args=func_get_args();

  23 $num=func_num_args();

  24 call_user_func_array( 'otest'.$num,$args );

  25 }

  26

  27 otest(1,2);

  19. 在一個(gè)函數(shù)(該函數(shù)沒(méi)有return語(yǔ)句)里面去處理全局變量, 并且改變他的值, 用兩種方法去實(shí)現(xiàn)(global和引用&)

  $var=1;

  function get_pra()

  {

  global $var;

  $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. 應(yīng)用中我們經(jīng)常會(huì)遇到在user表隨機(jī)調(diào)取10條數(shù)據(jù)來(lái)展示的情況, 簡(jiǎn)述你如何實(shí)現(xiàn)該功能, 不能使用sql函數(shù)以及order by等語(yǔ)句

  表 user 字段uid, username

  估計(jì)一個(gè)user表中的區(qū)間,在此區(qū)間用php去一個(gè)隨機(jī)數(shù),sql語(yǔ)句大于或者小于此id去limit幾十條(保證10條數(shù)據(jù)),再不夠散亂的話,取出來(lái)的數(shù)據(jù)shuffle函數(shù)打亂數(shù)組,array_rand隨即取出10個(gè)

  21. 假設(shè)下面的sql語(yǔ)句里面的uid都能獲取到具體值, 經(jīng)過(guò)下面語(yǔ)句查詢后uid的順序是什么, 如何去按照uid in 輸入的順序去排序

  select uid from user where uid in(10, 1, 3, 8, 11, 4, 7);

  可觀的結(jié)果是1,3,4,7,8,10,11升序,有種情況特殊就是不確定因?yàn)橹虚g的某些id人為直接修改可能不是升序了,如果按照uid in的順序需要重新循環(huán)一次根據(jù)id獲取查詢結(jié)果數(shù)組中的值放進(jìn)新數(shù)組中即可

  22. 用PHP將一個(gè)字符串中的字母替換成**

  preg_replace('/[a-zA-Z]*/','**',$str);

  如果指定的字符就可以str_replace('ooxx','**',$str);

  23. 下面2.php中打印結(jié)果是什么? 為什么? 執(zhí)行順序1.php->2.php

  cookie,cookie時(shí)間就有問(wèn)題time()+3600

  24. 簡(jiǎn)述php常用的json編碼函數(shù), 如何將json解碼的時(shí)候返回?cái)?shù)組

  25. mysql 在sql語(yǔ)句中有' / 等詞的時(shí)候, 要對(duì)sql語(yǔ)句的每個(gè)具體值做些什么處理

  mysql_real_escape_string

  26. 如何在php中設(shè)置header頭信息

  header('');

  27.有如下幾個(gè)腳本, 請(qǐng)問(wèn)2.php的輸出結(jié)果

  1.php

  setcookie('test', 'cookie_test', 3600);

  ?>

  2.php

  $cookie = isset($_COOKIE['test'])? $_COOKIE['test']: 'cookie';

  echo $cookie;

  ?>

  i am here

  1

  總結(jié)

  a.如果include或include_once不是在函數(shù)或方法中被調(diào)用,則輸出結(jié)果均一樣。

  b.如果include或 include_once在函數(shù)或方法中被調(diào)用,則如果想讓第二次及以后調(diào)用時(shí)有結(jié)果,則必須用include,而不能用include_once,這一點(diǎn)一定要注意。

  28. 簡(jiǎn)述call_user_func的功能

  調(diào)用函數(shù)或者類里面的函數(shù),返回第一個(gè)參數(shù)的值。類似的功能call_user_func_array

  29. 訪假設(shè)nginx已經(jīng)配置server_name www.120.net xxx.120.net

  訪問(wèn)問(wèn)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 用數(shù)字表示其權(quán)限是

  目錄權(quán)限為755所有者u擁有讀寫(xiě)修改權(quán)限所屬組g擁有讀、修改權(quán)限所屬組之外o的擁有讀和修改權(quán)限

  31. 寬帶的1Mbps理論上的下載速度是多少KBps, 計(jì)算的方法

  1*1024/8

  1M=1024KB

  1KB=1024B

  1B=8bit

 第二部分

  1. 簡(jiǎn)單實(shí)現(xiàn)一個(gè)單例+工廠的設(shè)計(jì)模式abstract class Example{ // The parameterized factory method public static function factory($type) { if (include_once 'Drivers/' . $type . '.php') {

  $classname = 'Driver_' . $type;

  return new $classname;

  } else {

  throw new Exception ('Driver not found');

  }

  }}// Load a MySQL Driver$mysql = Example::factory('MySQL');

  // Load a SQLite Driver

  $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; //靜態(tài)私有的類實(shí)例 // 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)) { //如果沒(méi)有設(shè)置靜態(tài)私有類實(shí)例,創(chuàng)建之 $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);

  }}關(guān)鍵詞:

  1 私有靜態(tài)成員變量

  2 __CLASS__獲取當(dāng)前類名

  3 公共靜態(tài)方法獲取單例

  4 覆蓋__clone()方法

  ----十個(gè)字:私有靜態(tài)量,公共靜態(tài)法--------

  2. 例舉幾個(gè)常用的魔術(shù)方法, 并說(shuō)明作用? 如何在打印一個(gè)對(duì)象的時(shí)候展示我們自定義的內(nèi)容?

  魔術(shù)函數(shù)

  1。__construct()

  實(shí)例化對(duì)象時(shí)被調(diào)用,

  當(dāng)__construct和以類名為函數(shù)名的函數(shù)同時(shí)存在時(shí),__construct將被調(diào)用,另一個(gè)不被調(diào)用。

  2。__destruct()

  當(dāng)刪除一個(gè)對(duì)象或?qū)ο蟛僮鹘K止時(shí)被調(diào)用。

  3。__call()

  對(duì)象調(diào)用某個(gè)方法,

  若方法存在,則直接調(diào)用;

  若不存在,則會(huì)去調(diào)用__call函數(shù)。

  4。__get()

  讀取一個(gè)對(duì)象的屬性時(shí),

  若屬性存在,則直接返回屬性值;

  若不存在,則會(huì)調(diào)用__get函數(shù)。

  5。__set()

  設(shè)置一個(gè)對(duì)象的屬性時(shí),

  若屬性存在,則直接賦值;

  若不存在,則會(huì)調(diào)用__set函數(shù)。

  6。__toString()

  打印一個(gè)對(duì)象的時(shí)被調(diào)用。如echo $obj;或print $obj;

  7。__clone()

  克隆對(duì)象時(shí)被調(diào)用。如:$t=new Test();$t1=clone $t;

  8。__sleep()

  serialize之前被調(diào)用。若對(duì)象比較大,想刪減一點(diǎn)東東再序列化,可考慮一下此函數(shù)。

  9。__wakeup()

  unserialize時(shí)被調(diào)用,做些對(duì)象的初始化工作。

  10。__isset()

  檢測(cè)一個(gè)對(duì)象的屬性是否存在時(shí)被調(diào)用。如:isset($c->name)。

  11。__unset()

  unset一個(gè)對(duì)象的屬性時(shí)被調(diào)用。如:unset($c->name)。

  12。__set_state()

  調(diào)用var_export時(shí),被調(diào)用。用__set_state的返回值做為var_export的返回值。

  13。__autoload()

  實(shí)例化一個(gè)對(duì)象時(shí),如果對(duì)應(yīng)的類不存在,則該方法被調(diào)用。

  魔術(shù)常量

  1。__LINE__

  返回文件中的當(dāng)前行號(hào)。

  2。__FILE__

  返回文件的'完整路徑和文件名。如果用在包含文件中,則返回包含文件名。自 PHP 4.0.2 起,__FILE__ 總是包含一個(gè)絕對(duì)路徑,而在此之前的版本有時(shí)會(huì)包含一個(gè)相對(duì)路徑。

  3。__FUNCTION__

  返回函數(shù)名稱(PHP 4.3.0 新加)。自 PHP 5 起本常量返回該函數(shù)被定義時(shí)的名字(區(qū)分大小寫(xiě))。在 PHP 4 中該值總是小寫(xiě)字母的。

  4。__CLASS__

  返回類的名稱(PHP 4.3.0 新加)。自 PHP 5 起本常量返回該類被定義時(shí)的名字(區(qū)分大小寫(xiě))。在 PHP 4 中該值總是小寫(xiě)字母的。

  5。__METHOD__

  返回類的方法名(PHP 5.0.0 新加)。返回該方法被定義時(shí)的名字(區(qū)分大小寫(xiě))。

  3. 類靜態(tài)方法和實(shí)例化類方法比較及優(yōu)缺點(diǎn)

  4. 有一個(gè)論壇

  threads表記錄主題以及標(biāo)題等信息

  posts表記錄主題內(nèi)容以及回復(fù)內(nèi)容等信息

  threads 表主鍵為 tid

  posts 表主鍵為 pid, 所屬主題標(biāo)記為tid

  通過(guò)tid將threads和posts 一對(duì)多關(guān)聯(lián)起來(lái)

  現(xiàn)在數(shù)據(jù)量posts表達(dá)到了1億, threads表2000萬(wàn), 大約一個(gè)主題有5篇回復(fù)

  請(qǐng)你設(shè)計(jì)一下分表, 將posts表和threads表進(jìn)行mysql分表

  5. 現(xiàn)在有一個(gè)mysql 主庫(kù)/叢庫(kù), 請(qǐng)問(wèn)php mysql查詢的時(shí)候怎么在php程序中實(shí)現(xiàn)主從分離? 主從分離有什么好處配置主從數(shù)組文件,自己封轉(zhuǎn)幾個(gè)model函數(shù),查詢的加載slave配置實(shí)例化,破壞數(shù)據(jù)的操作加載master進(jìn)行實(shí)例化優(yōu)點(diǎn):并發(fā)負(fù)載能力提高,利于數(shù)據(jù)維護(hù)和安全,提高可用性缺點(diǎn):數(shù)據(jù)同步有些延遲

  6. 簡(jiǎn)述UCenter的單點(diǎn)登錄機(jī)制

  所謂單點(diǎn)登錄,無(wú)非就是幾個(gè)站點(diǎn)共用一個(gè)用戶中心,實(shí)現(xiàn)同步登陸,同步退出。

  其實(shí)最終還是用戶去登錄,只是采用了ajax (javascript利用src異步跨域調(diào)用)用戶不會(huì)發(fā)現(xiàn)。

  而且利用了p3p頭實(shí)現(xiàn)了,不同域名,單點(diǎn)登錄(ucenter用的cookie)

  缺點(diǎn)就是采用ajax 客服端請(qǐng)求 ,如果有10個(gè)以上應(yīng)用,登錄速度就慢下來(lái)了。

  7. linux相關(guān) 有一個(gè)包 http://www.120.net/test-1.0.0.tar.gz

  a. 將它下載到/usr/local/src

  b. 將其源碼編譯安裝到/usr/local/test 目錄

  c. 他依賴mysql包, 位于/usr/local/mysql 目錄

  寫(xiě)出下載編譯安裝過(guò)程

  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擴(kuò)展編寫(xiě)一個(gè)獲取數(shù)據(jù)的函數(shù)(緩存即將過(guò)期超時(shí)加鎖)

  a. 數(shù)據(jù)超時(shí)之后去mysql獲取, 獲取完后更新memcache

  b. 去mysql獲取數(shù)據(jù)的時(shí)候加鎖, 讓一個(gè)進(jìn)程去mysql拉數(shù)據(jù), 其他人返回memcache中的數(shù)據(jù)

  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. 簡(jiǎn)述隊(duì)列, 堆棧的原理

  都可以看做是一維數(shù)組來(lái)操作,隊(duì)列先進(jìn)先出,出列只能在列頭,進(jìn)列只能在列尾,堆棧是后進(jìn)先出,進(jìn)棧和出棧都是從棧頂

  堆棧的工作原理是什么?

  堆棧是一種抽象數(shù)據(jù)結(jié)構(gòu),其操作機(jī)理是后進(jìn)先出。當(dāng)你把新條目推進(jìn)堆棧時(shí),已經(jīng)在堆棧內(nèi)的任何條目都會(huì)壓到堆棧的深處。同樣的,把一個(gè)條目從堆棧移出則會(huì)讓堆棧內(nèi)的其他條目都向堆棧的頂部移動(dòng)。只有堆棧最頂端的條目能從堆棧中取出,條目離開(kāi)堆棧的順序和它們被推進(jìn)堆棧的順序一樣。你不妨回想下自動(dòng)售貨機(jī)的裝貨和取貨過(guò)程就明白了。

  10. arrayaccess 定義如下 用它實(shí)現(xiàn)一個(gè)數(shù)組

  ArrayAccess {

  /* Methods */

  abstract public boolean offsetExists ( string $offset )

  abstract public mixed offsetGet ( string $offset )

  abstract public void offsetSet ( string $offset , string $value )

  abstract public void offsetUnset ( string $offset )

  }

  class Single implements ArrayAccess{ private $name; private static $_Instance = null; private function __construct() { } static function load() { if(null == self::$_Instance) { self::$_Instance = new Single(); } return self::$_Instance; } public function setName($name) { $this->name = $name; } public function getName() { return $this->name; } /** * 實(shí)現(xiàn)四個(gè)方法 * offsetExists(),用于標(biāo)識(shí)一個(gè)元素是否已定義 * offsetGet(),用于返回一個(gè)元素的值 * offsetSet(),用于為一個(gè)元素設(shè)置新值 * offsetUnset(),用于刪除一個(gè)元素和相應(yīng)的值 **/ 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. 假設(shè)coreseek安裝目錄為/usr/local/coreseek

  配置文件為/usr/local/coreseek/etc/test.conf

  索引名為 post

  a. 創(chuàng)建索引

  b. 啟動(dòng)服務(wù)

  c. 重建索引(重建過(guò)程中保證搜索服務(wù)仍然可用)

  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. 假設(shè)您有一張posts帖子表 對(duì)該表進(jìn)行sphinx增量準(zhǔn)實(shí)時(shí)索引, 描述你的方案

  使用“主索引+增量索引”方法有個(gè)簡(jiǎn)單的實(shí)現(xiàn),在數(shù)據(jù)庫(kù)中增加一個(gè)計(jì)數(shù)表,記錄每次重新構(gòu)建主索引時(shí),被索引表的最后一個(gè)數(shù)據(jù)id,這樣在增量索引時(shí)只需要索引這個(gè)id以后的數(shù)據(jù)即可,每次重新構(gòu)建主索引時(shí)都更新這個(gè)表。

  13. php代碼:

  $i = 97;$a = ($i++) + (++$i) + $i ;$b = (--$i) + ($i--) + $i + 6;

  echo "$i, $a, $b";輸出結(jié)果是什么

  97, 295, 299

  97

  97+99+99

  98+98+97+6

  14. 以下代碼,用于取得客戶端IP: if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) { $onlineip = getenv('HTTP_CLIENT_IP');} elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) { $onlineip = getenv('HTTP_X_FORWARDED_FOR');} elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) { $onlineip = getenv('REMOTE_ADDR');} elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) { $onlineip = $_SERVER['REMOTE_ADDR'];}但是以HTTP_開(kāi)始的請(qǐng)求header均屬于客戶端可以偽造的信息,在反向代理環(huán)境下,如何保證PHP不會(huì)接收到偽造的HTTP_CLIENT_IP, HTTP_X_FORWARDED_FOR值?

  15. 例如google,baidu等大型網(wǎng)站,當(dāng)使用不同客戶端(如手機(jī)和PC機(jī))訪問(wèn)同樣的URL時(shí),呈現(xiàn)的頁(yè)面卻不相同,這是何原理? 如果能給出實(shí)際解決方案,可加分。

  簡(jiǎn)單的可以用user_agent判斷,但是及其初步

  可以的話通過(guò)服務(wù)器或者手機(jī)終端特征或者wap網(wǎng)關(guān)accept信息等

  16. 生產(chǎn)環(huán)境php.ini中magic_quotes_gpc及magic_quotes_runtime值應(yīng)該設(shè)置為什么?onoff

       17. PHP調(diào)用遠(yuǎn)程http接口時(shí)可使用file_get_contents, 但當(dāng)遠(yuǎn)程主機(jī)不可達(dá)或響應(yīng)過(guò)慢,會(huì)導(dǎo)致本地PHP進(jìn)程被長(zhǎng)時(shí)間掛起,從而影響本地服務(wù)器穩(wěn)定性,如何避免超時(shí)時(shí),PHP進(jìn)程長(zhǎng)時(shí)間被掛起?

  file_get_contents可以設(shè)置下超時(shí)時(shí)間$ctx = stream_context_create(array( 'http' => array( 'timeout' => 1

  )

  )

  );

  file_get_contents("http://www.want.com/", 0, $ctx);

  curl實(shí)現(xiàn)獲取遠(yuǎn)程http接口也可以,同樣需要設(shè)置超時(shí)時(shí)間curl_setopt($s,CURLOPT_TIMEOUT,$timeout);

  18. 同上題,如何避免DNS查詢過(guò)慢導(dǎo)致超時(shí)?

    19. mysql字符集set names * 命令設(shè)置哪幾個(gè)系統(tǒng)變量的值?(ACE) A、Character_set_client B、Character_set_system C、Character_set_results D、Character_set_server E、Character_set_connection F、Character_set_database

     20. 以下哪種校對(duì)規(guī)則不區(qū)分大小寫(xiě)?(A) A、utf8_general_ci B、utf8_general_cs C、utf8_general_bin21. 如何杜絕XSS攻擊?

  strip_tags可以初步過(guò)濾,也可以自己寫(xiě)過(guò)濾函數(shù)針對(duì)特殊標(biāo)簽進(jìn)行處理,用ascii碼進(jìn)行替換23. 如何杜絕CSRF攻擊?

  在Web應(yīng)用程序側(cè)防御CSRF漏洞,一般都是利用referer、token或者驗(yàn)證碼,tokenf方式還是比較可信

【PHP最牛面試題】相關(guān)文章:

php面試題10-26

最新PHP面試題05-27

精選php面試題及答案06-01

PHP面試題集10-13

php應(yīng)聘面試題10-22

PHP面試題及答案06-27

PHP算法面試題及答案11-04

最新的PHP面試題及答案08-16

值得深思的PHP面試題10-23

PHP語(yǔ)言常用的面試題10-19