欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

php釋放數(shù)據(jù)流,php返回文件流

php運行機制是什么

PHP是一種純解釋型在服務端執(zhí)行的可以內(nèi)嵌HTML的腳本語言,尤其適合開發(fā)Web應用程序。

成都創(chuàng)新互聯(lián)公司長期為近1000家客戶提供的網(wǎng)站建設服務,團隊從業(yè)經(jīng)驗10年,關注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務;打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為勐海企業(yè)提供專業(yè)的做網(wǎng)站、網(wǎng)站建設勐海網(wǎng)站改版等技術服務。擁有十年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。

請求一個 PHP 腳本時,PHP 會讀取該腳本,并將其編譯為 Zend 操作碼,這是要執(zhí)行的代碼的一種二進制表示形式。隨后,此操作碼由 PHP 執(zhí)行并丟棄。 PHP腳本在每次被解釋時進行初始化,在解釋完畢后終止運行。這種運行是互相獨立的,每一次請求都會創(chuàng)建一個單獨的進程或線程,來解釋相應的頁面文件。頁面創(chuàng)建的變量和其他對象,都只在當前的頁面內(nèi)部可見,無法跨越頁面訪問。在終止運行后,頁面中申請的、沒有被代碼顯式釋放的外部資源,包括內(nèi)存、數(shù)據(jù)庫連接、文件句柄、Socket連接等,都會被強行釋放。也就是說,PHP無法在語言級別上實現(xiàn)直接訪問跨越頁面的變量,也無法創(chuàng)建駐留內(nèi)存的對象。

PHP這種獨特的工作模型的優(yōu)勢在于,基本上解決了令人頭疼的資源泄漏問題。Web應用的特點是大量的、短時間的并發(fā)處理,對各種資源的申請和釋放工作非常頻繁,很容易導致泄漏甚至崩潰。PHP的運行機制決定它不存在常規(guī)的崩潰問題(頂多連接超時腳本停止執(zhí)行),可以說PHP是較穩(wěn)定的Web應用。但是,這種機制的缺點也非常明顯。最直接的后果是,PHP在語言級別無法實現(xiàn)跨頁面的緩沖機制。這種緩沖機制缺失造成的影響,可以分成兩個方面:

一是對象的緩沖。眾所周知,很多設計模式都依賴于對象的緩沖機制,創(chuàng)建和銷毀對象是很費時間的,因為創(chuàng)建一個對象要獲取內(nèi)存資源或者其它更多資源,對于需要頻繁應付大量并發(fā)的服務端軟件更是如此。因此,對象緩沖的缺失,理論上會極大地降低速度。應盡可能減少創(chuàng)建和銷毀對象的次數(shù)來提高服務程序的效率,由于 PHP目前還不支持多線程,也就無法像Java一樣通過線程池調(diào)度來彌補這一缺陷;但可以使用第三方軟件如Memcachd來實現(xiàn)PHP的對象緩沖機制,達到減少對象創(chuàng)建和銷毀的時間來提高服務程序的效率。Memcachd將PHP編譯后的 操作碼緩存并在內(nèi)存中保存這個操作碼,并在下一次調(diào)用該頁面時重用它,這會節(jié)省很多時間。比較常用的緩存還有有 eAccelerator,另一種流行的 eAccelerator 替代工具是 Alternative PHP Cache(APC)。

二是數(shù)據(jù)庫連接的緩沖。對于MySQL,PHP提供了一種內(nèi)置的數(shù)據(jù)庫緩沖機制,即用mysql_pconnect()代替mysql_connect() 來打開數(shù)據(jù)庫而已。PHP會自動回收被廢棄的數(shù)據(jù)庫連接,以供重復使用。在實際應用中,這種持久性數(shù)據(jù)庫連接往往會導致數(shù)據(jù)庫連接的偽泄漏現(xiàn)象:在某個時間,并發(fā)的數(shù)據(jù)庫連接過多,超過了MySQL的最大連接數(shù),從而導致新的進程無法連接數(shù)據(jù)庫。但是過一段時間,當并發(fā)數(shù)減少時,PHP會釋放掉一些連接,網(wǎng)站又會恢復正常。出現(xiàn)這種現(xiàn)象的原因是,當使用pconnect時,Apache 的httpd進程會不釋放connect,而當Apache的httpd進程數(shù)超過了mysql的最大連接數(shù)時,就會出現(xiàn)無法連接的情況。因此,需要小心地調(diào)整Apache和Mysql的配置,以使Apache的httpd進程數(shù)不會超出MySQL的最大連接數(shù)。筆者經(jīng)過實踐,在PHP5和 Oracle10g的連接中,由于頻于數(shù)據(jù)庫連接,有時候還會出現(xiàn)數(shù)據(jù)庫丟失連接的情況(Oracle官方有針對PHP的增強包,不知是否可以解決此問題,筆者未試)。

PHP的工作模型即是缺點也是優(yōu)勢,從本質(zhì)上說,這就是PHP 的獨特之處。

若以FastCGI模式運行php,解析php.ini、載入全部擴展并重初始化全部數(shù)據(jù)結(jié)構這些都只在進程啟動時發(fā)生一次。一個額外的好處是,持續(xù)數(shù)據(jù)庫連接可以工作。Nginx+PHP(FastCGI)是個不錯的選擇。

關于PHP數(shù)據(jù)庫

PHP調(diào)用三種數(shù)據(jù)庫的方法

本文比較詳細的介紹PHP調(diào)用MySQL、ODBC以及ORACLE數(shù)據(jù)庫。

MySQL是一個小巧靈瓏的數(shù)據(jù)庫服務器軟件,對于中、小型應用系統(tǒng)是非常理想的。除了支持標準的ANSI SQL語句外,最重要的是,它還支持多種平臺,而在Unix/Linux系統(tǒng)上,MySQL支持多線程運行方式,從而能獲得相當好的性能。它和PHP、 Apache一樣,是屬于開放源代碼軟件。其官方網(wǎng)站是:,上面提供Windows,Linux,Unix版本的源代碼的下載。

注意,MySQL訪問函數(shù)都需要有相應的權限才能運行。常用的相關函數(shù)介紹如下:

(1)integer mysql_connect(主機,用戶名,口令);

此函數(shù)開始一個對指定主機上的MySQL數(shù)據(jù)庫的連接。若該數(shù)據(jù)庫位于一個不同地端口,則在主機名后加上冒號和端口號。所有參數(shù)均為可選的,缺省情況下分別對應為本地主機、用戶正在執(zhí)行的腳本名和空。主機可以是IP地址或域名。

在腳本執(zhí)行結(jié)束時,連接被自動關閉,也可以用mysql_close提前關閉。

(2)boolean mysql_create_db(數(shù)據(jù)庫名);

