首頁  >  文章  >  後端開發  >  PHP面試總結

PHP面試總結

WBOY
WBOY原創
2016-07-29 09:14:511014瀏覽

  從8月15號來到北京一直到今天,一月有餘。來的這段時間一直準備筆試面試,大大小小的公司,亂七八糟面了10多家,近期才安頓下來。面試的這段時間感覺自己成長了不少。初來到這個陌生的城市一臉茫然,不會搭地鐵、不會有擠公車、不會恰如其分的生活。 。 。

  面試是進入職場的第一道坎,因為我本身學校太一般的問題在面試中遇到了各種不爽,和那些高學歷的相比自己真是信心大跌。我面試的方向是php開發工程師,主要做網站後台、APP介面等。我所面試的公司、試題、心得都在我的個人網站上,有興趣的可以看看:http://dwz.cn/1KMpea。 以下是我這段時間總結的面試方面的常考常問的知識點,希望對大家有所幫助,不對之處歡迎指出。

總結:

問題比較基礎

--------------------PHP部分--------------- ------

PHP中幾個輸出函數echo,print(),print_r(),sprintf(),var_dump()的區別

語句不是函數,沒有回傳值,輸出多個變數值,不需要圓括號。不能輸出陣列和

物件,只能列印簡單型別(如int,string)。

2:print:是語句不是函數,有回傳值 1 ,只能輸出一個變量,不需要圓括號。不能輸出陣列和

物件,只能列印簡單型別(如int,string)。

3:print_r:是函數,可以列印複合型,例如:stirng、int、float、array、object等,

         

         

         )來使print_r不輸出而回傳print_r處理後的值

4:printf:是函數,把文字格式化以後輸出(參考C語言)

5:sprintf:是函數,跟printf相似,但不印,而是回傳格式化後的文字(函數把格式化的字串寫入變數中,而不是輸出來),其   他的文字與printf一樣。

例如:   $str = "Hello";    $number = 123; 

=         鍵world. Day number 123 

6:var_dump():函數,輸出變數的內容、型別或字串的內容、型別、長度。常用來調試。

寫個函數來解決多執行緒同時讀取和寫入一個檔案的問題。

<span> 1</span> <?<span>php
</span><span> 2</span><span>$fp</span> = <span>fopen</span>("/tmp/lock.txt","w+"<span>);
</span><span> 3</span><span>if</span>(<span>flock</span>(<span>$fp</span>, LOCK_EX)){<span>//</span><span> 进行排它型锁定</span><span> 4</span><span>fwrite</span>(<span>$fp</span>,"Write something here\n"<span>);
</span><span> 5</span><span>flock</span>(<span>$fp</span>, LOCK_UN);<span>//</span><span> 释放锁定</span><span> 6</span>     }<span>else</span><span>{
</span><span> 7</span><span>echo</span> "Couldn't lock the file !"<span>;
</span><span> 8</span><span>    }
</span><span> 9</span><span>fclose</span>(<span>$fp</span><span>);
</span><span>10</span> ?>
禁掉cookie的Session使用方案,設定Session過期的方法,對應函數:

Session

id附加到url上(缺點:整個網站中不能有純靜態頁面,因為純靜態頁面

Session

id 將無法繼續傳到下一頁)

透過隱藏表單,把Session id 放到表單的隱藏文字方塊中同表單一塊提交過去(缺點:不適用標籤這種直接跳轉的非表單的情況)

直接配置php.ini檔案,將php.ini檔案裡的Session .use_trans_sid= 0設為1,(好像在win上不支援)

用檔案、資料庫等形式保存Session ID,在跨頁過程中手動呼叫

