利用PHP V5開發(fā)多任務(wù)應(yīng)用程序(6)_PHP教程

      編輯Tag賺U幣
      教程Tag:暫無Tag,歡迎添加,賺取U幣!

      推薦:詳細(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() 這是一種很方便的方法,也是很常用的方法

      共6頁上一頁123456下一頁
      來源:模板無憂//所屬分類:PHP教程/更新時(shí)間:2008-08-22
      相關(guān)PHP教程