創(chuàng)建一個數(shù)據(jù)庫。注意必須用一個帶有創(chuàng)建數(shù)據(jù)庫許可權的帳號打開連接。

(3)boolean mysql_select_db(數(shù)據(jù)庫名,連接號);

選擇缺省數(shù)據(jù)庫。

(4)integer mysql_query(SQL語句,連接號);

對指定數(shù)據(jù)庫進行查詢。如果SQL語句是select,則返回一個結(jié)果號,否則返回的值可以不理會。如果失敗,返回false.。

(5)array mysql_fetch_array(結(jié)果號);

取出下一行,返回一個數(shù)組.可以用數(shù)字下標訪問(第一個字段是下標 0),也可以用字符串下標訪問(即使用各字段名)。如已取了最后一行,返回 false.。

(6)mysql_fetch_row(結(jié)果號);

返回一個矩陣代表結(jié)果集中一行的所有域。每次調(diào)用都會產(chǎn)生下一行,直到?jīng)]有行剩下時返回false。每個域值都由一個從零開始的偏移量索引。這是從查詢中獲取結(jié)果的最快方法。

(7)integer mysql_num_rows(結(jié)果號);

返回結(jié)果集中行的數(shù)目

(8)integer mysql_num_fields(結(jié)果號);

返回結(jié)果集中域的數(shù)目。

(9)integer mysql_list_dbs();

向服務器查詢數(shù)據(jù)庫列表。它返回一個結(jié)果指針,該指針可用于mysql_fetch_row函數(shù)及類似函數(shù)。

(10)mysql_list_tables(數(shù)據(jù)庫名);

獲取一個指向指定數(shù)據(jù)庫的表單列表的結(jié)果指針。該結(jié)果指針可用于任何從結(jié)果集中獲取行的函數(shù)。

(11)mysql_close(連接號);

關閉對數(shù)據(jù)庫的連接。連接必須是由mysql_connect打開的。該函數(shù)的使用不是嚴格必需的,因為在腳本結(jié)束時,所有非永久鏈路都會被自動關閉。

(12)mysql_pconnect(主機,用戶名,口令);

與mysql_connect完全相似,但建立一個"永久連接",該連接一經(jīng)建立永不關閉,即使使用mysql_close函數(shù)或程序執(zhí)行完畢也不關閉.下一次試圖建立永久連接時,系統(tǒng)如發(fā)現(xiàn)已存在一個永久連接,則直接返回該連接號而不重新創(chuàng)建。

下面是一個調(diào)用MYSQL數(shù)據(jù)庫并分頁顯示的例子。

?

$pagesize = 5; //每頁顯示5條記錄

$host="localhost";

$user="user";

$password="psw";

$dbname="book"; //所查詢的庫表名;

//連接MySQL數(shù)據(jù)庫

mysql_connect("$host","$user","$password") or die("無法連接MySQL數(shù)據(jù)庫服務器!");

$db = mysql_select_db("$dbname") or die("無法連接數(shù)據(jù)庫!");

$sql = "select count(*) as total from pagetest";//生成查詢記錄數(shù)的SQL語句

$rst = mysql_query($sql) or die("無法執(zhí)行SQL語句:$sql !"); //查詢記錄數(shù)

$row = mysql_fetch_array($rst) or die("沒有更多的記錄!"); /取出一條記錄

$rowcount = $row["total"];//取出記錄數(shù)

mysql_free_result($rst) or die("無法釋放result資源!"); //釋放result資源

$pagecount = bcdiv($rowcount+$pagesize-1,$pagesize,0);//算出總共有幾頁

if(!isset($pageno)) {

$pageno = 1; //在沒有設置pageno時,缺省為顯示第1頁

}

if($pageno1) {

$pageno = 1; //若pageno比1小,則把它設置為1

}

if($pageno$pagecount) {

$pageno = $pagecount; //若pageno比總共的頁數(shù)大,則把它設置為最后一頁

}

if($pageno0) {

$href = eregi_replace("%2f","/",urlencode($PHP_SELF));//把$PHP_SELF轉(zhuǎn)換為可以在URL上使用的字符串,這樣的話就可以處理中文目錄或中文文件名

if($pageno1){//顯示上一頁的褳接

echo "a href="" . $href . "?pageno=" . ($pageno-1) . ""上一頁/a ";

}

else{

echo "上一頁";

}

for($i=1;$i$pageno;$i++){

echo "a href="" . $href . "?pageno=" . $i . """ . $i . "/a ";

}

echo $pageno . " ";

for($i++;$i=$pagecount;$i++){

echo "a href="" . $href . "?pageno=" . $i . """ . $i . "/a ";

}

if($pageno$pagecount){//顯示下一頁的褳接

echo "a href="" . $href . "?pageno=" . ($pageno+1) . ""下一頁/a ";

}

else{

echo "下一頁 ";

}

$offset = ($pageno-1) * $pagesize;//算出本頁第一條記錄在整個表中的位置(第一條記錄為0)

$sql = "select * from pagetest LIMIT $offset,$pagesize";//生成查詢本頁數(shù)據(jù)的SQL語句

$rst = mysql_query($sql);//查詢本頁數(shù)據(jù)

$num_fields = mysql_num_fields($rst);//取得字段總數(shù)

$i = 0;

while($i$num_fields){//取得所有字段的名字

$fields[$i] = mysql_field_name($rst,$i);//取得第i+1個字段的名字

$i++;

}

echo "table border="1" cellspacing="0" cellpadding="0"";//開始輸出表格

echo "tr";

reset($fields);

while(list(,$field_name)=each($fields)){//顯示字段名稱

echo "th$field_name/th";

}

echo "/tr";

while($row=mysql_fetch_array($rst)){//顯示本頁數(shù)據(jù)

echo "tr";

reset($fields);

while(list(,$field_name)=each($fields)){//顯示每個字段的值

$field_value = $row[$field_name];

if($field_value==""){

echo "td /td";

}

else{

echo "td$field_value/td";

}

}

echo "/tr";

}

echo "/table";//表格輸出結(jié)束

mysql_free_result($rst) or die("無法釋放result資源!");//釋放result資源

}

else{

echo "目前該表中沒有任何數(shù)據(jù)!";

}

mysql_close($server) or die("無法與服務器斷開連接!");//斷開連接并釋放資源

?

開放數(shù)據(jù)庫連接(ODBC)已成為一種與數(shù)據(jù)庫進行通信的工業(yè)標準。PHP也提供了標準的接口,使得PHP能調(diào)用Access,SQL SERVER等數(shù)據(jù)庫。其相關函數(shù)是:

(1)integer odbc_connect(string dsn, string user, string password)

連接到一個ODBC數(shù)據(jù)庫源名字上。

