首頁 後端開發 php教程 PHP面試總結

PHP面試總結

Jul 29, 2016 am 09:14 AM
arr array nbsp php session

  從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

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1665
14
CakePHP 教程
1424
52
Laravel 教程
1322
25
PHP教程
1270
29
C# 教程
1250
24
PHP和Python:比較兩種流行的編程語言 PHP和Python:比較兩種流行的編程語言 Apr 14, 2025 am 12:13 AM

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

PHP行動:現實世界中的示例和應用程序 PHP行動:現實世界中的示例和應用程序 Apr 14, 2025 am 12:19 AM

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。

PHP:網絡開發的關鍵語言 PHP:網絡開發的關鍵語言 Apr 13, 2025 am 12:08 AM

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP與Python:了解差異 PHP與Python:了解差異 Apr 11, 2025 am 12:15 AM

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

PHP的持久相關性:它還活著嗎? PHP的持久相關性:它還活著嗎? Apr 14, 2025 am 12:12 AM

PHP仍然具有活力,其在現代編程領域中依然佔據重要地位。 1)PHP的簡單易學和強大社區支持使其在Web開發中廣泛應用;2)其靈活性和穩定性使其在處理Web表單、數據庫操作和文件處理等方面表現出色;3)PHP不斷進化和優化,適用於初學者和經驗豐富的開發者。

PHP和Python:代碼示例和比較 PHP和Python:代碼示例和比較 Apr 15, 2025 am 12:07 AM

PHP和Python各有優劣,選擇取決於項目需求和個人偏好。 1.PHP適合快速開發和維護大型Web應用。 2.Python在數據科學和機器學習領域佔據主導地位。

PHP與其他語言:比較 PHP與其他語言:比較 Apr 13, 2025 am 12:19 AM

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。

PHP和Python:解釋了不同的範例 PHP和Python:解釋了不同的範例 Apr 18, 2025 am 12:26 AM

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。

See all articles