真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

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

php運(yùn)行機(jī)制是什么

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

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

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

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

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

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

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

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

關(guān)于PHP數(shù)據(jù)庫(kù)

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

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

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

注意,MySQL訪問(wèn)函數(shù)都需要有相應(yīng)的權(quán)限才能運(yùn)行。常用的相關(guān)函數(shù)介紹如下:

(1)integer mysql_connect(主機(jī),用戶(hù)名,口令);

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

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

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

創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)。注意必須用一個(gè)帶有創(chuàng)建數(shù)據(jù)庫(kù)許可權(quán)的帳號(hào)打開(kāi)連接。

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

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

(4)integer mysql_query(SQL語(yǔ)句,連接號(hào));

對(duì)指定數(shù)據(jù)庫(kù)進(jìn)行查詢(xún)。如果SQL語(yǔ)句是select,則返回一個(gè)結(jié)果號(hào),否則返回的值可以不理會(huì)。如果失敗,返回false.。

(5)array mysql_fetch_array(結(jié)果號(hào));

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

(6)mysql_fetch_row(結(jié)果號(hào));

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

(7)integer mysql_num_rows(結(jié)果號(hào));

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

(8)integer mysql_num_fields(結(jié)果號(hào));

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

(9)integer mysql_list_dbs();

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

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

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

(11)mysql_close(連接號(hào));

關(guān)閉對(duì)數(shù)據(jù)庫(kù)的連接。連接必須是由mysql_connect打開(kāi)的。該函數(shù)的使用不是嚴(yán)格必需的,因?yàn)樵谀_本結(jié)束時(shí),所有非永久鏈路都會(huì)被自動(dòng)關(guān)閉。

(12)mysql_pconnect(主機(jī),用戶(hù)名,口令);

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

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

?

$pagesize = 5; //每頁(yè)顯示5條記錄

$host="localhost";

$user="user";

$password="psw";

$dbname="book"; //所查詢(xún)的庫(kù)表名;

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

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

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

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

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

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

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

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

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

if(!isset($pageno)) {

$pageno = 1; //在沒(méi)有設(shè)置pageno時(shí),缺省為顯示第1頁(yè)

}

if($pageno1) {

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

}

if($pageno$pagecount) {

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

}

if($pageno0) {

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

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

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

}

else{

echo "上一頁(yè)";

}

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){//顯示下一頁(yè)的褳接

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

}

else{

echo "下一頁(yè) ";

}

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

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

$rst = mysql_query($sql);//查詢(xún)本頁(yè)數(shù)據(jù)

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

$i = 0;

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

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

$i++;

}

echo "table border="1" cellspacing="0" cellpadding="0"";//開(kāi)始輸出表格

echo "tr";

reset($fields);

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

echo "th$field_name/th";

}

echo "/tr";

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

echo "tr";

reset($fields);

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

$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("無(wú)法釋放result資源!");//釋放result資源

}

else{

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

}

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

?

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

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

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

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

在一個(gè)連接上執(zhí)行查詢(xún)。

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

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

(4)boolean odbc_close(integer connection)

關(guān)閉一個(gè)數(shù)據(jù)庫(kù)的連接。若在該連接上有打開(kāi)的事務(wù),則返回一個(gè)錯(cuò)誤,而且連接不會(huì)被關(guān)閉。

最后,還是看個(gè)分頁(yè)的例子:

?

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

$show_num = 10;

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

//定義連接

$dsn = "localhost";

$user = "sa";

$password = "";

//計(jì)算總記錄數(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變量

}

//計(jì)算與頁(yè)有關(guān)的條數(shù)

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

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

$cnnnn = $nnn - $hnnn;

//計(jì)算所需總頁(yè)數(shù)

switch ($cnnn){

case "0":

$hnnn++;

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

break;

default :

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

break;

};

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

//計(jì)算頁(yè)面改變所需的條件

$fore = $pages;

$next = $pages;

$fore -= 1;

$next += 1;

if ($fore 0) {

echo "a首頁(yè)/a";

echo "a前頁(yè)/a";

};

if ($pages $nnn) {

echo "a后頁(yè)/a";

echo "a尾頁(yè)/a";

};