(2)integer odbc_exec(integer connection, string query)或 odbc_do(integer connection, string query)

在一個連接上執(zhí)行查詢。

(3)boolean odbc_fetch_row(integer result, integer row)

從一個結(jié)果集中獲取一行數(shù)據(jù)。Row參數(shù)是可選的,若為空缺,則返回下一個有效行。在結(jié)果集中不再剩余行時返回false。

(4)boolean odbc_close(integer connection)

關閉一個數(shù)據(jù)庫的連接。若在該連接上有打開的事務,則返回一個錯誤,而且連接不會被關閉。

最后,還是看個分頁的例子:

?

//設定每頁顯示條數(shù)

$show_num = 10;

$spages = $pages;//避免$pages后期被改變

//定義連接

$dsn = "localhost";

$user = "sa";

$password = "";

//計算總記錄數(shù)

$rs_num = "select count(*) as id from bbs where zu='0' and lei='".$lei."'";

$conn_id = odbc_connect($dsn,$user,$password);

$rnum = odbc_exec($conn_id,$rs_num);

while(odbc_fetch_row($rnum)){

$total_rs = odbc_result($rnum,"id");//將總記錄數(shù)放入$total_rs變量

}

//計算與頁有關的條數(shù)

$nnn = $total_rs / $show_num;//計算總頁數(shù)

$hnnn = intval($nnn);//將總頁數(shù)取整

$cnnnn = $nnn - $hnnn;

//計算所需總頁數(shù)

switch ($cnnn){

case "0":

$hnnn++;

$nnn = $hnnn;//總頁數(shù)

break;

default :

$nnn = $hnnn;//總頁數(shù)

break;

};

if ($nnn == 0)$nnn++;

//計算頁面改變所需的條件

$fore = $pages;

$next = $pages;

$fore -= 1;

$next += 1;

if ($fore 0) {

echo "a首頁/a";

echo "a前頁/a";

};

if ($pages $nnn) {

echo "a后頁/a";

echo "a尾頁/a";

};

echo "共".$nnn."頁";

$query_string = "SELECT * FROM table where condition order by you wanted order";

$cur = odbc_exec($conn_id,$query_string);

//取到循環(huán)的頂部

$cnum = ($pages-1) * $show_num;//計算當前的記錄游標的位置

//空循環(huán)到顯示記錄游標處

if ($cnum != 0){

for ($i=0;$i=$cnum;odbc_fetch_row($cur)){$i++;};

};

$i=1;

//顯示記錄

while(odbc_fetch_row($cur)){

echo ;

if ($i == $show_num){//在不滿頁數(shù)時跳出程序

break;

};

$i++;

};

//關閉連接

odbc_close($conn_id);

?

Oracle(甲骨文)是世界上最為流行的關系數(shù)據(jù)庫。它是大公司推崇的工業(yè)化的強有力的引擎。我們先看看其相關的函數(shù):

(1)integer ora_logon(string user , string password)

開始對一個Oracle數(shù)據(jù)庫服務器的連接。

(2)integer ora_open(integer connection)

打開給出的連接的游標。

(3)integer ora_do(integer connection, string query)

在給出的連接上執(zhí)行查詢。PHP生成一個指示器,解析查詢,并執(zhí)行之。

(4)integer ora_parse(integer cursor, string query)

解析一個查詢并準備好執(zhí)行。

(5)boolean ora_exec(integer cursor)

執(zhí)行一個先前由ora_parse函數(shù)解析過的查詢。

(6)boolean ora_fetch(integer cursor)

此函數(shù)會使得一個執(zhí)行過的查詢中的行被取到指示器中。這使得您可以調(diào)用ora_getcolumn函數(shù)。

(7)string ora_getcolumn(integer cursor, integer column)

返回當前的值。列由零開始的數(shù)字索引。

(8)boolean ora_logoff(integer connection)

斷開對數(shù)據(jù)庫服務器的鏈接。

以下是向ORACLE數(shù)據(jù)庫插入數(shù)據(jù)的示例程序:

html

headtitle向ORACLE數(shù)據(jù)庫中插入數(shù)據(jù)/title/head

body

form action="?echo $PHP_SELF;?" method="post"

table border="1" cellspacing="0" cellpadding="0"

tr

thID/th

thname/th

thDescription/th

/tr

tr

tdinput type="text" name="name" maxlength="50" size="10"/td

tdinput type="text" name="email" maxlength="255" size="30"/td

tdinput type="text" name="Description" maxlength="255" size="50"/td

/tr

tr align="center"

td colspan="3"input type="submit" value="提交"  input type="reset" value="重寫"/td

/tr

/table

/form

?

//先設置兩個環(huán)境變量ORACLE_HOME,ORACLE_SID

putenv("ORACLE_HOME=/oracle/app/oracle/product/8.0.4");

putenv("ORACLE_SID=ora8");

//設置網(wǎng)頁顯示中文

putenv("NLS_LANG=Simplified_Chinese.zhs16cgb231280");

if($connection=ora_logon("scott","tiger")) {

//庫表test有ID,name,Description三項

$sql = 'insert into test(ID,name,Description) values ';

$sql .= '('' . $ID . '','' . $name . '',''. $Description . '')';

if($cursor=ora_do($connect,$sql)) {

print("insert finished!");

}

$query = 'select * from test';

if($cursor=ora_do($connect,$query)) {

ora_fetch($cursor);

$content0=ora_getcolumn($cursor,0);

$content1=ora_getcolumn($cursor,1);

$content2=ora_getcolumn($cursor,2);

print("$content0");

print("$content1");

print("$content2");

ora_close($cursor);

}

ora_logoff($connection);

}

?

/body

/html

通過PHP你可以輕松的連接到數(shù)據(jù)庫,請求數(shù)據(jù)并將其顯示在你的web站點中,甚至修改數(shù)據(jù)庫中的數(shù)據(jù)。 MySQL是一種很流行的數(shù)據(jù)庫,并且在互聯(lián)網(wǎng)中有許多有關PHP與MySQL的教程。MySQL是免費的,這一點也許就吸引了不少人。由于其廣泛應用, 我就不想在這里贅述MySQL的使用方法了。Oracle被大量在企業(yè)應用中采用,因此我們就利用Oracle來介紹PHP與數(shù)據(jù)庫的連接。我們當然不會 提及Oracle數(shù)據(jù)庫的設計原理,原因是這已經(jīng)超出了我們的討論范圍。

PHP提供了兩套函數(shù)與Oracle連接,分別是ORA_和OCI函數(shù)。其中ORA_函數(shù)略顯陳舊。OCI函數(shù)更新?lián)f更好一些。兩者的使用語法幾乎相差無幾。如前所述,你的PHP安裝選項應該可以支持兩者的使用。

