摘要:的函數判斷值為否為空格式功能檢查一個變量是否為空返回值若變量不存在則返回若變量存在且其值為以及沒有任何屬性的對象,則返回若變量存在且值不為以及沒有任何屬性的對象,則返回版本更多說明的返回值,但不會因為變量未定義而產生警告信息。
作者:PHP學習網 出處:https://www.viphper.com/?p=1236 本文版權歸作者,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
公司出了一些自我評測的PHP題目,現將題目和答案記錄于此,以方便記憶。
1. 魔術函數有哪些,分別在什么時候調用?
__construct(),類的構造函數
__destruct(),類的析構函數
__call(),在對象中調用一個不可訪問方法時調用
__callStatic(),用靜態方式中調用一個不可訪問方法時調用
__get(),獲得一個類的成員變量時調用
__set(),設置一個類的成員變量時調用
__isset(),當對不可訪問屬性調用isset()或empty()時調用
__unset(),當對不可訪問屬性調用unset()時被調用。
__sleep(),執行serialize()時,先會調用這個函數
__wakeup(),執行unserialize()時,先會調用這個函數
__toString(),類被當成字符串時的回應方法
__invoke(),調用函數的方式調用一個對象時的回應方法
__set_state(),調用var_export()導出類時,此靜態方法會被調用。
__clone(),當對象復制完成時調用
2.isset和empty函數有什么區別?
PHP的isset()函數 一般用來檢測變量是否設置
格式:bool isset ( mixed var [, mixed var [, ...]] )
功能:檢測變量是否設置
返回值:
若變量不存在則返回 FALSE
若變量存在且其值為NULL,也返回 FALSE
若變量存在且值不為NULL,則返回 TURE
同時檢查多個變量時,每個單項都符合上一條要求時才返回 TRUE,否則結果為 FALSE
版本:PHP 3, PHP 4, PHP 5
更多說明:
使用 unset() 釋放變量之后,它將不再是 isset()。
PHP函數isset()只能用于變量,傳遞任何其它參數都將造成解析錯誤。
檢測常量是否已設置可使用 defined() 函數。
PHP的empty()函數 判斷值為否為空
格式:bool empty ( mixed var )
功能:檢查一個變量是否為空
返回值:
若變量不存在則返回 TRUE
若變量存在且其值為""、0、"0"、NULL、、FALSE、array()、var $var; 以及沒有任何屬性的對象,則返回 TURE
若變量存在且值不為""、0、"0"、NULL、、FALSE、array()、var $var; 以及沒有任何屬性的對象,則返回 FALSE
版本:PHP 3, PHP 4, PHP 5
更多說明:
empty()的返回值=!(boolean) var,但不會因為變量未定義而產生警告信息。參見轉換為布爾值獲取更多信息。
empty() 只能用于變量,傳遞任何其它參數都將造成Paser error而終止運行。
檢測常量是否已設置可使用 defined() 函數。
3.PHP的與定義變量有哪些,分別是什么?
超全局變量 — 超全局變量是在全部作用域中始終可用的內置變量
$GLOBALS — 引用全局作用域中可用的全部變量
$_SERVER — 服務器和執行環境信息
$_GET — HTTP GET 變量
$_POST — HTTP POST 變量
$_FILES — HTTP 文件上傳變量
$_REQUEST — HTTP Request 變量
$_SESSION — Session 變量
$_ENV — 環境變量
$_COOKIE — HTTP Cookies
$php_errormsg — 前一個錯誤信息
$HTTP_RAW_POST_DATA — 原生POST數據
$http_response_header — HTTP 響應頭
$argc — 傳遞給腳本的參數數目
PHP 中的許多預定義變量都是“超全局的”,這意味著它們在一個腳本的全部作用域中都可用。在函數或方法中無需執行 global $variable; 就可以訪問它們。
這些超全局變量是:
$GLOBALS
$_SERVER
$_GET
$_POST
$_FILES
$_COOKIE
$_SESSION
$_REQUEST
$_ENV
4.簡述PHP的垃圾回收機制
php 5.3之前使用的垃圾回收機制是單純的“引用計數”,也就是每個內存對象都分配一個計數器,當內存對象被變量引用時,計數器+1;當變量引用撤掉后,計數器-1;當計數器=0時,表明內存對象沒有被使用,該內存對象則進行銷毀,垃圾回收完成。
“引用計數”存在問題,就是當兩個或多個對象互相引用形成環狀后,內存對象的計數器則不會消減為0;這時候,這一組內存對象已經沒用了,但是不能回收,從而導致內存泄露;
php5.3開始,使用了新的垃圾回收機制,在引用計數基礎上,實現了一種復雜的算法,來檢測內存對象中引用環的存在,以避免內存泄露。
php變量存在一個叫"zval"的變量容器中,"zval"變量容器包括含變量的類型和值,還包括額外的兩個字節信息,分別是“is_ref”表示變量是否屬于引用,“refcount”指向這個zval變量容器的變量個數。
5.列舉PHP的性能優化方法和技巧
opcache
通訊緩存
查詢緩存
6.MySQL存儲引擎中,innodb和myisam的區別
MyISAM 和 InnoDB 講解
InnoDB和MyISAM是許多人在使用MySQL時最常用的兩個表類型,這兩個表類型各有優劣,視具體應用而定?;镜牟顒e為:MyISAM類型不支持事務處理等高級處理,而InnoDB類型支持。MyISAM類型的表強調的是性能,其執行數度比InnoDB類型更快,但是不提供事務支持,而InnoDB提供事務支持已經外部鍵等高級數據庫功能。
以下是一些細節和具體實現的差別:
◆1.InnoDB不支持FULLTEXT類型的索引。
◆2.InnoDB 中不保存表的具體行數,也就是說,執行select count() from table時,InnoDB要掃描一遍整個表來計算有多少行,但是MyISAM只要簡單的讀出保存好的行數即可。注意的是,當count()語句包含 where條件時,兩種表的操作是一樣的。
◆3.對于AUTO_INCREMENT類型的字段,InnoDB中必須包含只有該字段的索引,但是在MyISAM表中,可以和其他字段一起建立聯合索引。
◆4.DELETE FROM table時,InnoDB不會重新建立表,而是一行一行的刪除。
◆5.LOAD TABLE FROM MASTER操作對InnoDB是不起作用的,解決方法是首先把InnoDB表改成MyISAM表,導入數據后再改成InnoDB表,但是對于使用的額外的InnoDB特性(例如外鍵)的表不適用。
另外,InnoDB表的行鎖也不是絕對的,假如在執行一個SQL語句時MySQL不能確定要掃描的范圍,InnoDB表同樣會鎖全表,例如update table set num=1 where name like “%aaa%”
兩種類型最主要的差別就是Innodb 支持事務處理與外鍵和行級鎖.而MyISAM不支持.所以MyISAM往往就容易被人認為只適合在小項目中使用。
我作為使用MySQL的用戶角度出發,Innodb和MyISAM都是比較喜歡的,但是從我目前運維的數據庫平臺要達到需求:99.9%的穩定性,方便的擴展性和高可用性來說的話,MyISAM絕對是我的首選。
原因如下:
1、首先我目前平臺上承載的大部分項目是讀多寫少的項目,而MyISAM的讀性能是比Innodb強不少的。
2、MyISAM的索引和數據是分開的,并且索引是有壓縮的,內存使用率就對應提高了不少。能加載更多索引,而Innodb是索引和數據是緊密捆綁的,沒有使用壓縮從而會造成Innodb比MyISAM體積龐大不小。
3、從平臺角度來說,經常隔1,2個月就會發生應用開發人員不小心update一個表where寫的范圍不對,導致這個表沒法正常用了,這個時候MyISAM的優越性就體現出來了,隨便從當天拷貝的壓縮包取出對應表的文件,隨便放到一個數據庫目錄下,然后dump成sql再導回到主庫,并把對應的binlog補上。如果是Innodb,恐怕不可能有這么快速度,別和我說讓Innodb定期用導出xxx.sql機制備份,因為我平臺上最小的一個數據庫實例的數據量基本都是幾十G大小。
4、從我接觸的應用邏輯來說,select count(*) 和order by 是最頻繁的,大概能占了整個sql總語句的60%以上的操作,而這種操作Innodb其實也是會鎖表的,很多人以為Innodb是行級鎖,那個只是where對它主鍵是有效,非主鍵的都會鎖全表的。
5、還有就是經常有很多應用部門需要我給他們定期某些表的數據,MyISAM的話很方便,只要發給他們對應那表的frm.MYD,MYI的文件,讓他們自己在對應版本的數據庫啟動就行,而Innodb就需要導出xxx.sql了,因為光給別人文件,受字典數據文件的影響,對方是無法使用的。
6、如果和MyISAM比insert寫操作的話,Innodb還達不到MyISAM的寫性能,如果是針對基于索引的update操作,雖然MyISAM可能會遜色Innodb,但是那么高并發的寫,從庫能否追的上也是一個問題,還不如通過多實例分庫分表架構來解決。
7、如果是用MyISAM的話,merge引擎可以大大加快應用部門的開發速度,他們只要對這個merge表做一些select count(*)操作,非常適合大項目總量約幾億的rows某一類型(如日志,調查統計)的業務表。
當然Innodb也不是絕對不用,用事務的項目如模擬炒股項目,我就是用Innodb的,活躍用戶20多萬時候,也是很輕松應付了,因此我個人也是很喜歡Innodb的,只是如果從數據庫平臺應用出發,我還是會首選MyISAM。
另外,可能有人會說你MyISAM無法抗太多寫操作,但是我可以通過架構來彌補,說個我現有用的數據庫平臺容量:主從數據總量在幾百T以上,每天十多億 pv的動態頁面,還有幾個大項目是通過數據接口方式調用未算進pv總數,(其中包括一個大項目因為初期memcached沒部署,導致單臺數據庫每天處理 9千萬的查詢)。而我的整體數據庫服務器平均負載都在0.5-1左右。
7.Mysql的存儲類型有哪幾種?什么是聚簇索引非聚簇索引?
1、B+樹索引(O(log(n))):關于B+樹索引,可以參考 MySQL索引背后的數據結構及算法原理
2、hash索引:
a 僅僅能滿足"=","IN"和"<=>"查詢,不能使用范圍查詢
b 其檢索效率非常高,索引的檢索可以一次定位,不像B-Tree 索引需要從根節點到枝節點,最后才能訪問到頁節點這樣多次的IO訪問,所以 Hash 索引的查詢效率要遠高于 B-Tree 索引
c 只有Memory存儲引擎顯示支持hash索引
3、FULLTEXT索引(現在MyISAM和InnoDB引擎都支持了)
4、R-Tree索引(用于對GIS數據類型創建SPATIAL索引)
從物理存儲角度
1、聚集索引(clustered index)
2、非聚集索引(non-clustered index)
從邏輯角度
1、主鍵索引:主鍵索引是一種特殊的唯一索引,不允許有空值
2、普通索引或者單列索引
3、多列索引(復合索引):復合索引指多個字段上創建的索引,只有在查詢條件中使用了創建索引時的第一個字段,索引才會被使用。使用復合索引時遵循最左前綴集合
4、唯一索引或者非唯一索引
5、空間索引:空間索引是對空間數據類型的字段建立的索引,MYSQL中的空間數據類型有4種,分別是GEOMETRY、POINT、LINESTRING、POLYGON。MYSQL使用SPATIAL關鍵字進行擴展,使得能夠用于創建正規索引類型的語法創建空間索引。創建空間索引的列,必須將其聲明為NOT NULL,空間索引只能在存儲引擎為MYISAM的表中創建
CREATE TABLE table_name[col_name data type]
unique|fulltext|spatialindex_name[asc|desc]
1、unique|fulltext|spatial為可選參數,分別表示唯一索引、全文索引和空間索引;
2、index和key為同義詞,兩者作用相同,用來指定創建索引
3、col_name為需要創建索引的字段列,該列必須從數據表中該定義的多個列中選擇;
4、index_name指定索引的名稱,為可選參數,如果不指定,MYSQL默認col_name為索引值;
5、length為可選參數,表示索引的長度,只有字符串類型的字段才能指定索引長度;
6、asc或desc指定升序或降序的索引值存儲
8.Memcache和Redis的過期機制是什么?什么是一致性哈希?
數據存儲方式:Slab Allocation
數據過期方式:Lazy Expiration + LRU
Slab Allocator的基本原理是按照預先規定的大小,將分配的內存分割成特定長度的塊,以完全解決內存碎片問題。
Slab Allocation的原理相當簡單。 將分配的內存分割成各種尺寸的塊(chuk),并把尺寸相同的塊分成組(chunk的集合)
Page:分配給Slab的內存空間,默認是1MB。分配給Slab之后根據slab的大小切分成chunk。
Chunk:用于緩存記錄的內存空間。
Slab Class:特定大小的chunk的組。
memcached根據收到的數據的大小,選擇最適合數據大小的slab。
memcached中保存著slab內空閑chunk的列表,根據該列表選擇chunk,然后將數據緩存于其中。
Slab Alloction 缺點
這個問題就是,由于分配的是特定長度的內存,因此無法有效利用分配的內存。例如,將100字節的數據緩存到128字節的chunk中,剩余的28字節就浪費了。
數據過期方式
Lazy Expiration
memcached內部不會監視記錄是否過期,而是在get時查看記錄的時間戳,檢查記錄是否過期。這種技術被稱為lazy(惰性)expiration。因此,memcached不會在過期監視上耗費CPU時間
LRU
memcached會優先使用已超時的記錄的空間,但即使如此,也會發生追加新記錄時空間不足的情況,此時就要使用名為 Least Recently Used(LRU)機制來分配空間。這是刪除“最近最少使用”的記錄的機制。因此,當memcached的內存空間不足時(無法從slab class 獲取到新的空間時),就從最近未被使用的記錄中搜索,并將其空間分配給新的記錄
大家常常說 memcached命中率低也是LRU策略引起的。大家可能常常遇到當我的內存足夠大的時候,為何還會觸發LRU那。因為LRU 是針對SLAB 來說的。
例如:我存儲的數據在100K 左右。內部會選擇適合大小的SLAB,這時候他會選擇合適他大小的,他會選擇上圖的SLBA CLASS 2. 如果這時候SLAB CLASS 2 滿了或者不足100K。他就會調用LRU機制。會把SLAB CLASS 2 中chunck中最近很少使用的數據清理掉,導致數據被清理掉,即使它沒有過期。
所以使用memcached 時候 一定要注意數據大小匹配模式和增長因子。
REDIS 過期時間機制
1.volatile-lru:從設置了過期時間的數據集中,選擇最近最久未使用的數據釋放
2.allkeys-lru:從數據集中(包括設置過期時間以及未設置過期時間的數據集中),選擇最近最久未使用的數據釋放
3.volatile-random:從設置了過期時間的數據集中,隨機選擇一個數據進行釋放
4.allkeys-random:從數據集中(包括了設置過期時間以及未設置過期時間)隨機選擇一個數據進行入釋放
5.volatile-ttl:從設置了過期時間的數據集中,選擇馬上就要過期的數據進行釋放操作
6.noeviction:不刪除任意數據(但redis還會根據引用計數器進行釋放呦~),這時如果內存不夠時,會直接返回錯誤
默認的內存策略是noeviction,在Redis中LRU算法是一個近似算法,默認情況下,Redis隨機挑選5個鍵,并且從中選取一個最近最久未使用的key進行淘汰,在配置文件中可以通過maxmemory-samples的值來設置redis需要檢查key的個數,但是檢查的越多,耗費的時間也就越久,但是結構越精確(也就是Redis從內存中淘汰的對象未使用的時間也就越久~), 設置多少,具體業務權衡吧一般都是按照默認。
REDIS 還有定期策略,定期刪除過期的緩存數據,來節省內存。這種方式還是蠻好的。這種策略優先于LRU。
目前對比MEMCACHED 和REDIS 過期時間機制對比。
REDIS 命中率明顯高于MEMCACHED,對于業務適合哪種場景,大家各自匹配吧!目前來說 我認為REDIS 是 MEMCACHED 補充的一款NOSQL 產品。
一致性哈希,一種分布式節點key分布算法,可選;
9.MySQL索引底層數據結構是怎樣存儲的,為什么使用索引會查詢的快?
數據結構及算法基礎
索引的本質
B-Tree和B+Tree
特殊的存儲結構,尋道成本低;
MySQL索引實現
MyISAM索引實現
非聚簇索引
InnoDB索引實現
聚簇索引
第一個重大區別是InnoDB的數據文件本身就是索引文件。
第二個與MyISAM索引的不同是InnoDB的輔助索引data域存儲相應記錄主鍵的值而不是地址。
聚集索引這種實現方式使得按主鍵的搜索十分高效,但是輔助索引搜索需要檢索兩遍索引:首先檢索輔助索引獲得主鍵,然后用主鍵到主索引中檢索獲得記錄。
10.優化mysql的方法
避免復查查詢
避免模糊查詢
避免數據庫內運算
避免大量吞吐
盡可能縮小檢索范圍
盡可能使用索引,唯一或者接近唯一的索引
聯查中盡量使用const字段
11.find 和 grep的區別
find是查找文件
grep是查找文件內的內容
12.寫出下列的服務的用途和默認端口
FTP: | 21/tcp | 依照FTP協議提供服務,專門用來傳輸文件的協議。
SSH: | 22/tcp | 專為遠程登錄會話和其他網絡服務提供安全性的協議。利用 SSH 協議可以有效防止遠程管理過程中的信息泄露問題。
HTTP: | 80/tcp | 是互聯網上應用最為廣泛的一種網絡協議。所有的WWW文件都必須遵守這個標準。
telnet:| 23/tcp | Telnet協議是TCP/IP協議族中的一員,是Internet遠程登陸服務的標準協議和主要方式,它為用戶提供了在本地計算機上完成遠程主機工作的能力
https:| 443/tcp 443/udp | 是以安全為目標的HTTP通道,簡單講是HTTP的安全版。即HTTP下加入SSL層,HTTPS的安全基礎是SSL,因此加密的詳細內容就需要SSL
13.給text.txt文件除所有者之外增加執行權限,最終以數字寫出文件權限
chmod g+x,o+x text.txt
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/22682.html
摘要:總結了框架與架構的區別。站在框架之外,看框架,看框架的共同特征與功用。由于框架所帶來的問題,以性能可擴展問題,相對嚴重,所以分析性能的改造方向,總結了六大點。包括框架介紹,的使用,以及。 六、各項實踐,性能評測 下面進入性能評測,評測我們相對就比較快速一些。直接用ab命令,來測試上面的所提及的一些改進。 以下評測,所有測試頁面,均為:http://hjvote.app.ucai.cn/...
摘要:日常工作中需要在數據庫中存儲一些結構數據,常用的方法有兩種,一是序列化,二是格式。兩者各有優缺點,比如序列化支持對象格式序列化后的數據會保存數據類型和數據個數。而格式相比序列化的數據更短,并且前后端交互時適用性也更好。 日常工作中需要在數據庫中存儲一些結構數據,常用的方法有兩種,一是序列化(serialize),二是json格式。 兩者各有優缺點,比如序列化支持對象格式、序列化后的數據...
摘要:阿里巴巴集團安全推出阿里聚安全算法挑戰賽,承載阿里巴巴集團十余年沉淀的安全防御戰場,誠邀各路英雄前來挑戰,深入共建互聯網安全。 KDD(Knowledge Discovery and Data Mining,知識發現與數據挖掘)會議,作為數據挖掘屆的頂會,一直是算法愛好者心中的圣地麥加。 想去?有點難。?給你獎金和差旅贊助帶你去,還不設門檻,去不去? 請對著30萬獎金和加拿大的KDD門...
摘要:開源的事,咱先不說了,知乎上也有熱烈的討論,我們今天就來看一下正式版的算法和應用在其上的性能表現。分別在和下進行測試,并且兩者都分別打開和關閉,看看響應性能是否有明顯變化??梢哉f對高并發下的性能至為關鍵。 本周迎來2015年編程語言界的兩件大事,Swift 開源, PHP7 發布。這兩件大事,都是可以載入相應的編程語言的史冊級的事件。 Swift 開源的事,咱先不說了,知乎上也有熱烈的...
閱讀 2706·2023-04-26 02:02
閱讀 2571·2023-04-25 20:38
閱讀 4098·2021-09-26 09:47
閱讀 3092·2021-09-10 10:50
閱讀 3765·2021-09-07 09:58
閱讀 3326·2019-08-30 15:54
閱讀 2694·2019-08-30 15:54
閱讀 1918·2019-08-29 17:03