格式資料有哪些特點 

    JSON 一種輕量級的資料交換格式。它是基於ECMAScript的一個子集。 JSON採用完全獨立於語言的文字格式,但也使用了類似C語言家族的習慣(包括C、C++、C#、Java、JavaScript、Perl、 Python等)。這些特性使JSON成為理想的資料交換語言。 易於人閱讀和編寫,同時也易於機器解析和生成(網路傳輸速率)。

JSON的結構是基於下面兩點

1. "名稱/值"對的集合

 不同語言中,它被理解為

對象( 不同語言中,它被理解為

對象

( ),字典(dictionary),雜湊表(hash table),鍵列表(keyed list)等

2. 值的有序列表 多數語言中被理解為數組(array)  多數語言中被理解為數組(n)
 php取得文件內容的方法,對應的函數
1:file_get_contents得到檔案的內容(可以以get和post的方式取得),整個檔案讀入一個字串中

2:用fopen開啟url, 以get方式取得內容(使用fgets(2:用fopen開啟url, 以get )函數)

3:用fsockopen函數開啟url(可以以get和post的方式取得),以get方式取得完整的數據,包括header和body

4:使用curl函式庫取得內容,使用curl庫之前,需要查看php.ini,查看是否已經打開了curl擴充

php數組函數常見的那些? (array_merge、in_array的作用)

操作的基本函數

    array_values($arr);    //獲得陣列的值

得到數字鍵的數字組

    array_flip($arr );         //陣列中的值與鍵名互換(如果有重複前面的會被後面的覆蓋)

    array_search('PHP',$arr);   //檢索給定的值,true為嚴格型別檢查

    array_reverse($arr);            //將陣列中的元素翻轉(

  集數) 檢索在數組中 $.

    array_key_exists(" apple", $arr);    // 檢索給定的鍵名是否存在數組中

    array_count_values($arr);       

二、陣列的分段與填色

    array_slice($arr, 0, 3);    //可將陣列中的一段取出,此函數忽略鍵名(陣列的分段)

🠎 arr, 0, 3,array("black","maroon"));    //可以將數組中的一段取出,與上個函數不同在於返回的序列從原始數組中刪除

    array_chunk $arr, 3, TRUE);   //可以將一個陣列分割成多個,TRUE為保留原始數組的鍵名(分割多個數組)

 

四、陣列與棧,列隊

    array_push($arr, "apple", "pear");    //將一個或多個元素壓入陣列的末端(入堆疊元素的個端數

    array_pop($arr);    // 將陣列堆疊的最後一個元素彈出(出棧)

 長度減1,其他元素向前移動一位,數字鍵名改為從零計數,文字鍵名不變)

    array_unshift($arr,"a",array(1,2));  //在陣列的開頭插入一個或多個元素

六、數組的排序

    sort($arr);       //由小到大,因此鍵名由鍵名大到小,忽略鍵名

    asort($arr);     //由小到大,保留鍵名     

 arsort($arr);   /鍵名 保留鍵名      arsort($arr);   /
    ksort($arr);     //依鍵名正序排序          krsort($arr);   // 依鍵名逆序排序

七、陣列的計算

    array_sum($arr);   //對所有在陣列中的元素做求與運算(陣列元素的求和) /合併兩個或更多(相同字串鍵名,後面覆蓋前面,相同的數字鍵名,後面的附加到後面)

 

    array_diff(arr1, $arr /$ /回傳差集結果數組  array_diff_assoc($arr1, $arr2, $arr3);  //回傳差集結果數組,鍵名也做比較

 )回交集結果數組   array_intersect_assoc($arr1, $arr2);   //返回交集結果數組,鍵名也做比較 

八、其他的數組函數

八、其他的陣列陣列中重複的數值,新的陣列中會保留原始的鍵名

    shuffle($arr);             // 將陣列的順序打亂🜎

方法:__construct(),__destruct(),    方法重载:__call(),__callStatic()。

属性重载:__get(),__set(),__isset(),__unset(),这四个只对类中,私有,受保护的成员属性有效

__toString(),__autoload();

_set_state(); //自 PHP 5.1.0 起当调用 var_export() 导出类时,此静态 方法会被调用。 本方法的唯一参数是一个数组。

 

__clone();       //通常用于对副本进行重新初始化,

说明:this指副本对象引用,that指原对象引用 等方法在 PHP 中被称为”魔术方法”。PHP 将所有以 __(两个下划线)开头的类方法保留为魔术方法。所以在定义类方法时,除了上述魔术方法,建议不要以 __ 为前缀。在命名自己的类方法时不能使用这些方法名,除非是想使用其魔术功能。

 