想獲得更多有關在Microsoft Windows平臺上安裝支持PHP3的Apache服務器的知識以及更多有關Oracle數(shù)據(jù)庫的知識,請查閱以下URL:。

4.1 連接

if ($conn=Ora_Logon("user@TNSNAME","password"))

{

echo "SUCCESS ! Connected to database\n";

}

else

{

echo "Failed :-( Could not connect to database\n";

}

Ora_Logoff($conn);

phpinfo();

?

以上代碼使用TNSNAME(在你的tnsnames.ora文件中指明)定義的Oracle數(shù)據(jù)庫名稱、用戶名稱和密碼連接數(shù)據(jù)庫。在成功連接的基礎上,ora_logon函數(shù)返回一個非零的連接ID并儲存在變量$conn中。

4.2 查詢

假設與數(shù)據(jù)庫已經(jīng)連接就緒,下面我們就來實際的應用對數(shù)據(jù)庫的查詢。下面的代碼演示了一個連接并查詢的典型例子:

/*

* 連接數(shù)據(jù)庫并執(zhí)行查詢

*/

function printoraerr($in_cur)

{

// 檢查Oracle是否出錯

// 如果存在錯誤則顯示

// 當指針被激活時每次請求Oracle后調(diào)用該函數(shù)

if(ora_errorcode($in_cur))

echo "Oracle code - ".ora_error($in_cur)."\n";

return;

}

/** 主程序 */

if (!($conn=ora_logon("user@TNSNAME","password")))

{

echo "Connection to database failed\n";

exit;

}

echo "Connected as connection - $conn

\n";

echo "Opening cursor ...

\n";

$cursor=ora_open($conn); printoraerr($cursor);

echo "Opened cursor - $cursor

\n";

$qry="select user,sysdate from dual";

echo "Parsing the query $qry ...

\n";

ora_parse($cursor,$qry,0); printoraerr($cursor);

echo "Query parsed

\n";

echo "Executing cursor ...

\n";

ora_exec($cursor); printoraerr($cursor);

echo "Executed cursor

\n";

echo "Fetching cursor ...

\n";

while(ora_fetch($cursor))

{

$user=ora_getcolumn($cursor,0); printoraerr($cursor);

$sysdate=ora_getcolumn($cursor,1); printoraerr($cursor);

echo " row = $user, $sysdate

\n";

}

echo "Fetched all records

\n";

echo "Closing cursor ...

\n";

ora_close($cursor);

echo "Closed cursor

\n";

echo "Logging off from oracle...

\n";

ora_logoff($conn);

echo "Logged off from oracle

\n";

?

(譯者注:以上代碼段缺少注釋,請讀者參考PHP Manual的Oracle數(shù)據(jù)庫函數(shù)部分)

4.3 顯示結(jié)果

以下代碼演示了怎樣查詢數(shù)據(jù)庫并將結(jié)果輸出:

function printoraerr($in_cur, $conn)

{

// 檢查Oracle是否出錯

// 如果存在錯誤則顯示

// 當指針被激活時每次請求Oracle后調(diào)用該函數(shù)

// If it encountered an error, we exit immediately

if(ora_errorcode($in_cur))

{

echo "Oracle code - ".ora_error($in_cur)."

n";

ora_logoff($conn);

exit;

}

return;

}

function exequery($w_qry,$conn)

{

$cursor=ora_open($conn); printoraerr($cursor,$conn);

ora_parse($cursor,$w_qry,0); printoraerr($cursor,$conn);

ora_exec($cursor); printoraerr($cursor,$conn);

$numrows=0;

$w_numcols=ora_numcols($cursor);

// 顯示頭部

echo "

\n";

for ($i=0;$i$w_numcols;$i++)

{

$align=(ora_columntype($cursor,$i)=="NUMBER")?"RIGHT":"LEFT";

echo "\t ".ora_columnname($cursor,$i)." \n";

}

echo "

\n";

while(ora_fetch($cursor))

{

echo " \n";

for ($i=0;$i$w_numcols;$i++)

{

$align=(ora_columntype($cursor,$i)=="NUMBER")?"RIGHT":"LEFT";

if(ora_columntype($cursor,$i)=="LONG")

echo " ".

ora_getcolumn($cursor,$i)."

\n";

else

echo " ".ora_getcolumn($cursor,$i)." \n";

printoraerr($cursor,$conn);

}

$numrows++;

echo "

\n";

}

if ($numrows==0)

echo " Query returned no records

\n";

else

{

echo " \n";

echo " Count \n";

echo " $numrows \n";

echo "

\n";

}

echo " \n";

ora_close($cursor);

return;

}

// 主程序

if(!($conn=ora_logon("user@SID","password")))

{

echo "Error: Cannot connect to database\n";

exit;

}

$qry="SELECT

deptno \"Dept\"

,empno \"Emp\"

,empnm \"Name\"

,salary \"Salary\"

FROM

employee

ORDER BY 1,2";

exequery($qry);

ora_logoff($conn);

?

(譯者注:以上代碼段缺少注釋,請讀者參考PHP Manual的Oracle數(shù)據(jù)庫函數(shù)部分)

4.4 基于HTTP的Oracle登錄

將以下代碼加在PHP頁面代碼之前以確認Oracle登錄。注意你必須正確設定$ SID。

if(!isset($PHP_AUTH_USER))

{

Header("WWW-authenticate: basic realm=\"$SID\"");

Header("HTTP/1.0 401 Unauthorized");

$title="Login Instructions";

echo "

You are not authorized to enter the site

\n";

exit;

}

else

{

if (!($conn=ora_logon("$PHP_AUTH_USER@$SID",$PHP_AUTH_PW)))

{

Header("WWW-authenticate: basic realm=\"$SID\"");

Header("HTTP/1.0 401 Unauthorized");

$title="Login Instructions";

echo "

You are not authorised to enter the site

\n";

exit;

}

}

?

緊急求助,關于PHP中curl的

cURL可以使用URL的語法模擬瀏覽器來傳輸數(shù)據(jù),

因為它是模擬瀏覽器,因此它同樣支持多種協(xié)議,

FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE 以及 LDAP等協(xié)議都可以很好的支持,包括一些:

HTTPS認證,HTTP POST方法,HTTP PUT方法,F(xiàn)TP上傳,keyberos認證,HTTP上傳,代理服務器,cookies,用戶名/密碼認證,

下載文件斷點續(xù)傳,上傳文件斷點續(xù)傳,http代理服務器管道,甚至它還支持IPv6,scoket5代理服務器,通過http代理服務器上傳文件

到FTP服務器等等。

這就是我們?yōu)槭裁匆褂胏URL的原因!

使用cURL完成簡單的請求主要分為以下四步:

1.初始化,創(chuàng)建一個新cURL資源

2.設置URL和相應的選項