echo "共".$nnn."頁(yè)";

$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;//計(jì)算當(dāng)前的記錄游標(biāo)的位置

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

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){//在不滿頁(yè)數(shù)時(shí)跳出程序

break;

};

$i++;

};

//關(guān)閉連接

odbc_close($conn_id);

?

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

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

開(kāi)始對(duì)一個(gè)Oracle數(shù)據(jù)庫(kù)服務(wù)器的連接。

(2)integer ora_open(integer connection)

打開(kāi)給出的連接的游標(biāo)。

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

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

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

解析一個(gè)查詢(xún)并準(zhǔn)備好執(zhí)行。

(5)boolean ora_exec(integer cursor)

執(zhí)行一個(gè)先前由ora_parse函數(shù)解析過(guò)的查詢(xún)。

(6)boolean ora_fetch(integer cursor)

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

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

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

(8)boolean ora_logoff(integer connection)

斷開(kāi)對(duì)數(shù)據(jù)庫(kù)服務(wù)器的鏈接。

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

html

headtitle向ORACLE數(shù)據(jù)庫(kù)中插入數(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="重寫(xiě)"/td

/tr

/table

/form

?

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

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

putenv("ORACLE_SID=ora8");

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

putenv("NLS_LANG=Simplified_Chinese.zhs16cgb231280");

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

//庫(kù)表test有ID,name,Description三項(xiàng)

$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

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

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

想獲得更多有關(guān)在Microsoft Windows平臺(tái)上安裝支持PHP3的Apache服務(wù)器的知識(shí)以及更多有關(guān)Oracle數(shù)據(jù)庫(kù)的知識(shí),請(qǐng)查閱以下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ù)庫(kù)名稱(chēng)、用戶(hù)名稱(chēng)和密碼連接數(shù)據(jù)庫(kù)。在成功連接的基礎(chǔ)上,ora_logon函數(shù)返回一個(gè)非零的連接ID并儲(chǔ)存在變量$conn中。

4.2 查詢(xún)

假設(shè)與數(shù)據(jù)庫(kù)已經(jīng)連接就緒,下面我們就來(lái)實(shí)際的應(yīng)用對(duì)數(shù)據(jù)庫(kù)的查詢(xún)。下面的代碼演示了一個(gè)連接并查詢(xún)的典型例子:

/*

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

*/

function printoraerr($in_cur)

{

// 檢查Oracle是否出錯(cuò)

// 如果存在錯(cuò)誤則顯示

// 當(dāng)指針被激活時(shí)每次請(qǐng)求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";

?

(譯者注:以上代碼段缺少注釋?zhuān)?qǐng)讀者參考PHP Manual的Oracle數(shù)據(jù)庫(kù)函數(shù)部分)

4.3 顯示結(jié)果

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

function printoraerr($in_cur, $conn)

{

// 檢查Oracle是否出錯(cuò)

// 如果存在錯(cuò)誤則顯示

// 當(dāng)指針被激活時(shí)每次請(qǐng)求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);

?

(譯者注:以上代碼段缺少注釋?zhuān)?qǐng)讀者參考PHP Manual的Oracle數(shù)據(jù)庫(kù)函數(shù)部分)

4.4 基于HTTP的Oracle登錄

將以下代碼加在PHP頁(yè)面代碼之前以確認(rèn)Oracle登錄。注意你必須正確設(shè)定$ 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;

}

}

?

緊急求助,關(guān)于PHP中curl的

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

因?yàn)樗悄M瀏覽器,因此它同樣支持多種協(xié)議,

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

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

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

到FTP服務(wù)器等等。

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

使用cURL完成簡(jiǎn)單的請(qǐng)求主要分為以下四步:

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

2.設(shè)置URL和相應(yīng)的選項(xiàng)

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

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

我們來(lái)采集一個(gè)頁(yè)面,通常情況下,我們會(huì)使用file_get_contents()函數(shù)來(lái)獲?。?/p>

像這樣:

?php

$str = file_get_contents('');

//或者是:

$str = file("");

//或者是:

readfile("");

?

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

如:處理cookies,驗(yàn)證,表單提交,文件上傳等等。

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

?php

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

$ch = curl_init();

