php的緩衝區詳解(php緩衝區溢出)

本文目錄一覽:

502 Bad Gateway

502badgateway要先找到nginx配置的路徑。

然後找到nginx所在的error日誌文件來查看具體原因。

如果是客戶端瀏覽器配置的問題,以360瀏覽器為例,出現502BadGateway可能是設置了代代理導致的。

取消瀏覽器代理之後,刷新一下就可以訪問了。

502BadGateway是一種報錯提示,這一錯誤並不意味着上游服務器已關閉(無響應網關/代理),而是上游服務器和網關/代理不同意的協議交換數據。

鑒於互聯網協議是相當清楚的,它往往意味着一個或兩個機器已不正確或不完全編程。

求教php 緩衝區問題

首先你找到php 的配置文件php.ini

1.php.ini中的output_buffering配置

Off: 表示關閉PHP輸出緩存

On: 打開無限大的輸出緩存

4096: 打開大小為4096Byte的輸出緩存

2.php.ini中的implicit_flush配置

On: 表示每次輸出(如echo,print)後自動調用flush()函數後,直接輸出

Off: 與On相反,每次輸出後不會調用flush(),需要等到server buffering滿了才會輸出,但是我們可以用flush()函數代替它,不開啟也沒關係,反而更加靈活

3.ob_flush()函數: 取出PHP buffering中的數據,放入server buffering

4.flush()函數: 取出Server buffering的數據,放入browser buffering

5.ob_start()函數:對於這個函數我現在了解的不是很清楚,因為開啟後輸出就會不受ob_flush()控制,即使使用ob_flush()和flush(),數據也不能立即輸出在瀏覽器上.現在知道的是,如果output_buffering=Off,即使使用了ob_start(),也是無法將輸出數據緩存的,而如果output_buffering=On的話,即使不用ob_start(),輸出數據也可以被PHP緩存,所以覺得ob_start比較廢,暫時不管他

然後我們來看代碼吧(設置output_buffering=4096,implicit_flush=Off)

最後的打印效果是

每隔一秒輸出一個

html

body

?php

// ob_start(); //這玩意開了就會不正常,輸出不受ob_flush()控制,不知道到底幹嘛用

// echo str_repeat(‘ ‘ ,1000); //IE緩存256Bytes

echo str_repeat(‘ ‘ ,1000); //Chrome和FF緩存1000Bytes,這裡用來先將瀏覽器緩存用掉,但是很疑惑這一行輸出為什麼沒有被output_buffering存起來,而是直接輸出了

for($i=0;$i5;$i++) {

echo $i.’br /’;

ob_flush();

flush();

sleep(1);

}

?

/body

/html

至於你的可以這麼寫

?php

echo str_repeat(‘ ‘ ,1000);

echo ‘abr/’;

ob_flush();

flush();

sleep(3);

echo ‘bbr/’;

?

北大青鳥java培訓:PHP應用中常用的9大緩存技術?

一、全頁面靜態化緩存也就是將頁面全部生成html靜態頁面,用戶訪問時直接訪問的靜態頁面,而不會去走php服務器解析的流程。

此種方式,在CMS系統中比較常見,比如dedecms;一種比較常用的實現方式是用輸出緩存:Ob_start()******要運行的代碼*******$content=Ob_get_contents();****將緩存內容寫入html文件*****Ob_end_clean();二、數據緩存顧名思義,就是緩存數據的一種方式;比如,商城中的某個商品信息,當用商品id去請求時,就會得出包括店鋪信息、商品信息等數據,此時就可以將這些數據緩存到一個php文件中,文件名包含商品id來建一個唯一標示;下一次有人想查看這個商品時,首先就直接調這個文件裡面的信息,而不用再去數據庫查詢;其實緩存文件中緩存的就是一個php數組之類;Ecmall商城系統裡面就用了這種方式;三、查詢緩存其實這跟數據緩存是一個思路,就是根據查詢語句來緩存;將查詢得到的數據緩存在一個文件中,下次遇到相同的查詢時,就直接先從這個文件裡面調數據,不會再去查數據庫;但此處的緩存文件名可能就需要以查詢語句為基點來建立唯一標示;按時間變更進行緩存就是對於緩存文件您需要設一個有效時間,在這個有效時間內,相同的訪問才會先取緩存文件的內容,但是超過設定的緩存時間,就需要重新從數據庫中獲取數據,並生產最新的緩存文件;比如,我將我們商城的首頁就是設置2個小時更新一次。