常量:__LINK__     //文件中的当前行号

        __FILE__       //文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。

        __DIR__       //文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录,它等价于 dirname(__FILE__)。

 

        __FUNCTION__      //函数名称。自 PHP 5 起本常量返回该函数被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。

        __CLASS__             //类的名称。自 PHP 5 起本常量返回该类被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。

        __METHOD__        //类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。

        __NAMESPACE__   //当前命名空间的名称(大小写敏感)。这个常量是在编译时定义的(PHP 5.3.0 新增)

PHP 如何获取客户端的IP地址,

用$_SERVER获取的IP地址有什么问题?

$_SERVER['REMOTE_ADDR'] ;   通过全局数组来获得 

getenv('REMOTE_ADDR') ; 通过环境变量来获得

当客户机使用代理的时候获取不到真实的IP地址

写一个函数,可以遍历文件夹下的所有文件和文件夹。

<span> 1</span><span>function</span> get_dir_info(<span>$path</span><span>){
</span><span> 2</span><span>$handle</span> = <span>opendir</span>(<span>$path</span>);<span>//</span><span>打开目录返回句柄</span><span> 3</span><span>while</span>((<span>$content</span> = <span>readdir</span>(<span>$handle</span>))!== <span>false</span><span>){
</span><span> 4</span><span>$new_dir</span> = <span>$path</span> . DIRECTORY_SEPARATOR . <span>$content</span><span>;
</span><span> 5</span><span>if</span>(<span>$content</span> == '..' || <span>$content</span> == '.'<span>){
</span><span> 6</span><span>continue</span><span>;
</span><span> 7</span><span>                }
</span><span> 8</span><span>if</span>(<span>is_dir</span>(<span>$new_dir</span><span>)){
</span><span> 9</span><span>echo</span> "<br>目录:".<span>$new_dir</span> . '<br>'<span>;
</span><span>10</span>                       get_dir_info(<span>$new_dir</span><span>);
</span><span>11</span>                 }<span>else</span><span>{
</span><span>12</span><span>echo</span> "文件:".<span>$path</span>.':'.<span>$content</span> .'<br>'<span>;
</span><span>13</span><span>                }
</span><span>14</span><span>          }
</span><span>15</span><span>      }
</span><span>16</span>       get_dir_info(<span>$dir</span>);

有mail.log的一个文档,内容为若干邮件地址,用’\n’分隔换行。挑选sina.com的地址(包括从文件读取、过滤到列印出来)。

思路1:用正则表达式(比较慢,效率地,不推荐用)

思路2:cat mail.log | grep sina.com

PHP缓存技术有哪些? tp是局部还是完全缓存?

1. 全页面静态化缓存,也就是将页面全部生成html静态页面,用户访问时直接访问的静态页面,而不会去走php服务器解析的流程
2. 页面部分缓存,将一个页面中不经常变的部分进行静态缓存,而经常变化的块不缓存,最后组装在一起显示
3. 数据缓存,通过一个id进行请求的数据,将数据缓存到一个php文件中,id和文件是对应的,下次通过这个id进行请求时 直接读php文件
4. 查询缓存,和数据缓存差不多,根据查询语句进行缓存;
5. 常用的缓存技术有:redis和memcache
个人认为tp应该是全局缓存 因为:tp缓存实在本地生成一个php文件来存储数据库中读取出来的数据

strlen()与mb_strlen的作用与区别

在PHP中,strlen与mb_strlen是求字符串长度的函数

PHP内置的字符串长度函数strlen无法正确处理中文字符串,它得到的只是字符串所占的字节数。对于GB2312的中文编码,strlen得到的值是汉字个数的2倍,而对于UTF-8编码的中文,就是3倍(在 UTF-8编码下,一个汉字占3个字节)。

 

采用mb_strlen函数可以较好地解决这个问题。mb_strlen的用法和strlen类似,只不过它有第二个可选参数用于指定字符编码。例如得到UTF-8的字符串$str长度,可以用 mb_strlen($str,'UTF-8')。如果省略第二个参数,则会使用PHP的内部编码。内部编码可以通过 mb_internal_encoding()函数得到。