//2.設(shè)置URL和相應(yīng)的選項(xiàng)

curl_setopt($ch, CURLOPT_URL, "");

curl_setopt($ch, CURLOPT_HEADER, 0);

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

curl_exec($ch);

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

curl_close($ch);

?

上述四步中,其中第二步最為關(guān)鍵,可以設(shè)置一些高級(jí)選項(xiàng):

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

選項(xiàng) 可選value值 備注

CURLOPT_AUTOREFERER 當(dāng)根據(jù)Location:重定向時(shí),自動(dòng)設(shè)置header中的Referer:信息。

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

CURLOPT_COOKIESESSION 啟用時(shí)curl會(huì)僅僅傳遞一個(gè)session cookie,忽略其他的cookie,默認(rèn)狀況下cURL會(huì)將所有的cookie返回給服務(wù)端。session cookie是指那些用來(lái)判斷服務(wù)器端的session是否有效而存在的cookie。

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

CURLOPT_DNS_USE_GLOBAL_CACHE 啟用時(shí)會(huì)啟用一個(gè)全局的DNS緩存,此項(xiàng)為線程安全的,并且默認(rèn)啟用。

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

CURLOPT_FILETIME 啟用時(shí)會(huì)嘗試修改遠(yuǎn)程文檔中的信息。結(jié)果信息會(huì)通過(guò)curl_getinfo()函數(shù)的CURLINFO_FILETIME選項(xiàng)返回。 curl_getinfo().

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

CURLOPT_FORBID_REUSE 在完成交互以后強(qiáng)迫斷開(kāi)連接,不能重用。

CURLOPT_FRESH_CONNECT 強(qiáng)制獲取一個(gè)新的連接,替代緩存中的連接。

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

CURLOPT_FTP_USE_EPSV 啟用時(shí),在FTP傳輸過(guò)程中回復(fù)到PASV模式前首先嘗試EPSV命令。設(shè)置為FALSE時(shí)禁用EPSV命令。

CURLOPT_FTPAPPEND 啟用時(shí)追加寫(xiě)入文件而不是覆蓋它。

CURLOPT_FTPASCII CURLOPT_TRANSFERTEXT的別名。

CURLOPT_FTPLISTONLY 啟用時(shí)只列出FTP目錄的名字。

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

CURLINFO_HEADER_OUT 啟用時(shí)追蹤句柄的請(qǐng)求字符串。 從 PHP 5.1.3 開(kāi)始可用。CURLINFO_前綴是故意的(intentional)。

CURLOPT_HTTPGET 啟用時(shí)會(huì)設(shè)置HTTP的method為GET,因?yàn)镚ET是默認(rèn)是,所以只在被修改的情況下使用。

CURLOPT_HTTPPROXYTUNNEL 啟用時(shí)會(huì)通過(guò)HTTP代理來(lái)傳輸。

CURLOPT_MUTE 啟用時(shí)將cURL函數(shù)中所有修改過(guò)的參數(shù)恢復(fù)默認(rèn)值。

CURLOPT_NETRC 在連接建立以后,訪問(wèn)~/.netrc文件獲取用戶(hù)名和密碼信息連接遠(yuǎn)程站點(diǎn)。

CURLOPT_NOBODY 啟用時(shí)將不對(duì)HTML中的BODY部分進(jìn)行輸出。

CURLOPT_NOPROGRESS

啟用時(shí)關(guān)閉curl傳輸?shù)倪M(jìn)度條,此項(xiàng)的默認(rèn)設(shè)置為啟用。

Note:

PHP自動(dòng)地設(shè)置這個(gè)選項(xiàng)為T(mén)RUE,這個(gè)選項(xiàng)僅僅應(yīng)當(dāng)在以調(diào)試為目的時(shí)被改變。

CURLOPT_NOSIGNAL 啟用時(shí)忽略所有的curl傳遞給php進(jìn)行的信號(hào)。在SAPI多線程傳輸時(shí)此項(xiàng)被默認(rèn)啟用。 cURL 7.10時(shí)被加入。

CURLOPT_POST 啟用時(shí)會(huì)發(fā)送一個(gè)常規(guī)的POST請(qǐng)求,類(lèi)型為:application/x-www-form-urlencoded,就像表單提交的一樣。

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

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