四、頁面部分緩存該種方式,是將一個頁面中不經常變的部分進行靜態緩存,而經常變化的塊不緩存,最後組裝在一起顯示;可以使用類似於ob_get_contents的方式實現,也可以利用類似ESI之類的頁面片段緩存策略,使其用來做動態頁面中相對靜態的片段部分的緩存。

該種方式可以用於如商城中的商品頁;五、Opcode緩存首先php代碼被解析為Tokens,然後再編譯為Opcode碼,最後執行Opcode碼,返回結果;所以,對於相同的php文件,第一次運行時可以緩存其Opcode碼,下次再執行這個頁面時,直接會去找到緩存下的opcode碼,直接執行最後一步,而不再需要中間的步驟了。

比較知名的是XCache、TurckMMCache、PHPAccelerator等。

六、按內容變更進行緩存這個也並非獨立的緩存技術,需結合著用;就是當數據庫內容被修改時,即刻更新緩存文件;比如,一個人流量很大的商城,商品很多,商品表必然比較大,這表的壓力也比較重;我們就可以對商品顯示頁進行頁面緩存;當商家在後台修改這個商品的信息時,點擊保存,我們同時就更新緩存文件;那麼,買家訪問這個商品信息時,實際問的是一個靜態頁面,而不需要再去訪問數據庫;試想,如果對商品頁不緩存,那麼每次訪問一個商品就要去數據庫查一次,如果有10萬人在線瀏覽商品,那服務器壓力就大了;七、內存式緩存提到這個,可能大家想到的首先就是Memcached;memcached是高性能的分布式內存緩存服務器。

一般的使用目的是,通過緩存數據庫查詢結果,減少數據庫訪問次數,以提高動態Web應用的速度、提高可擴展性。

它就是將需要緩存的信息,緩存到系統內存中,需要獲取信息時,直接到內存中取;比較常用的方式就是key_value方式;connect($memcachehost,$memcacheport)ordie(“Couldnotconnect”);$memcache-set(‘key’,’緩存的內容’);$get=$memcache-get($key);//獲取信息?八、apache緩存模塊apache安裝完以後,是不允許被cache的。

重慶IT培訓認為如果外接了cache或squid服務器要求進行web加速的話,就需要在htttpd.conf里進行設置,當然前提是在安裝apache的時候要激活mod_cache的模塊。

PHP中4個加速,緩存擴展的區別和選用建議

1、eAccelerator

eAccelerator是一個自由開放源碼PHP加速器,優化和動態內容緩存,提高了PHP腳本的緩存性能,使得PHP腳本在編譯的狀態下,對服務器的開銷幾乎完全消除。 它還有對腳本起優化作用,以加快其執行效率。使PHP程序代碼執效率能提高1-10倍。從文字上可以理解為:eAccelerator是PHP加速器擴展。

2、memcached

Memcached 是一個高性能的分布式內存對象緩存系統,用於動態Web應用以減輕數據庫負載。它通過在內存中緩存數據和對象來減少讀取數據庫的次數,從而提供動態、數據庫驅動網站的速度。從文字上可以理解為:內存緩存擴展,並且針對於集群服務器使用較多,主要用於分布式緩存,算是數據庫緩存。

3、Alternative PHP Cache(APC緩存)

Alternative PHP Cache (APC緩存)是一種對PHP有效的開放源高速緩衝儲存器工具,他能夠緩存Opcode(目標文件)的PHP中間碼。 APC的緩存分兩部分:系統緩存和用戶數據緩存. 系統緩存 是自動使用的,是指APC把PHP文件源碼的編譯結果緩存起來,然後在再次調用時先對比時間標記。如果未過期,則使用緩存代碼運行。默認緩存 3600s(一小時).但是這樣仍會浪費大量CPU時間.因此可以在php.ini中設置system緩存為永不過期(apc.ttl=0).不過如果這樣設置,改運PHP代碼後需要restart一下您的web服務器(比如apache…).目前對APC的性能測試一般指的是這一層cache;從文字上理到:Alternative PHP Cache(APC緩存)也算是一種內存緩存擴展,算是數據庫緩存擴展。

4、Xcache

是一個開源的opcode緩存器/優化器, 他能夠提高服務器上的PHP性能,他通過把編譯PHP後的數據緩衝到共享內存從而避免重複的編譯過程, 能夠直接使用緩衝區已編譯的代碼從而提高速度. 通常能夠提高您的頁面生成速率2到5倍, 降低服務器負載。 其實它與eAccelerator一樣是PHP加速器擴展。

