php的内存划分,解析PHP中的内存管理,PHP动态分配和释放内存
摘要 內存管理對于長期運行的程序,例如服務器守護程序,是相當重要的影響;因此,理解PHP是如何分配與釋放內存的對于創建這類程序極為重要。本文將重點探討PHP的內存管理問題。
一、 內存
在PHP中,填充一個字符串變量相當簡單,這只需要一個語句"<?php $str = 'hello world '; ?>"即可,并且該字符串能夠被自由地修改、拷貝和移動。而在C語言中,盡管你能夠編寫例如"char *str = "hello world ";"這樣的一個簡單的靜態字符串;但是,卻不能修改該字符串,因為它生存于程序空間內。為了創建一個可操縱的字符串,你必須分配一個內存塊,并且通過一個函數(例如strdup())來復制其內容。
代碼如下:
{
char *str;
str = strdup("hello world");
if (!str) {
fprintf(stderr, "Unable to allocate memory!");
}
}
由于后面我們將分析的各種原因,傳統型內存管理函數(例如malloc(),free(),strdup(),realloc(),calloc(),等等)幾乎都不能直接為PHP源代碼所使用。
二、 釋放內存
在幾乎所有的平臺上,內存管理都是通過一種請求和釋放模式實現的。首先,一個應用程序請求它下面的層(通常指"操作系統"):"我想使用一些內存空間"。如果存在可用的空間,操作系統就會把它提供給該程序并且打上一個標記以便不會再把這部分內存分配給其它程序。
當應用程序使用完這部分內存,它應該被返回到OS;這樣以來,它就能夠被繼續分配給其它程序。如果該程序不返回這部分內存,那么OS無法知道是否這塊內存不再使用并進而再分配給另一個進程。如果一個內存塊沒有釋放,并且所有者應用程序丟失了它,那么,我們就說此應用程序"存在漏洞",因為這部分內存無法再為其它程序可用。
在一個典型的客戶端應用程序中,較小的不太經常的內存泄漏有時能夠為OS所"容忍",因為在這個進程稍后結束時該泄漏內存會被隱式返回到OS。這并沒有什么,因為OS知道它把該內存分配給了哪個程序,并且它能夠確信當該程序終止時不再需要該內存。
而對于長時間運行的服務器守護程序,包括象Apache這樣的web服務器和擴展php模塊來說,進程往往被設計為相當長時間一直運行。因為OS不能清理內存使用,所以,任何程序的泄漏-無論是多么小-都將導致重復操作并最終耗盡所有的系統資源。
現在,我們不妨考慮用戶空間內的stristr()函數;為了使用大小寫不敏感的搜索來查找一個字符串,它實際上創建了兩個串的各自的一個小型副本,然后執行一個更傳統型的大小寫敏感的搜索來查找相對的偏移量。然而,在定位該字符串的偏移量之后,它不再使用這些小寫版本的字符串。如果它不釋放這些副本,那么,每一個使用stristr()的腳本在每次調用它時都將泄漏一些內存。最后,web服務器進程將擁有所有的系統內存,但卻不能夠使用它。
你可以理直氣壯地說,理想的解決方案就是編寫良好、干凈的、一致的代碼。這當然不錯;但是,在一個象PHP解釋器這樣的環境中,這種觀點僅對了一半。
三、 錯誤處理
為了實現"跳出"對用戶空間腳本及其依賴的擴展函數的一個活動請求,需要使用一種方法來完全"跳出"一個活動請求。這是在Zend引擎內實現的:在一個請求的開始設置一個"跳出"地址,然后在任何die()或exit()調用或在遇到任何關鍵錯誤(E_ERROR)時執行一個longjmp()以跳轉到該"跳出"地址。
盡管這個"跳出"進程能夠簡化程序執行的流程,但是,在絕大多數情況下,這會意味著將會跳過資源清除代碼部分(例如free()調用)并最終導致出現內存漏洞。現在,讓我們來考慮下面這個簡化版本的處理函數調用的引擎代碼:
代碼如下:
void call_function(const char *fname, int fname_len TSRMLS_DC){
zend_function *fe;
char *lcase_fname;
/* PHP函數名是大小寫不敏感的,
*為了簡化在函數表中對它們的定位,
*所有函數名都隱含地翻譯為小寫的
*/
lcase_fname = estrndup(fname, fname_len);
zend_str_tolower(lcase_fname, fname_len);
if (zend_hash_find(EG(function_table),lcase_fname, fname_len 1, (void **)
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的php的内存划分,解析PHP中的内存管理,PHP动态分配和释放内存的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php json encode html
- 下一篇: MATLAB在温室中的应用,基于MATL