需要注意的是,mb_strlen并不是PHP核心函数,使用前需要确保在php.ini中加载了php_mbstring.dll,即确保“extension=php_mbstring.dll”这一行存在并且没有被注释掉,否则会出现未定义函 数的问题。

写一个函数,尽可能高效的从一个标准url中取出扩展名

$arr = parse_url('http://www.sina.com.cn/abc/de/fg.php?id=1');

 

$result = pathinfo($arr['path']);var_dump($arr);

 

var_dump($result['extension']);

php.ini 中safe mod关闭 影响哪些函数和参数,至少写6个?

move_uploaded_file()        exec()

system()                              passthru()

popen()                              fopen()

mkdir()                               rmdir()

rename()                            unlink()

copy()                                 chgrp()

chown()                              chmod()

touch()                               symlink()

link()                                   parse_ini_file()

set_time_limit()                  max_execution_time mail()

一群猴子排成一圈,按1,2,…,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去…,如此不停 的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做大王。要求编程模拟此过程,输入m、n, 输出最后那个大王的编号。

<span> 1</span> <<span>?php
</span><span> 2</span><span>function</span> fuhuan(<span>$allnum</span>, <span>$ti</span><span>){
</span><span> 3</span><span>$arr</span> = <span>array</span><span>();
</span><span> 4</span><span>for</span>(<span>$i</span> = 0; <span>$i</span> < <span>$allnum</span>; <span>$i</span>++<span>){
</span><span> 5</span><span>$arr</span>[<span>$i</span>] = <span>$i</span><span>;
</span><span> 6</span><span>  }
</span><span> 7</span><span> 8</span><span>$nums</span> = 1<span>;
</span><span> 9</span><span>while</span>(<span>count</span>(<span>$arr</span>) > 1<span>){
</span><span>10</span><span>foreach</span> (<span>$arr</span><span>as</span><span>$key</span> => <span>$value</span><span>) {
</span><span>11</span><span>if</span>(<span>$nums</span> == <span>$ti</span><span>){
</span><span>12</span><span>unset</span>(<span>$arr</span>[<span>$key</span><span>]);
</span><span>13</span><span>$nums</span> = 1<span>;
</span><span>14</span>     }<span>else</span><span>{
</span><span>15</span><span>$nums</span>++<span>;
</span><span>16</span><span>    }
</span><span>17</span><span>   }
</span><span>18</span><span>  }
</span><span>19</span><span>$new_arr</span> = <span>array_values</span>(<span>$arr</span><span>);
</span><span>20</span><span>var_dump</span>(<span>$new_arr</span>[0] + 1<span>);
</span><span>21</span><span> }
</span><span>22</span>  fuhuan(10,10);

isset() 、empty()与is_null的区别

1、当变量未定义时,is_null()和“参数本身”是不允许作为参数判断的,会报Notice警告错误;

2、empty,isset首先都会检查变量是否存在,然后对变量值进行检测。而is_null 和 “参数本身”只是直接检查变量值,是否为null,因此如果变量未定义就会出现错误!

3、isset():仅当null和未定义,返回false;

4、empty():""、0、"0"、NULL、FALSE、array(),未定义,均返回false;

5、is_null():仅判断是否为null,未定义 报警告;

6、变量本身作为参数,与empty()一致,但接受未定义变量时,报警告;

求两个文件的相对路径