以上就是他們的作用與區別,簡單一點就是:eAccelerator,xcache是PHP緩存擴展,memcached、APC緩存是數據庫緩存擴展,一般兩者只有要安裝其中一個即可,不要貪多。另外,實際測試中發現當Cache數量超過一定閥值的時候,APC的性能不如Memcache。所以在擴展的選擇上,本人一般會選擇xcache+memcached這個組合。

php中 緩衝區 理解及如何刷新緩衝區

1、如果你用過smarty模板引擎、MVC類似框架如tp,那麼你自己寫一個框架噢!

2、你要對php的繼承實現以及其中的小知識點熟知;

3、先列出你的框架目錄,什麼地方放什麼,然後寫你的配置文件

4、用到的高頻函數有:require 、 require_once 、 file_exites等!

如:sybase_connect連上數據庫。

語法: int sybase_connect(string [servername], string [username], string [password]);

返回值: 整數函數種類: 數據庫功能 本函數用來打開與 Sybase 數據庫的連接。

參數 servername 為欲連上的數據庫服務器名稱。

參數 username 及 password 可省略,分別為連接使用的帳號及密碼。

使用本函數需注意早點關閉數據庫,以減少系統的負擔。

連接成功則返回數據庫的連接代號,失敗返回 false 值。

PHP流(Stream)的概述與使用詳解

在現代 PHP 特性中,流或許是最出色但使用率最低的。雖然 PHP 4.3 就引入了流,但是很多開發者並不知道流的存在,因為人們很少提及流,而且流的文檔也很匱乏。PHP 官方文檔對流的解釋如下:

可能看完這段解釋後還是雲里霧裡,我們簡化一下,流的作用是在出發地和目的地之間傳輸數據。出發地和目的地可以是文件、命令行進程、網絡連接、ZIP 或 TAR 壓縮文件、臨時內存、標準輸入或輸出,或者是通過 PHP 流封裝協議實現的任何其他資源。

如果你讀寫過文件,就用過流;如果你從 php://stdin 讀取過數據,或者把輸入寫入 php://stdout ,也用過流。流為 PHP 的很多 IO 函數提供了底層實現,如 file_get_contents、fopn、fread 和 fwrite 等。PHP 的流函數提供了不同資源的統一接口。

我們可以把流比作管道,把水(資源數據)從一個地方引到另一個地方。在水從出發地到目的地的過程中,我們可以過濾水,可以改變水質,可以添加水,也可以排出水。

流式數據的種類各異,每種類型需要獨特的協議,以便讀寫數據,我們稱這些協議為 流封裝協議 。例如,我們可以讀寫文件系統,可以通過 HTTP、HTTPS 或 SSH 與遠程 Web 服務器通信,還可以打開並讀寫 ZIP、RAR 或 PHAR 壓縮文件。這些通信方式都包含下述相同的過程:

1.開始通信

2.讀取數據

3.寫入數據

4.結束通信

雖然過程是一樣的,但是讀寫文件系統中文件的方式與收發 HTTP 消息的方式有所不同,流封裝協議的作用是使用通用的接口封裝這種差異。

每個流都有一個協議和一個目標。指定協議和目標的方法是使用流標識符:scheme://target,其中 scheme 是流的封裝協議,target 是流的數據源。

http://流封裝協議

下面使用 HTTP 流封裝協議創建了一個與 Flicker API 通信的 PHP 流:

不要以為這是普通的網頁 URL,file_get_contents() 函數的字符串參數其實是一個流標識符。http 協議會讓 PHP 使用 HTTP 流封裝協議,在這個參數中,http 之後是流的目標。

我們通常使用 file_get_contents()、fopen()、fwrite() 和 fclose() 等函數讀寫文件系統,因為 PHP 默認使用的流封裝協議是 file://,所以我們很少認為這些函數使用的是 PHP 流。下面的示例演示了使用 file:// 流封裝協議創建一個讀寫 /etc/hosts 文件的流:

我們通常會省略掉 file:// 協議,因為這是 PHP 使用的默認值。

php://流封裝協議

編寫命令行腳本的 PHP 開發者會感激 php:// 流封裝協議,這個流封裝協議的作用是與 PHP 腳本的標準輸入、標準輸出和標準錯誤文件描述符通信。我們可以使用 PHP 提供的文件系統函數打開、讀取或寫入下面四個流:

1. php://stdin :這是個只讀 PHP 流,其中的數據來自標準輸入。PHP 腳本可以使用這個流接收命令行傳入腳本的信息;