CURLOPT_SSL_VERIFYPEER 禁用后cURL將終止從服務(wù)端進(jìn)行驗(yàn)證。使用CURLOPT_CAINFO選項(xiàng)設(shè)置證書(shū)使用CURLOPT_CAPATH選項(xiàng)設(shè)置證書(shū)目錄 如果CURLOPT_SSL_VERIFYPEER(默認(rèn)值為2)被啟用,CURLOPT_SSL_VERIFYHOST需要被設(shè)置成TRUE否則設(shè)置為FALSE。 自cURL 7.10開(kāi)始默認(rèn)為T(mén)RUE。從cURL 7.10開(kāi)始默認(rèn)綁定安裝。

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

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

CURLOPT_UPLOAD 啟用后允許文件上傳。

CURLOPT_VERBOSE 啟用時(shí)會(huì)匯報(bào)所有的信息,存放在STDERR或指定的CURLOPT_STDERR中。

對(duì)于下面的這些option的可選參數(shù),value應(yīng)該被設(shè)置一個(gè)integer類(lèi)型的值:

選項(xiàng) 可選value值 備注

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

CURLOPT_CLOSEPOLICY 不是CURLCLOSEPOLICY_LEAST_RECENTLY_USED就是CURLCLOSEPOLICY_OLDEST,還存在另外三個(gè)CURLCLOSEPOLICY_,但是cURL暫時(shí)還不支持。

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

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

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

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

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

CURLOPT_HTTPAUTH

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

CURLAUTH_ANY等價(jià)于CURLAUTH_BASIC | CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM. CURLAUTH_ANYSAFE等價(jià)于CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM.

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

CURLOPT_LOW_SPEED_LIMIT 當(dāng)傳輸速度小于CURLOPT_LOW_SPEED_LIMIT時(shí)(bytes/sec),PHP會(huì)根據(jù)CURLOPT_LOW_SPEED_TIME來(lái)判斷是否因太慢而取消傳輸。

CURLOPT_LOW_SPEED_TIME 當(dāng)傳輸速度小于CURLOPT_LOW_SPEED_LIMIT時(shí)(bytes/sec),PHP會(huì)根據(jù)CURLOPT_LOW_SPEED_TIME來(lái)判斷是否因太慢而取消傳輸。

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

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

CURLOPT_PORT 用來(lái)指定連接端口。(可選項(xiàng))

CURLOPT_PROTOCOLS

CURLPROTO_*的位域指。如果被啟用,位域值會(huì)限定libcurl在傳輸過(guò)程中有哪些可使用的協(xié)議。這將允許你在編譯libcurl時(shí)支持眾多協(xié)議,但是限制只是用它們中被允許使用的一個(gè)子集。默認(rèn)libcurl將會(huì)使用全部它支持的協(xié)議。參見(jiàn)CURLOPT_REDIR_PROTOCOLS. 可用的協(xié)議選項(xiàng)為: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代理連接的驗(yàn)證方式。使用在CURLOPT_HTTPAUTH中的位域標(biāo)志來(lái)設(shè)置相應(yīng)選項(xiàng)。對(duì)于代理驗(yàn)證只有CURLAUTH_BASIC和CURLAUTH_NTLM當(dāng)前被支持。 在cURL 7.10.7中被加入。

CURLOPT_PROXYPORT 代理服務(wù)器的端口。端口也可以在CURLOPT_PROXY中進(jìn)行設(shè)置。

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

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

CURLOPT_RESUME_FROM 在恢復(fù)傳輸時(shí)傳遞一個(gè)字節(jié)偏移量(用來(lái)斷點(diǎn)續(xù)傳)。

CURLOPT_SSL_VERIFYHOST 1 檢查服務(wù)器SSL證書(shū)中是否存在一個(gè)公用名(common name)。譯者注:公用名(Common Name)一般來(lái)講就是填寫(xiě)你將要申請(qǐng)SSL證書(shū)的域名 (domain)或子域名(sub domain)。2 檢查公用名是否存在,并且是否與提供的主機(jī)名匹配。