<span> 1</span> getpath('/a/b/c/d/e.php', '/a/d/12/34/c.php'<span>);
</span><span> 2</span><span> 3</span><span>function</span> getpath(<span>$a</span>, <span>$b</span><span>){
</span><span> 4</span><span>$aarr</span> = <span>explode</span>('/', <span>$a</span><span>);
</span><span> 5</span><span>$barr</span> = <span>explode</span>('/', <span>$b</span><span>);
</span><span> 6</span><span>$count</span> = <span>count</span>(<span>$barr</span>) - 2<span>;
</span><span> 7</span><span>$pathinfo</span> = ''<span>;
</span><span> 8</span><span>for</span>(<span>$i</span> = 1; <span>$i</span> <= <span>$count</span>; <span>$i</span>++<span>){
</span><span> 9</span><span>if</span>(<span>$aarr</span>[<span>$i</span>] == <span>$barr</span>[<span>$i</span><span>]){
</span><span>10</span><span>$pathinfo</span> .= '../'<span>;
</span><span>11</span>    }<span>else</span><span>{
</span><span>12</span><span>$pathinfo</span> .= <span>$barr</span>[<span>$i</span>] . '/'<span>;
</span><span>13</span><span>   }
</span><span>14</span><span>  }
</span><span>15</span><span>echo</span><span>$pathinfo</span><span>;
</span><span>16</span>  }

MVC的优缺点

1、 MVC的優點 
        (1) 可以為一個模型在運作時同時建立和使用多個視圖。變化-傳播機制可以確保所有相關的視圖及時得到模型資料變化,從而使所有關聯的視圖和控制器做到行為同步。  
        (2) 視圖與控制器的可接插性,允許更換視圖和控制器替換。          (3)
 模型的可移植性。因為模型是獨立於視圖的,所以可以把一個模型獨立移植到新的平台工作。需要做的只是在新平台上對視圖和控制器進行新的修改。          (4)
 潛在的框架結構。可以基於此模型建立應用程式框架,而不僅僅是用在設計介面的設計中。  2、 MVC的不足之處 
        (1)
對於簡單的介面,嚴格遵循MVC,使模型、視圖與控制器分離,會增加結構的複雜性,並可能產生過多的更新操作,降低運作效率。          (2)
 視圖與控制器之間的過於緊密的連結。視圖與控制器是相互分離,但確實聯繫緊密的部件,視圖沒有控制器的存在,其應用是很有限的,反之亦然,這樣就妨礙了他們的獨立重用。          (3)
 視圖對模型資料的低效率存取。依據模型操作介面的不同,視圖可能需要多次呼叫才能獲得足夠的顯示資料。對未變更資料的不必要的頻繁訪問,也將損害操作效能。          (4) 目前,一般進階的介面工具或構造器不支援MVC模式。改造這些工具以適應MVC需要和建立分離的部件的代價是很高的,從而造成使用MVC的困難。

區別與聯繫:    使用

Session

_start()呼叫Session,伺服器端在產生

Session

檔案的同時產生Sessional.發送變數為PHPSESSID(Session name)(預設)值為一個128位元的雜湊值。伺服器端將透過此cookie與客戶端進行交互,Session變數的值經php內部系列化後保存在伺服器機器上的文字檔案中,和客戶端的變數名稱預設為PHPSESSID的coolie進行對應交互,即伺服器自動發送了http 頭:header('Set-Cookie: Session_name()=Session_id(); path=/');即setcookie(Session_name(),SessionSession ));當從該頁跳到的新頁面並調用Session_start()後,PHP將檢查與給定ID相關聯的伺服器端存貯的Session數據,如果沒找到則新建一個數據集。 共享方案:1:使用Session/' target='_blank'>資料庫保存

Session

Session照樣在。

問題:程式需要自訂;每次要求都進行資料庫讀寫開銷不小,另外資料庫是一個單點,可以做資料庫的hash來解 決這個問題。       2:使用 Memcached來保存Session, 這種方式跟資料庫類似,記憶體存取效能比資料庫好很多。

問題:程式需要定制,增加 了工作量;存入

Memcached中的數據都需要序列化,效率較低,斷電或者重啟電腦容易丟失數據;

3: 通过加密的cookie,在A服务器上登录,在用户的浏览器上添加加密的cookie,当用户访问B服务器时,检查有无Session,如果没有,就检验 Cookie是否有效,Cookie有效的话就在B服务器上重建Session。简单,高效, 服务器的压力减小了,因为Session数据不存在服务器磁盘上。根本就不会出现Session读取不到的问题。

问题:网络请求占用很多。每次请求时,客户端都要通过cookie发送Session数据给服务器,Session中数据不能太多,浏览器对cookie 的大