3.抓取URL并把它傳遞給瀏覽器

4.關閉cURL資源,并且釋放系統(tǒng)資源

我們來采集一個頁面,通常情況下,我們會使用file_get_contents()函數(shù)來獲取:

像這樣:

?php

$str = file_get_contents('');

//或者是:

$str = file("");

//或者是:

readfile("");

?

這樣我們會發(fā)現(xiàn),我們沒有辦法有效地進行錯誤處理,更重要的是我們沒有辦法完成一些高難度的任務:

如:處理cookies,驗證,表單提交,文件上傳等等。

好,現(xiàn)在我們來用代碼完成上述cURL的四步:

?php

//1.初始化,創(chuàng)建一個新cURL資源

$ch = curl_init();

//2.設置URL和相應的選項

curl_setopt($ch, CURLOPT_URL, "");

curl_setopt($ch, CURLOPT_HEADER, 0);

//3.抓取URL并把它傳遞給瀏覽器

curl_exec($ch);

//4.關閉cURL資源,并且釋放系統(tǒng)資源

curl_close($ch);

?

上述四步中,其中第二步最為關鍵,可以設置一些高級選項:

例如上例中的CURLOPT_URL和CURLOPT_HEADER,分別代表“需要獲取的URL地址”和“啟用時會將頭文件的信息作為數(shù)據(jù)流輸出”,這些只是冰山一角,我們還可以設置很多選項:

選項 可選value值 備注

CURLOPT_AUTOREFERER 當根據(jù)Location:重定向時,自動設置header中的Referer:信息。

CURLOPT_BINARYTRANSFER 在啟用CURLOPT_RETURNTRANSFER的時候,返回原生的(Raw)輸出。

CURLOPT_COOKIESESSION 啟用時curl會僅僅傳遞一個session cookie,忽略其他的cookie,默認狀況下cURL會將所有的cookie返回給服務端。session cookie是指那些用來判斷服務器端的session是否有效而存在的cookie。

CURLOPT_CRLF 啟用時將Unix的換行符轉(zhuǎn)換成回車換行符。

CURLOPT_DNS_USE_GLOBAL_CACHE 啟用時會啟用一個全局的DNS緩存,此項為線程安全的,并且默認啟用。

CURLOPT_FAILONERROR 顯示HTTP狀態(tài)碼,默認行為是忽略編號小于等于400的HTTP信息。

CURLOPT_FILETIME 啟用時會嘗試修改遠程文檔中的信息。結(jié)果信息會通過curl_getinfo()函數(shù)的CURLINFO_FILETIME選項返回。 curl_getinfo().

CURLOPT_FOLLOWLOCATION 啟用時會將服務器服務器返回的"Location: "放在header中遞歸的返回給服務器,使用CURLOPT_MAXREDIRS可以限定遞歸返回的數(shù)量。

CURLOPT_FORBID_REUSE 在完成交互以后強迫斷開連接,不能重用。

CURLOPT_FRESH_CONNECT 強制獲取一個新的連接,替代緩存中的連接。

CURLOPT_FTP_USE_EPRT 啟用時當FTP下載時,使用EPRT (或 LPRT)命令。設置為FALSE時禁用EPRT和LPRT,使用PORT命令 only.

CURLOPT_FTP_USE_EPSV 啟用時,在FTP傳輸過程中回復到PASV模式前首先嘗試EPSV命令。設置為FALSE時禁用EPSV命令。

CURLOPT_FTPAPPEND 啟用時追加寫入文件而不是覆蓋它。

CURLOPT_FTPASCII CURLOPT_TRANSFERTEXT的別名。

CURLOPT_FTPLISTONLY 啟用時只列出FTP目錄的名字。

CURLOPT_HEADER 啟用時會將頭文件的信息作為數(shù)據(jù)流輸出。

CURLINFO_HEADER_OUT 啟用時追蹤句柄的請求字符串。 從 PHP 5.1.3 開始可用。CURLINFO_前綴是故意的(intentional)。

CURLOPT_HTTPGET 啟用時會設置HTTP的method為GET,因為GET是默認是,所以只在被修改的情況下使用。

CURLOPT_HTTPPROXYTUNNEL 啟用時會通過HTTP代理來傳輸。

CURLOPT_MUTE 啟用時將cURL函數(shù)中所有修改過的參數(shù)恢復默認值。

CURLOPT_NETRC 在連接建立以后,訪問~/.netrc文件獲取用戶名和密碼信息連接遠程站點。

CURLOPT_NOBODY 啟用時將不對HTML中的BODY部分進行輸出。

CURLOPT_NOPROGRESS

啟用時關閉curl傳輸?shù)倪M度條,此項的默認設置為啟用。

Note:

PHP自動地設置這個選項為TRUE,這個選項僅僅應當在以調(diào)試為目的時被改變。

CURLOPT_NOSIGNAL 啟用時忽略所有的curl傳遞給php進行的信號。在SAPI多線程傳輸時此項被默認啟用。 cURL 7.10時被加入。

CURLOPT_POST 啟用時會發(fā)送一個常規(guī)的POST請求,類型為:application/x-www-form-urlencoded,就像表單提交的一樣。

CURLOPT_PUT 啟用時允許HTTP發(fā)送文件,必須同時設置CURLOPT_INFILE和CURLOPT_INFILESIZE。

CURLOPT_RETURNTRANSFER 將curl_exec()獲取的信息以文件流的形式返回,而不是直接輸出。

CURLOPT_SSL_VERIFYPEER 禁用后cURL將終止從服務端進行驗證。使用CURLOPT_CAINFO選項設置證書使用CURLOPT_CAPATH選項設置證書目錄 如果CURLOPT_SSL_VERIFYPEER(默認值為2)被啟用,CURLOPT_SSL_VERIFYHOST需要被設置成TRUE否則設置為FALSE。 自cURL 7.10開始默認為TRUE。從cURL 7.10開始默認綁定安裝。

CURLOPT_TRANSFERTEXT 啟用后對FTP傳輸使用ASCII模式。對于LDAP,它檢索純文本信息而非HTML。在Windows系統(tǒng)上,系統(tǒng)不會把STDOUT設置成binary模式。

CURLOPT_UNRESTRICTED_AUTH 在使用CURLOPT_FOLLOWLOCATION產(chǎn)生的header中的多個locations中持續(xù)追加用戶名和密碼信息,即使域名已發(fā)生改變。

CURLOPT_UPLOAD 啟用后允許文件上傳。

CURLOPT_VERBOSE 啟用時會匯報所有的信息,存放在STDERR或指定的CURLOPT_STDERR中。

對于下面的這些option的可選參數(shù),value應該被設置一個integer類型的值:

選項 可選value值 備注