CURLOPT_SSLVERSION 使用的SSL版本(2 或 3)。默認(rèn)情況下PHP會(huì)自己檢測(cè)這個(gè)值,盡管有些情況下需要手動(dòng)地進(jìn)行設(shè)置。

CURLOPT_TIMECONDITION 如果在CURLOPT_TIMEVALUE指定的某個(gè)時(shí)間以后被編輯過(guò),則使用CURL_TIMECOND_IFMODSINCE返回頁(yè)面,如果沒(méi)有被修改過(guò),并且CURLOPT_HEADER為true,則返回一個(gè)"304 Not Modified"的header, CURLOPT_HEADER為false,則使用CURL_TIMECOND_IFUNMODSINCE,默認(rèn)值為CURL_TIMECOND_IFUNMODSINCE。

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

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

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

對(duì)于下面的這些option的可選參數(shù),value應(yīng)該被設(shè)置一個(gè)string類(lèi)型的值:

選項(xiàng) 可選value值 備注

CURLOPT_CAINFO 一個(gè)保存著1個(gè)或多個(gè)用來(lái)讓服務(wù)端驗(yàn)證的證書(shū)的文件名。這個(gè)參數(shù)僅僅在和CURLOPT_SSL_VERIFYPEER一起使用時(shí)才有意義。 .

CURLOPT_CAPATH 一個(gè)保存著多個(gè)CA證書(shū)的目錄。這個(gè)選項(xiàng)是和CURLOPT_SSL_VERIFYPEER一起使用的。

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

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

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

CURLOPT_CUSTOMREQUEST

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

Note: 在確定服務(wù)器支持這個(gè)自定義請(qǐng)求的方法前不要使用。

CURLOPT_EGDSOCKET 類(lèi)似CURLOPT_RANDOM_FILE,除了一個(gè)Entropy Gathering Daemon套接字。

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

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

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

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

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

CURLOPT_PROXY HTTP代理通道。

CURLOPT_PROXYUSERPWD 一個(gè)用來(lái)連接到代理的"[username]:[password]"格式的字符串。

CURLOPT_RANDOM_FILE 一個(gè)被用來(lái)生成SSL隨機(jī)數(shù)種子的文件名。

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

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

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

CURLOPT_SSLCERT 一個(gè)包含PEM格式證書(shū)的文件名。

CURLOPT_SSLCERTPASSWD 使用CURLOPT_SSLCERT證書(shū)需要的密碼。

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

CURLOPT_SSLENGINE 用來(lái)在CURLOPT_SSLKEY中指定的SSL私鑰的加密引擎變量。

CURLOPT_SSLENGINE_DEFAULT 用來(lái)做非對(duì)稱(chēng)加密操作的變量。

CURLOPT_SSLKEY 包含SSL私鑰的文件名。

CURLOPT_SSLKEYPASSWD

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

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

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

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

CURLOPT_USERAGENT 在HTTP請(qǐng)求中包含一個(gè)"User-Agent: "頭的字符串。

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

對(duì)于下面的這些option的可選參數(shù),value應(yīng)該被設(shè)置一個(gè)數(shù)組:

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

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

選項(xiàng) 可選value值

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

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

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

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

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

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

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

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

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

用把ZIP流轉(zhuǎn)換成byte類(lèi)型,之后用PHP的ZIP解壓方法讀取?;蛘咦尫?wù)器端別用ZIP壓縮數(shù)據(jù),就直接傳遞數(shù)據(jù),也沒(méi)多少時(shí)間

PHP應(yīng)用中常用的9大緩存技術(shù)?

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

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

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

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

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

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

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

三、查詢(xún)緩存

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

按時(shí)間變更進(jìn)行緩存

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

四、頁(yè)面部分緩存

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

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

五、Opcode緩存

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

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

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

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

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

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

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

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

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

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

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

八、apache緩存模塊

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

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

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

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

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

filename 文件保存的路徑,如果未設(shè)置或?yàn)?NULL,將會(huì)直接輸出原始圖象流。

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


本文名稱(chēng):php釋放數(shù)據(jù)流,php返回文件流
文章來(lái)源:http://weahome.cn/article/dsidpjd.html

其他資訊

在線咨詢(xún)

微信咨詢(xún)

電話咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部