從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)2:用fopen開啟url, 以get方式取得內容(使用fgets(2:用fopen開啟url, 以get )函數)
3:用fsockopen函數開啟url(可以以get和post的方式取得),以get方式取得完整的數據,包括header和body4:使用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); /七、陣列的計算
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() 导出类时,此静态 方法会被调用。 本方法的唯一参数是一个数组。 说明: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'>資料庫保存
SessionSession照樣在。
問題:程式需要自訂;每次要求都進行資料庫讀寫開銷不小,另外資料庫是一個單點,可以做資料庫的hash來解 決這個問題。 2:使用 Memcached來保存Session, 這種方式跟資料庫類似,記憶體存取效能比資料庫好很多。
問題:程式需要定制,增加 了工作量;存入
Memcached中的數據都需要序列化,效率較低,斷電或者重啟電腦容易丟失數據;
3: 通过加密的cookie,在A服务器上登录,在用户的浏览器上添加加密的cookie,当用户访问B服务器时,检查有无Session,如果没有,就检验 Cookie是否有效,Cookie有效的话就在B服务器上重建Session。简单,高效, 服务器的压力减小了,因为Session数据不存在服务器磁盘上。根本就不会出现Session读取不到的问题。
问题:网络请求占用很多。每次请求时,客户端都要通过cookie发送Session数据给服务器,Session中数据不能太多,浏览器对cookie 的大
小存在限制。不适合高访问量的情况,因为高访问量的情况下。
正则表达式
匹配中文字符的正则表达式: [\u4e00-\u9fa5] --------------------linux部分--------------------- core文件是什么,有什么用? 不用core文件,程序出了问题产生信号是否知道?答:内核向进程发信号嘛。 共享内存除了文件映射还有什么方式? 共享内存对象映射。 二者有什么区别: 答:内存映射文件是由一个文件到一块内存的映射,使应用程序可以通过内存指针对磁盘上的文件进行访问,其过程就如同对加载了文件的内存的访问,因此内存文件映射非常适合于用来管理大文件。 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 佔用較少的記憶體及資源。高度模組化的設計,編寫模組相對簡單 的rewrite 比nginx 的rewrite 強大,模組非常多,基本上想到的都可以找到,比較穩定,bug ,nginx bug 相對較多3:原因:這得益於Nginx使用了最新的epoll(Linux 2.6核心)和kqueue(freebsd)網路I/O模型,而 則使用的是傳統的select模型。目前Linux下能夠承受高並發存取的 Squid、 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伺服器,最後自己接著等待下一個請求的到來,而不是退出。 在web服務器方面 在對數據進行處理的進程方面 fork一個新的進程進行處理 讀取參數,處理數據,然後就結束生命期 fastcgi 用tcp方式跟遠端機子上的進程或本地進程建立連接 要開啟tcp端口,進入循環,等待數據的到來,處理數據 select, poll和epoll的區別 select select最早於1983年出現在4.2BSD中,它通過一個select(select最早於1983年出現在4.2BSD。 ,當select()返回後,該數組中就緒的檔案描述符便會被內核修改標誌位,使得進程可以獲得這些檔案描述符從而進行後續的讀寫操作。 select的一個缺點在於單一進程能夠監視的 檔案描述子的數量存在最大限制,在Linux上一般為1024,不過可以透過修改巨集定義甚至重新編譯內核的方式來提升此限制。 檔案描述子的資料結構,隨著檔案描述子數量的增大,其複製的開銷也線性成長。同時,由於網路回應時間的延遲 使得大量TCP連線處於非活躍狀態,但呼叫select()會對所有socket進行一次線性掃描,所以這也浪費了一定的開銷。 poll在1986年誕生於System V Release 3,它和select在本質上沒有多大差別,但是poll沒有最大 檔案描述符數量的限制。 文件描述符的數組被整體複製於用戶態和內核的地址空間之間,而不論這些文件描述符是否就緒,它的開銷隨著檔案描述子數量的增加而線性增加。 檔案描述子告訴進程後,如果進程沒有對其進行IO操作,那麼下次調用select()和poll() 的時候將再次報告這些檔案描述子,所以它們一般不會遺失就緒的訊息,這種方式稱為水平觸發(Level Triggered)。 直到Linux2.6才出現了由內核直接支援的實作方法,那就是epoll,它幾乎具備了之前所說的一切優點,被公認為Linux2.6下性能最好的多路I/O就緒通知方法。 epoll可以同時支援水平觸發和邊緣觸發(Edge Triggered,只告訴進程哪些 檔案描述子剛剛變成就緒狀態,它只說一遍,如果我們沒有採取行動,那麼它將不會再次告知,這種方式稱為邊緣觸發),理論上邊緣觸發的性能要更高一些,但是程式碼實現相當複雜。 文件描述符,而且當我們調用epoll_wait()獲得就緒文件描述符時,返回的不是實際的描述符,而是一個代表就緒描述符數量的值,你只需要去epoll指定的一個數組中依次取得相應數量的文件描述符即可,這裡也使用了內存映射(mmap)技術,這樣便徹底省掉了這些文件描述符在系統呼叫時複製的開銷。 檔案描述子,一旦基於某個檔案描述符就緒時,核心會採用類似callback的回呼機制,迅速啟動這個檔案描述子,當進程呼叫epoll_wait()時便得到通知。 Memcache和Redis區別
匹配双字节字符(包括汉字在内):[^\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]*$<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>
top、ps、mv、find、df、cat、chmod、chgrp、grep、wc
抗並發,nginx 處理請求是非同步非阻塞,多個連接(萬級別)可以對應一個進程,而Apache 則是阻塞型的,是同步多進程模型,一個連結對應一個進程,在高並發下nginx 能維持低資源低消耗高效能
nginx處理靜態檔案好,Nginx 靜態處理效能比Apache 高3倍以上
Apache 相對於nginx 的優點:
Memcached都採用的是epoll網路I/O模型。 處理大量的連接的讀寫,Apache所採用的select網路I/O模型非常低效。
cgi 與fastcgi的區別
cgi
舉個例子: 服務端現在有個10萬個字單詞, 客戶每次會發來一個字符串,問以這個字符串為前綴的單詞有多少個。 那麼可以寫一個程序,這個程序會建造一棵trie樹,然後每次用戶請求過來時可以直接到這個trie去查找。 但如果以cgi的方式的話,這次請求結束後這課trie也就沒了,等下次再啟動該進程時,又要新建一棵trie樹,這樣的效率就太低下了。 而用fastcgi的方式的話,這課trie樹在進程啟動時建立,以後就可以直接在trie樹上查詢指定的前綴了。
以上就介紹了PHP面試總結,包含了方面的內容,希望對PHP教學有興趣的朋友有幫助。