2. php://stdout :把數據寫入當前的輸出緩衝區,這個流只能寫,無法讀或尋址;

3. php://memory :從系統內存中讀取數據,或者把數據寫入系統內存。缺點是系統內存有限,所有使用 php://temp 更安全;

4. php://temp :和 php://memory 類似,不過,沒有可用內存時,PHP 會把數據寫入這個臨時文件。

其他流封裝協議

PHP 和 PHP 擴展還提供了很多其他流封裝協議,例如,與 ZIP 和 TAR 壓縮文件、FTP 服務器、數據壓縮庫、Amazon API、Dropbox API 等通信的流封裝協議。需要注意的是,PHP 中的 fopen()、fgets()、fputs()、feof() 以及 fclose() 等函數不僅可以用來處理文件系統中的文件,還可以在所有支持這些函數的流封裝協議中使用。

自定義流封裝協議

我們還可以自己編寫 PHP 流封裝協議。PHP 提供了一個示例 StreamWrapper 類,演示如何編寫自定義的流封裝協議,支持部分或全部 PHP 文件系統函數。關於如何編寫,具體請參考以下文檔:

有些 PHP 流能夠接受一系列可選的參數,這些參數叫流上下文,用於定製流的行為。不同的流封裝協議使用的流上下文有所不同,流上下文使用 stream_context_create() 函數創建,這個函數返回的上下文對象可以傳入大多數文件系統函數。

例如,你知道可以使用 file_get_contents() 發送 HTTP POST 請求嗎?使用一個流上下文對象即可實現:

流過濾器

目前為止我們討論了如何打開流,讀取流中的數據,以及把數據寫入流。不過,PHP 流真正強大的地方在於過濾、轉換、添加或刪除流中傳輸的數據,例如,我們可以打開一個流處理 Markdown 文件,在把文件內容讀入內存的過程中自動將其轉化為 HTML。

運行該腳本,輸出的都是大寫字母:

我們還可以使用 php://filter 流封裝協議把過濾器附加到流上,不過,使用這種方式之前必須先打開 PHP 流:

這個方式實現效果和 stream_filter_append() 函數一樣,但是相比之下更為繁瑣。不過,PHP 的某些文件系統函數在調用後無法附加過濾器,例如 file() 和 fpassthru(),使用這些函數時只能使用 php://filter 流封裝協議附加流過濾器。

自定義流過濾器

我們還可以編寫自定義的流過濾器。其實,大多數情況下都要使用自定義的流過濾器,自定義的流過濾器是個 PHP 類,繼承內置的 php_user_filter 類( ),且必須實現 filter()、onCreate() 和 onClose() 方法,最後,必須使用 stream_filter_register() 函數註冊自定義的流過濾器。

然後,我們必須使用 stream_filter_register() 函數註冊這個自定義的 DirtyWordsFilter 流過濾器:

第一個參數用於標識這個自定義過濾器的過濾器名,第二個參數是這個自定義過濾器的類名。接下來就可以使用這個自定義的流過濾器了:

修改 test.txt 內容如下:

運行上面的自定義過濾器腳本,結果如下:

stream_bucket_append函數:為隊列添加數據 

stream_bucket_make_writeable函數:從操作的隊列中返回一個數據對象

stream_bucket_new函數:為當前隊列創建一個新的數據

stream_bucket_prepend函數:預備數據到隊列 

stream_context_create函數:創建數據流上下文

stream_context_get_default函數:獲取默認的數據流上下文

stream_context_get_options函數:獲取數據流的設置

stream_context_set_option函數:對數據流、數據包或者上下文進行設置

stream_context_set_params函數:為數據流、數據包或者上下文設置參數

stream_copy_to_stream函數:在數據流之間進行複製操作

stream_filter_append函數:為數據流添加過濾器

stream_filter_prepend函數:為數據流預備添加過濾器

stream_filter_register函數:註冊一個數據流的過濾器並作為PHP類執行

stream_filter_remove函數:從一個數據流中移除過濾器

stream_get_contents函數:讀取數據流中的剩餘數據到字符串

stream_get_filters函數:返回已經註冊的數據流過濾器列表

stream_get_line函數:按照給定的定界符從數據流資源中獲取行

stream_get_meta_data函數:從封裝協議文件指針中獲取報頭/元數據

stream_get_transports函數:返回註冊的Socket傳輸列表

stream_get_wrappers函數:返回註冊的數據流列表