CURLOPT_BUFFERSIZE 每次獲取的數(shù)據(jù)中讀入緩存的大小,但是不保證這個值每次都會被填滿。 在cURL 7.10中被加入。

CURLOPT_CLOSEPOLICY 不是CURLCLOSEPOLICY_LEAST_RECENTLY_USED就是CURLCLOSEPOLICY_OLDEST,還存在另外三個CURLCLOSEPOLICY_,但是cURL暫時還不支持。

CURLOPT_CONNECTTIMEOUT 在發(fā)起連接前等待的時間,如果設置為0,則無限等待。

CURLOPT_CONNECTTIMEOUT_MS 嘗試連接等待的時間,以毫秒為單位。如果設置為0,則無限等待。 在cURL 7.16.2中被加入。從PHP 5.2.3開始可用。

CURLOPT_DNS_CACHE_TIMEOUT 設置在內(nèi)存中保存DNS信息的時間,默認為120秒。

CURLOPT_FTPSSLAUTH FTP驗證方式:CURLFTPAUTH_SSL (首先嘗試SSL),CURLFTPAUTH_TLS (首先嘗試TLS)或CURLFTPAUTH_DEFAULT (讓cURL自動決定)。 在cURL 7.12.2中被加入。

CURLOPT_HTTP_VERSION CURL_HTTP_VERSION_NONE (默認值,讓cURL自己判斷使用哪個版本),CURL_HTTP_VERSION_1_0 (強制使用 HTTP/1.0)或CURL_HTTP_VERSION_1_1 (強制使用 HTTP/1.1)。

CURLOPT_HTTPAUTH

使用的HTTP驗證方法,可選的值有:CURLAUTH_BASIC、CURLAUTH_DIGEST、CURLAUTH_GSSNEGOTIATE、CURLAUTH_NTLM、CURLAUTH_ANY和CURLAUTH_ANYSAFE。 可以使用|位域(或)操作符分隔多個值,cURL讓服務器選擇一個支持最好的值。

CURLAUTH_ANY等價于CURLAUTH_BASIC | CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM. CURLAUTH_ANYSAFE等價于CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM.

CURLOPT_INFILESIZE 設定上傳文件的大小限制,字節(jié)(byte)為單位。

CURLOPT_LOW_SPEED_LIMIT 當傳輸速度小于CURLOPT_LOW_SPEED_LIMIT時(bytes/sec),PHP會根據(jù)CURLOPT_LOW_SPEED_TIME來判斷是否因太慢而取消傳輸。

CURLOPT_LOW_SPEED_TIME 當傳輸速度小于CURLOPT_LOW_SPEED_LIMIT時(bytes/sec),PHP會根據(jù)CURLOPT_LOW_SPEED_TIME來判斷是否因太慢而取消傳輸。

CURLOPT_MAXCONNECTS 允許的最大連接數(shù)量,超過是會通過CURLOPT_CLOSEPOLICY決定應該停止哪些連接。

CURLOPT_MAXREDIRS 指定最多的HTTP重定向的數(shù)量,這個選項是和CURLOPT_FOLLOWLOCATION一起使用的。

CURLOPT_PORT 用來指定連接端口。(可選項)

CURLOPT_PROTOCOLS

CURLPROTO_*的位域指。如果被啟用,位域值會限定libcurl在傳輸過程中有哪些可使用的協(xié)議。這將允許你在編譯libcurl時支持眾多協(xié)議,但是限制只是用它們中被允許使用的一個子集。默認libcurl將會使用全部它支持的協(xié)議。參見CURLOPT_REDIR_PROTOCOLS. 可用的協(xié)議選項為:CURLPROTO_HTTP、CURLPROTO_HTTPS、CURLPROTO_FTP、CURLPROTO_FTPS、CURLPROTO_SCP、CURLPROTO_SFTP、CURLPROTO_TELNET、CURLPROTO_LDAP、CURLPROTO_LDAPS、CURLPROTO_DICT、CURLPROTO_FILE、CURLPROTO_TFTP、CURLPROTO_ALL 在cURL 7.19.4中被加入。

CURLOPT_PROXYAUTH HTTP代理連接的驗證方式。使用在CURLOPT_HTTPAUTH中的位域標志來設置相應選項。對于代理驗證只有CURLAUTH_BASIC和CURLAUTH_NTLM當前被支持。 在cURL 7.10.7中被加入。

CURLOPT_PROXYPORT 代理服務器的端口。端口也可以在CURLOPT_PROXY中進行設置。

CURLOPT_PROXYTYPE 不是CURLPROXY_HTTP (默認值) 就是CURLPROXY_SOCKS5。 在cURL 7.10中被加入。

CURLOPT_REDIR_PROTOCOLS CURLPROTO_*中的位域值。如果被啟用,位域值將會限制傳輸線程在CURLOPT_FOLLOWLOCATION開啟時跟隨某個重定向時可使用的協(xié)議。這將使你對重定向時限制傳輸線程使用被允許的協(xié)議子集默認libcurl將會允許除FILE和SCP之外的全部協(xié)議。這個和7.19.4預發(fā)布版本種無條件地跟隨所有支持的協(xié)議有一些不同。關于協(xié)議常量,請參照CURLOPT_PROTOCOLS。 在cURL 7.19.4中被加入。

CURLOPT_RESUME_FROM 在恢復傳輸時傳遞一個字節(jié)偏移量(用來斷點續(xù)傳)。

CURLOPT_SSL_VERIFYHOST 1 檢查服務器SSL證書中是否存在一個公用名(common name)。譯者注:公用名(Common Name)一般來講就是填寫你將要申請SSL證書的域名 (domain)或子域名(sub domain)。2 檢查公用名是否存在,并且是否與提供的主機名匹配。

CURLOPT_SSLVERSION 使用的SSL版本(2 或 3)。默認情況下PHP會自己檢測這個值,盡管有些情況下需要手動地進行設置。

CURLOPT_TIMECONDITION 如果在CURLOPT_TIMEVALUE指定的某個時間以后被編輯過,則使用CURL_TIMECOND_IFMODSINCE返回頁面,如果沒有被修改過,并且CURLOPT_HEADER為true,則返回一個"304 Not Modified"的header, CURLOPT_HEADER為false,則使用CURL_TIMECOND_IFUNMODSINCE,默認值為CURL_TIMECOND_IFUNMODSINCE。

CURLOPT_TIMEOUT 設置cURL允許執(zhí)行的最長秒數(shù)。

CURLOPT_TIMEOUT_MS 設置cURL允許執(zhí)行的最長毫秒數(shù)。 在cURL 7.16.2中被加入。從PHP 5.2.3起可使用。

CURLOPT_TIMEVALUE 設置一個CURLOPT_TIMECONDITION使用的時間戳,在默認狀態(tài)下使用的是CURL_TIMECOND_IFMODSINCE。

