利用PHP V5開發(fā)多任務(wù)應(yīng)用程序(6)_PHP教程
推薦:詳細(xì)解析 PHP 向 MySQL 發(fā)送數(shù)據(jù)過程下面的一段代碼是一個(gè)很簡(jiǎn)單的 HTML 表單: <html> <body> <formaction=submitform.php3method=GET> 姓:<inputtype=textname=fir
大多數(shù) PHP 頁面已經(jīng)足夠快 —— 更好的性能會(huì)是一種優(yōu)勢(shì),但是還不值得對(duì)新代碼進(jìn)行投入。
在 Web 頁面中使用 PHP 可以放棄部分無關(guān)緊要的性能提升 —— 當(dāng)惟一的價(jià)值標(biāo)準(zhǔn)是交付整個(gè) Web 頁面需要的時(shí)間時(shí),那么重新安排計(jì)算以更快地獲得中間結(jié)果并不重要。
PHP 不能控制本地瓶頸 —— 用戶可能會(huì)為花 8 秒的時(shí)間提取帳戶記錄的詳細(xì)信息而抱怨,但是那很可能是數(shù)據(jù)庫處理或某種其他 PHP 外部資源的約束。即使將 PHP 處理降至零,單是查找就仍需要花費(fèi)超過 7 秒的時(shí)間。
甚至很少有約束是并行的 —— 假定某特定頁面將為具體列出的普通股計(jì)算建議交易價(jià)格,并且計(jì)算十分復(fù)雜,需要花費(fèi)一段時(shí)間。計(jì)算在本質(zhì)上可能是順序執(zhí)行的。沒有一種明顯的方法可以將其劃分為 “團(tuán)隊(duì)協(xié)作”。
很少有 PHP 程序員能夠認(rèn)識(shí)到 PHP 實(shí)現(xiàn)并發(fā)的潛力。在具有使用并行實(shí)現(xiàn)性能需求的少數(shù)人當(dāng)中,我遇到的大多數(shù)人全都說 PHP “不支持線程”,并且甘于使用現(xiàn)有的計(jì)算模型。
可是,有時(shí)我們可以做得更好。假定 PHP 頁面需要計(jì)算兩只股票價(jià)格,可能還需要將兩者相比較,并且底層主機(jī)剛好是多處理器。在這種情況下,通過將兩個(gè)截然不同并且十分耗時(shí)的計(jì)算分配給不同處理器,可能會(huì)提高幾乎兩倍的性能。
在所有 PHP 計(jì)算領(lǐng)域中,此類實(shí)例很少見。但是,由于我發(fā)現(xiàn)到處都沒有對(duì)它的精確記錄,因此需要在這里包括用于此類加速的模型。
清單 5. 延遲服務(wù)器實(shí)現(xiàn)
<?php echo "Program starts at ". date('h:i:s') . ". "; $timeout=10; $streams=array(); $handles=array(); /* First launch a program with a delay of three seconds, then one which returns after only one second. */ $delay=3; for ($id=0; $id <= 1; $id ) { $error_log="/tmp/error" . $id . ".txt" $descriptorspec=array( 0 => array("pipe", "r"), 1 => array("pipe", "w"), 2 => array("file", $error_log, "w") ); $cmd='sleep ' . $delay . '; echo "Finished with delay of ' . $delay . '".'; $handles[$id]=proc_open($cmd, $descriptorspec, $pipes); $streams[$id]=$pipes[1]; $all_pipes[$id]=$pipes; $delay -= 2; } while (count($streams)) { $read=$streams; stream_select($read, $w=null, $e=null, $timeout); foreach ($read as $r) { $id=array_search($r, $strea**ms); echo stream_get_contents($all_pipes[$id][1]); if (feof($r)) { fclose($all_pipes[$id][0]); fclose($all_pipes[$id][1]); $return_value=proc_close($handles[$id]); unset($streams[$id]); } } } ?> |
此程序?qū)⑸扇缦螺敵觯?/p>
Program starts at 10:28:41. Finished with delay of 1. Finished with delay of 3. |
這里的關(guān)鍵在于 PHP 啟動(dòng)了兩個(gè)獨(dú)立子進(jìn)程,取回待完成的第一個(gè)進(jìn)程的輸出,然后取回第二個(gè)進(jìn)程的輸出,即使后者啟動(dòng)得較早。如果主機(jī)是多處理器計(jì)算機(jī),并且操作系統(tǒng)已正確配置,則操作系統(tǒng)本身負(fù)責(zé)將各個(gè)子程序分配給不同的處理器。這是在多處理器主機(jī)中良好應(yīng)用 PHP 的一種方法。
PHP 支持多任務(wù)。PHP 不按照諸如 Java 編程語言或 C 等其他語言所采用的方法支持線程,但是以上示例表明 PHP 具有更多的超乎想象的加速潛力。
分享:PHP實(shí)現(xiàn)靜態(tài)發(fā)布的方法淺談如今很多網(wǎng)站都是靜態(tài)發(fā)布的,PHP當(dāng)然也可以方便的實(shí)現(xiàn)靜態(tài)發(fā)布嘍,具體的實(shí)現(xiàn)方法很多,下面我就說說我會(huì)的兩種方法。 方法一:ob_get_contents() 這是一種很方便的方法,也是很常用的方法
- PHPNOW安裝Memcached擴(kuò)展方法詳解
- php記錄頁面代碼執(zhí)行時(shí)間
- PHP中獎(jiǎng)概率的抽獎(jiǎng)算法程序代碼
- apache設(shè)置靜態(tài)文件緩存方法介紹
- php對(duì)圖像的各種處理函數(shù)代碼小結(jié)
- PHP 關(guān)于訪問控制的和運(yùn)算符優(yōu)先級(jí)介紹
- 關(guān)于PHP語言構(gòu)造器介紹
- php/js獲取客戶端mac地址的實(shí)現(xiàn)代碼
- php5.5新數(shù)組函數(shù)array_column使用
- PHP preg_match的匹配多國語言的技巧
- php 中序列化和json使用介紹
- php采集文章中的圖片獲取替換到本地
- 相關(guān)鏈接:
- 教程說明:
PHP教程-利用PHP V5開發(fā)多任務(wù)應(yīng)用程序(6)。