小存在限制。不适合高访问量的情况,因为高访问量的情况下。

正则表达式

匹配中文字符的正则表达式: [\u4e00-\u9fa5]
匹配双字节字符(包括汉字在内):[^\x00-\xff]
匹配空行的正则表达式:\n[\s| ]*\r
匹配HTML标记的正则表达式:/<(.*)>.*<\/\1>|<(.*) \/>/ 
匹配首尾空格的正则表达式:(^\s*)|(\s*$) 
匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)* 
匹配网址URL的正则表达式:^[a-zA-z]+://(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\S*)?$ 
匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$ 
匹配国内电话号码:(\d{3}-|\d{4}-)?(\d{8}|\d{7})? 
匹配腾讯QQ号:^[1-9]*[1-9][0-9]*$

--------------------linux部分---------------------

core文件是什么,有什么用?

<span> core是unix系统的内核。当你的程序出现内存越界的时候,操作系统会中止你的进程,并将当前内存状态倒出到core文件中,以便进一步分析。程序员可以通过core文件来找出问题所在。它记录了程序挂掉时详细的状态描述。</span>
<span>什么是core dump Core的意思是内存, Dump的意思是扔出来, 堆出来。开发和使用Unix程序时, 有时程序莫名其妙的down了, 却没有任何的提示(有时候会提示core dumped). 这时候可以查看一下有没有形如core.进程号的文件生成, 这个文件便是操作系统把程序down掉时的内存内容扔出来生成的,它可以做为调试程序的参考.
    core dump又叫核心转储, 当程序运行过程中发生异常, 程序异常退出时, 由操作系统把程序当前的内存状况存储在一个core文件中, 叫core dump。如何使用core文件 gdb -c core文件路径 [应用程序的路径],进去后输入where回车, 就可以显示程序在哪一行当掉的, 在哪个函数中.</span>
<span>为什么没有core文件生成呢? core文件的生成跟你当前系统的环境设置有关系, 可以用下面的语句设置一下, 然后再运行程序便成生成core文件.</span>
<span>ulimit -c unlimited core文件生成的位置一般于运行程序的路径相同, 文件名一般为core.进程号</span>

不用core文件,程序出了问题产生信号是否知道?答:内核向进程发信号嘛。

共享内存除了文件映射还有什么方式?

共享内存对象映射。

二者有什么区别:

答:内存映射文件是由一个文件到一块内存的映射,使应用程序可以通过内存指针对磁盘上的文件进行访问,其过程就如同对加载了文件的内存的访问,因此内存文件映射非常适合于用来管理大文件。

请解释下列10个shell命令的用途
top、ps、mv、find、df、cat、chmod、chgrp、grep、wc

top:命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。 

ps:查看进程 

mv:移动或者更改文件 

find:在子目录中搜索匹配的文件 

df:linux中df命令参数功能:检查文件系统的磁盘空间占用情况。

cat:把一个或多个文件内容显示到标准输出 

chmod:改变文件属性 

chgrp:改变用户分组 

grep:在文件内进行搜索 

wc:命令的功能为统计指定文件中的字节数、字数、行数, 并将统计结果显示输出。

Linux文件属性有哪些?(共十位)

-rw-r--r--那个是权限符号,总共是- --- --- ---这几个位。

第一个短横处是文件类型识别符:-表示普通文件;c表示字符设备(character);b表示块设备(block);d表示目录 (directory);l表示链接文件(link);后面第一个三个连续的短横是用户权限位(User),第二个三个连续短横是组权限位 (Group),第三个三个连续短横是其他权限位(Other)。每个权限位有三个权限,r(读权限),w(写权限),x(执行权限)。如果每个权限位都 有权限存在,那么满权限的情况就是:-rwxrwxrwx;权限为空的情况就是- --- --- ---。

权限的设定可以用chmod命令,其格式位:chmod ugoa+/-/=rwx filename/directory。例如:

一个文件aaa具有完全空的权限- --- --- ---。

chmod u+rw aaa(给用户权限位设置读写权限,其权限表示为:- rw- --- ---)

