導航:首頁 > 編程語言 > php變數棧

php變數棧

發布時間:2022-05-22 12:31:18

php自定義函數中用到的變數在何時進行垃圾回收

局部變數肯定會釋放,一般由內核在棧上釋放,假如在函數里申請了,就得記得,那個申請到的地址釋放後,指向的指針會成野指針。 關於局部變數里的函數: 在C語言中在函數裡面定義的局部變數確實會在函數結束之後被釋放掉, 例如: void print() {i...

⑵ php中static 靜態變數和普通變數的區別

php中static 靜態變數和普通變數的區別:

在變數的前面加上static 就構成了靜態變數(static 變數)。

static變數和普通變數的區別在於非靜態全局變數的作用域是整個源程序,當一個源程序由多個源文件組成時,非靜態的全局變數在各個源文件中都是有效的。 而靜態全局變數則限制了其作用域, 即只在定義該變數的源文件內有效, 在同一源程序的其它源文件中不能使用它。由於靜態全局變數的作用域局限於一個源文件內,只能為該源文件內的函數公用, 因此可以避免在其它源文件中引起錯誤。

⑶ 如何獲取PHP變數的內存地址

不能獲取PHP變數的內存地址

  1. 「在一個頁面執行完後,依然調可以用這個地址」,這種需求本身就是無理的

  2. PHP(外文名:PHP: Hypertext Preprocessor,中文名:「超文本預處理器」)是一種通用開源腳本語言。語法吸收了C語言、Java和Perl的特點,利於學習,使用廣泛,主要適用於Web開發領域。PHP 獨特的語法混合了C、Java、Perl以及PHP自創的語法。

  3. 它可以比CGI或者Perl更快速地執行動態網頁。

⑷ PHP中如何使用數組實現隊列和堆棧

PHP中將數組當做一個棧,主要是使用array_push()和array_pop()兩個系統函數來完成。入棧主要是利用array_push()函數向第一個參數的數組尾部添加一個或多個元素,然後返回新數組的長度!

⑸ 用PHP解決的一個棧的面試題

前言
遇到一道面試題,題目大概意思如下:
使用兩個普通棧實現一個特殊棧,使得pop、push、min三個函數的都是復雜度為O(1)的操作,min函數是獲得當前棧的最小值。
初步想法
1.要實現min函數為(1)操作,當時第一想法是事先需要算好當前最小值,於是會想到用一個值來保存當前棧中最小值元素,然後push和pop操作的時候維護這個值。這樣min,push都是O(1)了,但pop可不是,如果當前彈出的是最小值,需要從新尋找當前元素的最小值,這個就不是o(1)了。
2.而且上面方法沒有用到另外一個棧,於是又想到:在一個棧中存儲排好序的元素,同樣在push和pop操作中維護這個有序堆棧,如圖:
但是這樣的話min操作是O(1),但是push、pop操作因為要維護這個有序棧,怎麼也想不到一個方法可以O(1)的復雜度。
當時覺得肯定是在另一個棧中緩存最小值信息,但是不知道是因為沒吃飯還是怎麼地,思維就此僵住了。
正確解法
遇到問題解決不了,感覺心裡很不爽,於是吃飯的時候又開始想怎麼充分理由棧的特性,有效的緩存最小值信息,以便min操作使用。
棧操作最大的特性是只能操作棧頂元素,想到那用一個輔助棧緩存每次棧操作時的最小值,不是剛剛好。這樣每次pop操作的時候,兩邊一起彈出就可以;因為輔助棧的棧頂元素最當前棧中的最小值,push操作是也只需要比較入棧元素和輔助棧棧頂元素就可以。這樣push、pop、min都都O(1)操作了。如圖:
文字可能沒說清楚,上代碼,下面是PHP的實現,通過數組來模擬堆棧。
<?php
/**
*
使用一個輔助棧,O(1)復雜度求出棧中的最小數
*
@hack
類中通過數組來模擬堆棧
*
*
@author
laiwenhui
*/
class
strack{
/**
*
數據棧,存儲棧數據;
*
*
@var
array
*/
private
$_arrData
=
array();
/**
*
輔助棧,存儲數據組棧中每層的最下值信息;
*
*
@var
array
*/
private
$_arrMin
=
array();
/**
*
棧頂所在單元
*
*
@var
int
*/
private
$_top=-1;
/**
*
出棧
*
@return
bool|int
*/
public
function
pop(){
if
($this->_top
===
-1){
return
false;
}
array_pop($this->_arrMin);
$this->_top--;
return
array_pop($this->_arrData);
}
/**
*
入棧
*
@param
int
$element
*
@return
bool
*/
public
function
push($element){
$element
=
intval($element);
//如果棧為空,直接入棧
if
($this->_top
===
-1){
array_push($this->_arrData,
$element);
array_push($this->_arrMin,
$element);
$this->_top++;
return
true;
}
//不為空,判斷入棧的值是否比最小棧棧頂小
$min
=
$this->_arrMin[$this->_top];
//比較求出最小值
$currentMin
=
$element
<
$min
?
$element
:
$min;
//當前棧中最小值入棧
array_push($this->_arrMin,
$currentMin);
//數據入棧
array_push($this->_arrData,
$element);
$this->_top++;
return
true;
}
/**
*
求當前棧空間的最小值
*
@return
bool|int
*/
public
function
min(){
if
($this->_top
===
-1){
return
false;
}
return
$this->_arrMin[$this->_top];
}
}
使用如下:
復制代碼
代碼如下:
$obj
=
new
strack();
$obj->push(12);
$obj->push(56);
$obj->push(23);
$obj->push(89);
$obj->push(4);
var_mp($obj->min());
$obj->pop();
var_mp($obj->min());
$obj->push(8);
var_mp($obj->min());
輸出為:
復制代碼
代碼如下:
int(4)
int(12)
int(8)
OK,滿足要求。
你是否有其他更好方法實現,如果有,請告訴我^_^

⑹ php中的靜態變數和動態變數的區別

動態變數和靜態變數的區別:
1、存儲位置
動態變數:存儲在內存出棧數據區
靜態變數:存儲在全局數據區(靜態數據區)
2、生命期
動態變數:根據你定義的位置確定,比如你在一個函數中定義的,那麼超出該函數范圍變數將失效
靜態變數:程序結束時才釋放
3、作用域
動態變數:同樣的要根據你定義的位置才能確定,和第二點的一樣
靜態變數:當前文件中有效
堆和棧的區分:
堆(Heap)棧(Stack)
1、內存分配方面:
堆:一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收 。注意它與數據結構中的堆是兩回事,分配方式是類似於鏈表。可能用到的關鍵字如下:new、malloc、delete、free等等。
棧:由編譯器(Compiler)自動分配釋放,存放函數的參數值,局部變數的值等。其操作方式類似於數據結構中的棧。
2、申請方式方面:
堆:需要程序員自己申請,並指明大小。在c中malloc函數如p1 = (char *)malloc(10);在C++中用new運算符,但是注意p1、p2本身是在棧中的。因為他們還是可以認為是局部變數。
棧:由系統自動分配。 例如,聲明在函數中一個局部變數 int b;系統自動在棧中為b開辟空間。
3、系統響應方面:
堆:操作系統有一個記錄空閑內存地址的鏈表,當系統收到程序的申請時,會遍歷該鏈表,尋找第一個空間大於所申請空間的堆結點,然後將該結點從空閑結點鏈表中刪除,並將該結點的空間分配給程序,另外,對於大多數系統,會在這塊內存空間中的首地址處記錄本次分配的大小,這樣代碼中的delete語句才能正確的釋放本內存空間。另外由於找到的堆結點的大小不一定正好等於申請的大小,系統會自動的將多餘的那部分重新放入空閑鏈表中。
棧:只要棧的剩餘空間大於所申請空間,系統將為程序提供內存,否則將報異常提示棧溢出。
4、大小限制方面:
堆:是向高地址擴展的數據結構,是不連續的內存區域。這是由於系統是用鏈表來存儲的空閑內存地址的,自然是不連續的,而鏈表的遍歷方向是由低地址向高地址。堆的大小受限於計算機系統中有效的虛擬內存。由此可見,堆獲得的空間比較靈活,也比較大。
棧:在Windows下, 棧是向低地址擴展的數據結構,是一塊連續的內存的區域。這句話的意思是棧頂的地址和棧的最大容量是系統預先規定好的,在WINDOWS下,棧的大小是固定的(是一個編譯時就確定的常數),如果申請的空間超過棧的剩餘空間時,將提示overflow。因此,能從棧獲得的空間較小。
5、效率方面:
堆:是由new分配的內存,一般速度比較慢,而且容易產生內存碎片,不過用起來最方便,另外,在WINDOWS下,最好的方式是用VirtualAlloc分配內存,他不是在堆,也不是在棧是直接在進程的地址空間中保留一快內存,雖然用起來最不方便。但是速度快,也最靈活。
棧:由系統自動分配,速度較快。但程序員是無法控制的。
6、存放內容方面:
堆:一般是在堆的頭部用一個位元組存放堆的大小。堆中的具體內容有程序員安排。
棧:在函數調用時第一個進棧的是主函數中後的下一條指令(函數調用語句的下一條可執行語句)的地址然後是函數的各個參數,在大多數的C編譯器中,參數是由右往左入棧,然後是函數中的局部變數。 注意: 靜態變數是不入棧的。當本次函數調用結束後,局部變數先出棧,然後是參數,最後棧頂指針指向最開始存的地址,也就是主函數中的下一條指令,程序由該點繼續運行。
7、存取效率方面:
堆:char *s1 = "Hellow Word";是在編譯時就確定的;
棧:char s1[] = "Hellow Word"; 是在運行時賦值的;用數組比用指針速度要快一些,因為指針在底層匯編中需要用edx寄存器中轉一下,而數組在棧上直接讀取。

⑺ php全局變數在棧上嗎

和靜態變數都是保存在全局區的,普通變數保存在棧區,動態分配的內存空間是存在堆區的

⑻ php變數的值存儲在棧內存還是堆內存上

和C一樣
壓棧再出棧

⑼ php中帶索引二維數組怎麼入棧

這樣直接賦值後,已經生成了數組。
如果變數中的值有數組的話,$yaosu已經是二維數組了。
如果變數中的值沒有數組,則 $yaosu 是一維數組。

可以使用:
var_mp($yaosu);
列印一下變數的詳細信息,就明白了。

⑽ 怎麼在php.ini中增加調用棧

一,php-fpm的啟動參數二,php-fpm.conf重要參數詳解#pid設置,默認在安裝目錄中的var/run/php-fpm.pid,建議開啟#錯誤日誌,默認在安裝目錄中的var/log/php-fpm.log#表示在emergency_restart_interval所設值內出現SIGSEGV或者SIGBUS錯誤的php-cgi進程數如果超過 emergency_restart_threshold個,php-fpm就會優雅重啟。這兩個選項一般保持默認值。#後台執行fpm,默認值為yes,如果為了調試可以改為no。在FPM中,可以使用不同的設置來運行多個進程池。 這些設置可以針對每個進程池單獨設置。#fpm監聽埠,即nginx中php處理的地址,一般默認值即可。可用格式為: 'ip:port', 'port', '/path/to/unix/socket'. 每個進程池都需要設置.#backlog數,-1表示無限制,由操作系統決定,此行注釋掉就行。backlog含義參考:#允許訪問FastCGI進程的IP,設置any為不限制IP,如果要設置其他主機的nginx也能訪問這台FPM進程,listen處要設置成本地可被訪問的IP。默認值是any。每個地址是用逗號分隔. 如果沒有設置或者為空,則允許任何伺服器請求連接#unix socket設置選項,如果使用tcp方式訪問,這里注釋即可。pm = dynamic #對於專用伺服器,pm可以設置為static。#如何控制子進程,選項有static和dynamic。如果選擇static,則由pm.max_children指定固定的子進程數。如果選擇dynamic,則由下開參數決定:pm.max_children #,子進程最大數pm.start_servers #,啟動時的進程數pm.min_spare_servers #,保證空閑進程數最小值,如果空閑進程小於此值,則創建新的子進程pm.max_spare_servers #,保證空閑進程數最大值,如果空閑進程大於此值,此進行清理#FPM監控頁面的ping網址. 如果沒有設置, 則無法訪問ping頁面. 該頁面用於外部檢測FPM是否存活並且可以響應請求. 請注意必須以斜線開頭 (/)。#設置單個請求的超時中止時間. 該選項可能會對php.ini設置中的'max_execution_time'因為某些特殊原因沒有中止運行的腳本有用. 設置為 '0' 表示 'Off'.當經常出現502錯誤時可以嘗試更改此選項。#當一個請求該設置的超時時間後,就會將對應的PHP調用堆棧信息完整寫入到慢日誌中. 設置為 '0' 表示 'Off'#設置文件打開描述符的rlimit限制. 默認值: 系統定義值默認可打開句柄是1024,可使用 ulimit -n查看,ulimit -n 2048修改。#設置啟動目錄,啟動時會自動Chdir到該目錄. 所定義的目錄需要是絕對路徑. 默認值: 當前目錄,或者/目錄(chroot時)三,常見錯誤及解決辦法整理1,request_terminate_timeout的值如果設置為0或者過長的時間,可能會引起file_get_contents的資源問題。如果file_get_contents請求的遠程資源如果反應過慢,file_get_contents就會一直卡在那裡不會超時,我們知道php.ini 裡面max_execution_time 可以設置 PHP 腳本的最大執行時間,但是,在 php-cgi(php-fpm) 中,該參數不會起效。真正能夠控制 PHP 腳本最大執行時間的是 php-fpm.conf 配置文件中的request_terminate_timeout參數。request_terminate_timeout默認值為 0 秒,也就是說,PHP 腳本會一直執行下去。這樣,當所有的 php-cgi 進程都卡在 file_get_contents() 函數時,這台 Nginx+PHP 的 WebServer 已經無法再處理新的 PHP 請求了,Nginx 將給用戶返回「502 Bad Gateway」。修改該參數,設置一個 PHP 腳本最大執行時間是必要的,但是,治標不治本。例如改成 30s,如果發生 file_get_contents() 獲取網頁內容較慢的情況,這就意味著 150 個 php-cgi 進程,每秒鍾只能處理 5 個請求,WebServer 同樣很難避免"502 Bad Gateway"。解決辦法是request_terminate_timeout設置為10s或者一個合理的值,或者給file_get_contents加一個超時參數。'timeout' => 10 //設置一個超時時間,單位為秒2,max_requests參數配置不當,可能會引起間歇性502錯誤:這段配置的意思是,當一個 PHP-CGI 進程處理的請求數累積到 500 個後,自動重啟該進程。一般在項目中,我們多多少少都會用到一些 PHP 的第三方庫,這些第三方庫經常存在內存泄漏問題,如果不定期重啟 PHP-CGI 進程,勢必造成內存使用量不斷增長。因此 PHP-FPM 作為 PHP-CGI 的管理器,提供了這么一項監控功能,對請求達到指定次數的 PHP-CGI 進程進行重啟,保證內存使用量不增長。正是因為這個機制,在高並發的站點中,經常導致 502 錯誤,我猜測原因是 PHP-FPM 對從 NGINX 過來的請求隊列沒處理好。不過我目前用的還是 PHP 5.3.2,不知道在 PHP 5.3.3 中是否還存在這個問題。目前我們的解決方法是,把這個值盡量設置大些,盡可能減少 PHP-CGI 重新 SPAWN 的次數,同時也能提高總體性能。在我們自己實際的生產環境中發現,內存泄漏並不明顯,因此我們將這個值設置得非常大(204800)。大家要根據自己的實際情況設置這個值,不能盲目地加大。話說回來,這套機制目的只為保證 PHP-CGI 不過分地佔用內存,為何不通過檢測內存的方式來處理呢?我非常認同高春輝所說的,通過設置進程的峰值內在佔用量來重啟 PHP-CGI 進程,會是更好的一個解決方案。3,php-fpm的慢日誌,debug及異常排查神器:request_slowlog_timeout設置一個超時的參數,slowlog設置慢日誌的存放位置,tail -f /var/log/即可看到執行過慢的php過程。大家可以看到經常出現的網路讀取超過、Mysql查詢過慢的問題,根據提示信息再排查問題就有很明確的方向了。require()語句用於指定的文件代替語句本身,就象C語言中的include()語句一樣。如果php配置文件php.ini中的URL fopenwrappers 是打開的(默認情況下是打開的),就可以使用URL來指定文件的位置從而實現遠程文件的調用。有一點就是使用require()和include()語句時要特別的注意。那就是在被包含的文件中,處理器是按照html模式來解釋其中的內容的,處理完被包含的內容後又恢復到php模式。所以如果需要在被包含文件中使用php語法,就要使用正確的php開始和結束標記來把這些語句包含進去。require()和include()知識php中的一種語言特性,而不是函數。它們和函數有許多不同的地方。include()語句和require()語句有許多相同的地方。凡是在上邊require()語句中沒有明確說明不能適用於include()的部分外,require()語句的功能完全適用於include()語句。下邊介紹require()語句所沒有的include()語句的功能和特點。include語句只有在被執行時才會讀入要包含的文件。在錯誤處理方便,使用include語句,如果發生包含錯誤,程序將跳過include語句,雖然會顯示錯誤信息但是程序還是會繼續執行!php處理器會在每次遇到include()語句時,對它進行重新處理,所以可以根據不同情況的,在條件控制語句和循環語句中使用include()來包含不同的文件。require_once()和include_once()語句分別對應於require()和include()語句。require_once()和include_once()語句主要用於需要包含多個文件時,可以有效地避免把同一段代碼包含進去而出現函數或變數重復定義的錯誤運行PHP程序,通常會遇到「Fatal Error: Allowed memory size of xxxxxx bytes exhausted」的錯誤, 這個意味著PHP腳本使用了過多的內存,並超出了系統對其設置的允許最大內存。解決這個問題,首先需要查看你的程序是否分配了過多的內存,在程序沒有問題的情況下,你可以通過一下方法來增加PHP的內存限制(memory_limit)。為了查看這個值,你需要建立一個空的php文件,比如view-php-info.php。然後將一下代碼貼到裡面。將這個腳本放到你的Web伺服器上,然後在瀏覽器中調用它。這時你可以看到你的PHP環境配置的信息,其中有一部分是關於「memory_limit」的,註:你可以用這種方法來查看php的其他參數設置,不僅僅是memory_limit這個完全依賴於你的應用的要求。比如Wordpress,運行起核心代碼需要32MB。Drupal 6則要求這個值最小為16MB,並推薦設置為32MB。如果你又安裝不少的插件(plugins),尤其是那些要進行圖像處理的模塊,那麼你可能需要128MB或更高的內存。說明: 這種方法只有在php以Apache模塊來執行時才生效。 在你的網站的根目錄下找到「.htaccess」文件,如果沒有,可以自己創建一個。然後把以下配置放入其中php_value memory_limit 128M ; 可以將128M改為任何你想設置的值在你的php代碼中增加以下命令行即可。1.首先找到對你的網站生效的php.ini文件 由於有多個地方都可以設置php的參數,找到正確的配置文件,並進行更改是首先要做的一步。如果你上面的方法建立了php文件來查看其配置參數,則你可以找到「Loaded Configuration File」這一項,以下是個例子:對於Linux用戶,你可以通過執行「php -i | grep Loaded Configuration File」來找到對應的配置文件。而Windows用戶,你可以嘗試修改你的php安裝目錄下的php.ini。2.編輯php.ini 在php.ini中,找到「memory_limit」這一項,如果沒有,你可以在文件的尾部自己增加這個參數。以下是一些設置範例3.重啟web 伺服器 如果是web伺服器使用Apache, 則執行:有些情況下,你可能不被允許私修改php.ini。比如如果你購買了虛擬主機服務,但是你的服務商確禁止你修改這個文件。那麼,你可以需要考慮用其他方法來增加memory_limit的值。如果你使用虛擬主機,有可能會出現memory_limit的值修改失敗。這個需要聯系你的服務商幫你處理。在實驗的時候發現是可以的,代碼如下在調用Test類實例的doExternalFunction()方法時,外部的func()方法是可以運行的,因為它是全局的。但是建議不要這樣使用,因為Test::doExternalFunction()對func()函數有依賴,當項目比較大時,而func()和Test類沒有同時引入到一個文件中來,會引起錯誤。比較理想的情況是,使用回調函數的形式來調用外部函數,就像執行在Test::doExternalFunction()執行sayHello()一樣require()語句用於指定的文件代替語句本身,就象C語言中的include()語句一樣。如果php配置文件php.ini中的URL fopenwrappers 是打開的(默認情況下是打開的),就可以使用URL來指定文件的位置從而實現遠程文件的調用。有一點就是使用require()和include()語句時要特別的注意。那就是在被包含的文件中,處理器是按照html模式來解釋其中的內容的,處理完被包含的內容後又恢復到php模式。所以如果需要在被包含文件中使用php語法,就要使用正確的php開始和結束標記來把這些語句包含進去。require()和include()知識php中的一種語言特性,而不是函數。它們和函數有許多不同的地方。include()語句和require()語句有許多相同的地方。凡是在上邊require()語句中沒有明確說明不能適用於include()的部分外,require()語句的功能完全適用於include()語句。下邊介紹require()語句所沒有的include()語句的功能和特點。include語句只有在被執行時才會讀入要包含的文件。在錯誤處理方便,使用include語句,如果發生包含錯誤,程序將跳過include語句,雖然會顯示錯誤信息但是程序還是會繼續執行!php處理器會在每次遇到include()語句時,對它進行重新處理,所以可以根據不同情況的,在條件控制語句和循環語句中使用include()來包含不同的文件。 require_once()和include_once()語句分別對應於require()和include()語句。require_once()和include_once()語句主要用於需要包含多個文件時,可以有效地避免把同一段代碼包含進去而出現函數或變數重復定義的錯誤將下載的擴展文件放在「PHP\ext」目錄下(在 PHP 4 中位於「PHP\extensions」目錄下)。打開php.ini 配置文件載入 PHP 擴展。extension=php_*.dll

閱讀全文

與php變數棧相關的資料

熱點內容
代碼可以編譯運行 瀏覽:918
銀行卡加密碼大全真號 瀏覽:447
單片機測esr 瀏覽:412
app怎麼設置消息功能 瀏覽:916
明詞pdf 瀏覽:427
雲域控伺服器有什麼用 瀏覽:577
位元組和B站程序員 瀏覽:747
app推薦書要怎麼做 瀏覽:303
unix網路編程第一卷 瀏覽:850
c需要pdf 瀏覽:865
超級解壓的美甲 瀏覽:72
安卓手機如何永久取消靜音 瀏覽:722
appstore免密碼支付怎麼關閉 瀏覽:30
域控制器如何備份到另一伺服器 瀏覽:306
騰訊雲應用伺服器可以做什麼 瀏覽:507
二次元表格編程 瀏覽:20
plc編程器保停 瀏覽:963
如何降低伺服器的內存佔用率 瀏覽:868
阿里雲伺服器是個什麼意思 瀏覽:817
國內最好的數控編程培訓學校 瀏覽:13