對于下面的這些option的可選參數(shù),value應該被設置一個string類型的值:

選項 可選value值 備注

CURLOPT_CAINFO 一個保存著1個或多個用來讓服務端驗證的證書的文件名。這個參數(shù)僅僅在和CURLOPT_SSL_VERIFYPEER一起使用時才有意義。 .

CURLOPT_CAPATH 一個保存著多個CA證書的目錄。這個選項是和CURLOPT_SSL_VERIFYPEER一起使用的。

CURLOPT_COOKIE 設定HTTP請求中"Cookie: "部分的內(nèi)容。多個cookie用分號分隔,分號后帶一個空格(例如, "fruit=apple; colour=red")。

CURLOPT_COOKIEFILE 包含cookie數(shù)據(jù)的文件名,cookie文件的格式可以是Netscape格式,或者只是純的HTTP頭部信息存入文件。

CURLOPT_COOKIEJAR 連接結(jié)束后保存cookie信息的文件。

CURLOPT_CUSTOMREQUEST

使用一個自定義的請求信息來代替"GET"或"HEAD"作為HTTP請求。這對于執(zhí)行"DELETE" 或者其他更隱蔽的HTTP請求。有效值如"GET","POST","CONNECT"等等。也就是說,不要在這里輸入整個HTTP請求。例如輸入"GET /index.html HTTP/1.0 "是不正確的。

Note: 在確定服務器支持這個自定義請求的方法前不要使用。

CURLOPT_EGDSOCKET 類似CURLOPT_RANDOM_FILE,除了一個Entropy Gathering Daemon套接字。

CURLOPT_ENCODING HTTP請求頭中"Accept-Encoding: "的值。支持的編碼有"identity","deflate"和"gzip"。如果為空字符串"",請求頭會發(fā)送所有支持的編碼類型。 在cURL 7.10中被加入。

CURLOPT_FTPPORT 這個值將被用來獲取供FTP"POST"指令所需要的IP地址。"POST"指令告訴遠程服務器連接到我們指定的IP地址。這個字符串可以是純文本的IP地址、主機名、一個網(wǎng)絡接口名(UNIX下)或者只是一個'-'來使用默認的IP地址。

CURLOPT_INTERFACE 網(wǎng)絡發(fā)送接口名,可以是一個接口名、IP地址或者是一個主機名。

CURLOPT_KRB4LEVEL KRB4 (Kerberos 4) 安全級別。下面的任何值都是有效的(從低到高的順序):"clear"、"safe"、"confidential"、"private".。如果字符串和這些都不匹配,將使用"private"。這個選項設置為NULL時將禁用KRB4 安全認證。目前KRB4 安全認證只能用于FTP傳輸。

CURLOPT_POSTFIELDS 全部數(shù)據(jù)使用HTTP協(xié)議中的"POST"操作來發(fā)送。要發(fā)送文件,在文件名前面加上@前綴并使用完整路徑。這個參數(shù)可以通過urlencoded后的字符串類似'para1=val1para2=val2...'或使用一個以字段名為鍵值,字段數(shù)據(jù)為值的數(shù)組。如果value是一個數(shù)組,Content-Type頭將會被設置成multipart/form-data。

CURLOPT_PROXY HTTP代理通道。

CURLOPT_PROXYUSERPWD 一個用來連接到代理的"[username]:[password]"格式的字符串。

CURLOPT_RANDOM_FILE 一個被用來生成SSL隨機數(shù)種子的文件名。

CURLOPT_RANGE 以"X-Y"的形式,其中X和Y都是可選項獲取數(shù)據(jù)的范圍,以字節(jié)計。HTTP傳輸線程也支持幾個這樣的重復項中間用逗號分隔如"X-Y,N-M"。

CURLOPT_REFERER 在HTTP請求頭中"Referer: "的內(nèi)容。

CURLOPT_SSL_CIPHER_LIST 一個SSL的加密算法列表。例如RC4-SHA和TLSv1都是可用的加密列表。

CURLOPT_SSLCERT 一個包含PEM格式證書的文件名。

CURLOPT_SSLCERTPASSWD 使用CURLOPT_SSLCERT證書需要的密碼。

CURLOPT_SSLCERTTYPE 證書的類型。支持的格式有"PEM" (默認值), "DER"和"ENG"。 在cURL 7.9.3中被加入。

CURLOPT_SSLENGINE 用來在CURLOPT_SSLKEY中指定的SSL私鑰的加密引擎變量。

CURLOPT_SSLENGINE_DEFAULT 用來做非對稱加密操作的變量。

CURLOPT_SSLKEY 包含SSL私鑰的文件名。

CURLOPT_SSLKEYPASSWD

在CURLOPT_SSLKEY中指定了的SSL私鑰的密碼。

Note: 由于這個選項包含了敏感的密碼信息,記得保證這個PHP腳本的安全。

CURLOPT_SSLKEYTYPE CURLOPT_SSLKEY中規(guī)定的私鑰的加密類型,支持的密鑰類型為"PEM"(默認值)、"DER"和"ENG"。

CURLOPT_URL 需要獲取的URL地址,也可以在curl_init()函數(shù)中設置。

CURLOPT_USERAGENT 在HTTP請求中包含一個"User-Agent: "頭的字符串。

CURLOPT_USERPWD 傳遞一個連接中需要的用戶名和密碼,格式為:"[username]:[password]"。

對于下面的這些option的可選參數(shù),value應該被設置一個數(shù)組:

對于下面的這些option的可選參數(shù),value應該被設置一個流資源 (例如使用fopen()):

對于下面的這些option的可選參數(shù),value應該被設置為一個回調(diào)函數(shù)名:

選項 可選value值

CURLOPT_HEADERFUNCTION 設置一個回調(diào)函數(shù),這個函數(shù)有兩個參數(shù),第一個是cURL的資源句柄,第二個是輸出的header數(shù)據(jù)。header數(shù)據(jù)的輸出必須依賴這個函數(shù),返回已寫入的數(shù)據(jù)大小。

CURLOPT_PASSWDFUNCTION 設置一個回調(diào)函數(shù),有三個參數(shù),第一個是cURL的資源句柄,第二個是一個密碼提示符,第三個參數(shù)是密碼長度允許的最大值。返回密碼的值。

CURLOPT_PROGRESSFUNCTION 設置一個回調(diào)函數(shù),有三個參數(shù),第一個是cURL的資源句柄,第二個是一個文件描述符資源,第三個是長度。返回包含的數(shù)據(jù)。

CURLOPT_READFUNCTION 擁有兩個參數(shù)的回調(diào)函數(shù),第一個是參數(shù)是會話句柄,第二是HTTP響應頭信息的字符串。使用此函數(shù),將自行處理返回的數(shù)據(jù)。返回值為數(shù)據(jù)大小,以字節(jié)計。返回0代表EOF信號。