chmod g+r aaa(給群組設定權限為可讀,其權限表示為:- --- r-- ---)

chmod ugo+rw aaa(給用戶,群組,其它使用者或群組設定權限為讀寫,權限表示為:- rw- rw- rw-)

如果aaa具有滿權限- rwx rwx rwx。

chmod u-x aaa(去掉用戶可執行權限,權限表示為:- rw- rwx rwx)

如果要給aaa chmod u=rwx,go=rx aaa

--------------------伺服器部分----------- ----------Apache與Nginx的優缺點比較 

1、nginx相對於輕比Apache的優點Apache 佔用較少的記憶體及資源。高度模組化的設計,編寫模組相對簡單 
抗並發,nginx 處理請求是非同步非阻塞,多個連接(萬級別)可以對應一個進程,而Apache 則是阻塞型的,是同步多進程模型,一個連結對應一個進程,在高並發下nginx 能維持低資源低消耗高效能 
nginx處理靜態檔案好,Nginx 靜態處理效能比Apache 高3倍以上 
Apache 相對於nginx 的優點: 

Apache

 的rewrite 比nginx 的rewrite 強大,模組非常多,基本上想到的都可以找到,比較穩定,bug ,nginx bug 相對較多3:原因:這得益於Nginx使用了最新的epoll(Linux 2.6核心)和kqueue(freebsd)網路I/O模型,而

Apache

則使用的是傳統的select模型。目前Linux下能夠承受高並發存取的 Squid、
Memcached都採用的是epoll網路I/O模型。 處理大量的連接的讀寫,Apache所採用的select網路I/O模型非常低效。
cgi 與fastcgi的區別

cgi在2000年或更早的時候用得比較多, 以前web伺服器一般只處理靜態的請求,web伺服器會根據這次請求的內容,然後會fork一個新進程來運行外部c程式(或perl腳本...), 這個進程會把處理完的資料回傳給web伺服器,最後web伺服器把內容傳送給用戶,剛才fork的進程也隨之退出。 如果下次用戶還要求改動態腳本,那麼web伺服器又再次fork一個新進程,周而復始的進行。

後來出現了一種更高級的方式是,web伺服器可以內建perl解釋器或php解釋器。 也就是說這些解釋器做成模組的方式,web伺服器會在啟動的時候就啟動這些解釋器。 當有新的動態請求進來時,web伺服器就是自己解析這些perl或php腳本,省得重新fork一個進程,效率提高了。 fastcgi的方式是,web伺服器收到一個請求時,他不會重新fork一個進程(因為這個進程在web伺服器啟動時就開啟了,而且不會退出),web伺服器直接把內容傳遞給這個進程(進程間通訊,但fastcgi使用了別的方式,tcp方式通訊),這個進程收到請求後進行處理,把結果回傳給web伺服器,最後自己接著等待下一個請求的到來,而不是退出。  

fastcgi跟cgi的區別是:

                  在web服務器方面                                                         在對數據進行處理的進程方面
cgi

         fork一個新的進程進行處理                                           讀取參數,處理數據,然後就結束生命期

fastcgi   用tcp方式跟遠端機子上的進程或本地進程建立連接       要開啟tcp端口,進入循環,等待數據的到來,處理數據


舉個例子: 服務端現在有個10萬個字單詞, 客戶每次會發來一個字符串,問以這個字符串為前綴的單詞有多少個。 那麼可以寫一個程序,這個程序會建造一棵trie樹,然後每次用戶請求過來時可以直接到這個trie去查找。 但如果以cgi的方式的話,這次請求結束後這課trie也就沒了,等下次再啟動該進程時,又要新建一棵trie樹,這樣的效率就太低下了。   而用fastcgi的方式的話,這課trie樹在進程啟動時建立,以後就可以直接在trie樹上查詢指定的前綴了。

select, poll和epoll的區別

select