stream_register_wrapper函數:註冊一個用PHP類實現的URL封裝協議

stream_select函數:接收數據流數組並等待它們狀態的改變

stream_set_blocking函數:將一個數據流設置為堵塞或者非堵塞狀態

stream_set_timeout函數:對數據流進行超時設置

stream_set_write_buffer函數:為數據流設置緩衝區

stream_socket_accept函數:接受由函數stream_ socket_server()創建的Socket連接

stream_socket_client函數:打開網絡或者UNIX主機的Socket連接

stream_socket_enable_crypto函數:為一個已經連接的Socket打開或者關閉數據加密

stream_socket_get_name函數:獲取本地或者網絡Socket的名稱

stream_socket_pair函數:創建兩個無區別的Socket數據流連接

stream_socket_recvfrom函數:從Socket獲取數據,不管其連接與否

stream_socket_sendto函數:向Socket發送數據,不管其連接與否

stream_socket_server函數:創建一個網絡或者UNIX Socket服務端

stream_wrapper_restore函數:恢復一個事先註銷的數據包

stream_wrapper_unregister函數:註銷一個URL地址包

整合資料

本文整合於以下兩篇文章

原創文章,作者:KEDU,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/143191.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
KEDU的頭像KEDU
上一篇 2024-10-14 18:45
下一篇 2024-10-14 18:46

相關推薦

  • PHP和Python哪個好找工作?

    PHP和Python都是非常流行的編程語言,它們被廣泛應用於不同領域的開發中。但是,在考慮擇業方向的時候,很多人都會有一個問題:PHP和Python哪個好找工作?這篇文章將從多個方…

    編程 2025-04-29
  • PHP怎麼接幣

    想要在自己的網站或應用中接受比特幣等加密貨幣的支付,就需要對該加密貨幣擁有一定的了解,並使用對應的API進行開發。本文將從多個方面詳細闡述如何使用PHP接受加密貨幣的支付。 一、環…

    編程 2025-04-29
  • 使用PHP foreach遍歷有相同屬性的值

    本篇文章將介紹如何使用PHP foreach遍歷具有相同屬性的值,並給出相應的代碼示例。 一、基礎概念 在講解如何使用PHP foreach遍歷有相同屬性的值之前,我們需要先了解幾…

    編程 2025-04-28
  • PHP獲取301跳轉後的地址

    本文將為大家介紹如何使用PHP獲取301跳轉後的地址。301重定向是什麼呢?當我們訪問一個網頁A,但是它已經被遷移到了另一個地址B,此時若服務器端做了301重定向,那麼你的瀏覽器在…

    編程 2025-04-27
  • PHP登錄頁面代碼實現

    本文將從多個方面詳細闡述如何使用PHP編寫一個簡單的登錄頁面。 1. PHP登錄頁面基本架構 在PHP登錄頁面中,需要包含HTML表單,用戶在表單中輸入賬號密碼等信息,提交表單後服…

    編程 2025-04-27
  • PHP與Python的比較

    本文將會對PHP與Python進行比較和對比分析,包括語法特性、優缺點等方面。幫助讀者更好地理解和使用這兩種語言。 一、語法特性 PHP語法特性: <?php // 簡單的P…

    編程 2025-04-27
  • 神經網絡代碼詳解

    神經網絡作為一種人工智能技術,被廣泛應用於語音識別、圖像識別、自然語言處理等領域。而神經網絡的模型編寫,離不開代碼。本文將從多個方面詳細闡述神經網絡模型編寫的代碼技術。 一、神經網…

    編程 2025-04-25
  • Linux sync詳解

    一、sync概述 sync是Linux中一個非常重要的命令,它可以將文件系統緩存中的內容,強制寫入磁盤中。在執行sync之前,所有的文件系統更新將不會立即寫入磁盤,而是先緩存在內存…

    編程 2025-04-25
  • MPU6050工作原理詳解

    一、什麼是MPU6050 MPU6050是一種六軸慣性傳感器,能夠同時測量加速度和角速度。它由三個傳感器組成:一個三軸加速度計和一個三軸陀螺儀。這個組合提供了非常精細的姿態解算,其…

    編程 2025-04-25
  • Python安裝OS庫詳解

    一、OS簡介 OS庫是Python標準庫的一部分,它提供了跨平台的操作系統功能,使得Python可以進行文件操作、進程管理、環境變量讀取等系統級操作。 OS庫中包含了大量的文件和目…

    編程 2025-04-25

發表回復

登錄後才能評論