CURLOPT_WRITEFUNCTION 擁有兩個參數(shù)的回調(diào)函數(shù),第一個是參數(shù)是會話句柄,第二是HTTP響應頭信息的字符串。使用此回調(diào)函數(shù),將自行處理響應頭信息。響應頭信息是整個字符串。設置返回值為精確的已寫入字符串長度。發(fā)生錯誤時傳輸線程終止。

看到了吧,只要在第二個函數(shù)之內(nèi)設置這些選項就可以完成相應的功能,cURL的功能是灰常強大滴,大家可以嘗試一下哦!

例如,我們只想把獲取到的內(nèi)容輸入到文件,而不是直接輸出給瀏覽器,我們就可以使用CURLOPT_RETURNTRANSFER選項!

這樣在curl執(zhí)行的時候,就會把頁面的內(nèi)容輸出到文件當中,我們就可以完成采集等功能

PHP如何解壓zip數(shù)據(jù)流

用把ZIP流轉(zhuǎn)換成byte類型,之后用PHP的ZIP解壓方法讀取。或者讓服務器端別用ZIP壓縮數(shù)據(jù),就直接傳遞數(shù)據(jù),也沒多少時間

PHP應用中常用的9大緩存技術?

一、全頁面靜態(tài)化緩存

也就是將頁面全部生成html靜態(tài)頁面,用戶訪問時直接訪問的靜態(tài)頁面,而不會去走php服務器解析的流程。此種方式,在CMS系統(tǒng)中比較常見,比如dedecms;

一種比較常用的實現(xiàn)方式是用輸出緩存:

Ob_start()******要運行的代碼*******$content=Ob_get_contents();****將緩存內(nèi)容寫入html文件*****Ob_end_clean();

二、數(shù)據(jù)緩存

顧名思義,就是緩存數(shù)據(jù)的一種方式;比如,商城中的某個商品信息,當用商品id去請求時,就會得出包括店鋪信息、商品信息等數(shù)據(jù),此時就可以將這些數(shù)據(jù)緩存到一個php文件中,文件名包含商品id來建一個唯一標示;下一次有人想查看這個商品時,首先就直接調(diào)這個文件里面的信息,而不用再去數(shù)據(jù)庫查詢;其實緩存文件中緩存的就是一個php數(shù)組之類;

Ecmall商城系統(tǒng)里面就用了這種方式;

三、查詢緩存

其實這跟數(shù)據(jù)緩存是一個思路,就是根據(jù)查詢語句來緩存;將查詢得到的數(shù)據(jù)緩存在一個文件中,下次遇到相同的查詢時,就直接先從這個文件里面調(diào)數(shù)據(jù),不會再去查數(shù)據(jù)庫;但此處的緩存文件名可能就需要以查詢語句為基點來建立唯一標示;

按時間變更進行緩存

就是對于緩存文件您需要設一個有效時間,在這個有效時間內(nèi),相同的訪問才會先取緩存文件的內(nèi)容,但是超過設定的緩存時間,就需要重新從數(shù)據(jù)庫中獲取數(shù)據(jù),并生產(chǎn)最新的緩存文件;比如,我將我們商城的首頁就是設置2個小時更新一次。

四、頁面部分緩存

該種方式,是將一個頁面中不經(jīng)常變的部分進行靜態(tài)緩存,而經(jīng)常變化的塊不緩存,最后組裝在一起顯示;可以使用類似于ob_get_contents的方式實現(xiàn),也可以利用類似ESI之類的頁面片段緩存策略,使其用來做動態(tài)頁面中相對靜態(tài)的片段部分的緩存。

該種方式可以用于如商城中的商品頁;

五、Opcode緩存

首先php代碼被解析為Tokens,然后再編譯為Opcode碼,最后執(zhí)行Opcode碼,返回結(jié)果;所以,對于相同的php文件,第一次運行時可以緩存其Opcode碼,下次再執(zhí)行這個頁面時,直接會去找到緩存下的opcode碼,直接執(zhí)行最后一步,而不再需要中間的步驟了。

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

六、按內(nèi)容變更進行緩存

這個也并非獨立的緩存技術,需結(jié)合著用;就是當數(shù)據(jù)庫內(nèi)容被修改時,即刻更新緩存文件;

比如,一個人流量很大的商城,商品很多,商品表必然比較大,這表的壓力也比較重;我們就可以對商品顯示頁進行頁面緩存;

當商家在后臺修改這個商品的信息時,點擊保存,我們同時就更新緩存文件;那么,買家訪問這個商品信息時,實際問的是一個靜態(tài)頁面,而不需要再去訪問數(shù)據(jù)庫;

試想,如果對商品頁不緩存,那么每次訪問一個商品就要去數(shù)據(jù)庫查一次,如果有10萬人在線瀏覽商品,那服務器壓力就大了;

七、內(nèi)存式緩存

提到這個,可能大家想到的首先就是Memcached;memcached是高性能的分布式內(nèi)存緩存服務器。一般的使用目的是,通過緩存數(shù)據(jù)庫查詢結(jié)果,減少數(shù)據(jù)庫訪問次數(shù),以提高動態(tài)Web應用的速度、提高可擴展性。

它就是將需要緩存的信息,緩存到系統(tǒng)內(nèi)存中,需要獲取信息時,直接到內(nèi)存中取;比較常用的方式就是key_value方式;

connect($memcachehost,$memcacheport)ordie("Couldnotconnect");$memcache-set('key','緩存的內(nèi)容');$get=$memcache-get($key);//獲取信息?

八、apache緩存模塊

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

用php如何把圖像數(shù)據(jù)流保存

imagegif(resource $image [, string $filename ]) 從 image 圖像以 filename 為文件名創(chuàng)建一個 GIF 圖像。image 參數(shù)是 imagecreate() 或 imagecreatefrom* 函數(shù)的返回值。

imagejpeg(resource $image [, string $filename ]) 從 image 圖像以 filename 為文件名創(chuàng)建一個 JPEG 圖像。

imagepng(resource $image [, string $filename ]) 將 GD 圖像流(image)以 PNG 格式輸出到標準輸出(通常為瀏覽器),或者如果用 filename 給出了文件名則將其輸出到該文件。

filename 文件保存的路徑,如果未設置或為 NULL,將會直接輸出原始圖象流。

這幾個函數(shù)你參考一下,希望對你有幫助。

當前題目:php釋放數(shù)據(jù)流,php返回文件流
文章分享:http://chinadenli.net/article21/dsidpjd.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)外貿(mào)建站搜索引擎優(yōu)化Google用戶體驗ChatGPT

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站