select最早於1983年出現在4.2BSD中,它通過一個select(select最早於1983年出現在4.2BSD。 ,當select()返回後,該數組中就緒的檔案描述符便會被內核修改標誌位,使得進程可以獲得這些檔案描述符從而進行後續的讀寫操作。

select目前幾乎在所有的平台上支持,其良好跨平台支持也是它的一個優點,事實上從現在看來,這也是它所剩不多的優點之一。

select的一個缺點在於單一進程能夠監視的

檔案描述子的數量存在最大限制,在Linux上一般為1024,不過可以透過修改巨集定義甚至重新編譯內核的方式來提升此限制。

另外,select()所維護的儲存大量

檔案描述子的資料結構,隨著檔案描述子數量的增大,其複製的開銷也線性成長。同時,由於網路回應時間的延遲 使得大量TCP連線處於非活躍狀態,但呼叫select()會對所有socket進行一次線性掃描,所以這也浪費了一定的開銷。

poll

poll在1986年誕生於System V Release 3,它和select在本質上沒有多大差別,但是poll沒有最大

檔案描述符數量的限制。

poll和select同樣存在一個缺點就是,包含大量

文件描述符的數組被整體複製於用戶態和內核的地址空間之間,而不論這些文件描述符是否就緒,它的開銷隨著檔案描述子數量的增加而線性增加。

另外,select()和poll()將就緒的

檔案描述子告訴進程後,如果進程沒有對其進行IO操作,那麼下次調用select()和poll() 的時候將再次報告這些檔案描述子,所以它們一般不會遺失就緒的訊息,這種方式稱為水平觸發(Level Triggered)。

epoll

直到Linux2.6才出現了由內核直接支援的實作方法,那就是epoll,它幾乎具備了之前所說的一切優點,被公認為Linux2.6下性能最好的多路I/O就緒通知方法。

epoll可以同時支援水平觸發和邊緣觸發(Edge Triggered,只告訴進程哪些

檔案描述子剛剛變成就緒狀態,它只說一遍,如果我們沒有採取行動,那麼它將不會再次告知,這種方式稱為邊緣觸發),理論上邊緣觸發的性能要更高一些,但是程式碼實現相當複雜。

epoll同樣只告知那些就緒的

文件描述符,而且當我們調用epoll_wait()獲得就緒文件描述符時,返回的不是實際的描述符,而是一個代表就緒描述符數量的值,你只需要去epoll指定的一個數組中依次取得相應數量的文件描述符即可,這裡也使用了內存映射(mmap)技術,這樣便徹底省掉了這些文件描述符在系統呼叫時複製的開銷。

另一個本質的改進在於epoll採用基於事件的就緒通知方式。在select/poll中,進程只有在呼叫一定的方法後,核心才對所有監視的檔案描述子進行掃描,而epoll事先透過epoll_ctl()來註冊一個

檔案描述子,一旦基於某個檔案描述符就緒時,核心會採用類似callback的回呼機制,迅速啟動這個檔案描述子,當進程呼叫epoll_wait()時便得到通知。

Memcache和Redis區別

  1. Redis中,並不是所有的資料都一直儲存在記憶體中的,這是和Memcached相比一個最大的區別。
  2. Redis在許多方面具備資料庫的特徵,或者說就是一個資料庫系統,而Memcached只是簡單的K/V快取。
  3. 他們的擴充都需要做叢集;實作方式:master-slave、Hash。
  4. 在100k以上的資料中,Memcached效能要高於Redis。
  5. 如果要說內存使用效率,使用簡單的key-value存儲的話,Memcached的內存利用率更高,而如果Redis採用hash結構來做key-value存儲,由於其組合式的壓縮,其記憶體利用率會高於Memcached。當然,這和你的應用場景和資料特性有關。
  6. 如果你對資料持久化和資料同步有所要求,那麼推薦你選擇Redis,因為這兩個特性Memcached都不具備。即使你只是希望在升級或重新啟動系統後快取資料不會遺失,選擇Redis也是明智的。
  7. Redis和Memcache在寫入效能上面差別不大,讀取效能上面尤其是批次讀取效能上面Memcache更強。
以上就介紹了PHP面試總結,包含了方面的內容,希望對PHP教學有興趣的朋友有幫助。
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn