PHP中使用協同程序實現合作多任務第1/2頁(6)_PHP教程

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

      推薦:PHP中使用協同程序實現合作多任務
      PHP5.5一個比較好的新功能是實現對生成器和協同程序的支持。對于生成器,PHP的文檔和各種其他的博客文章(就像這一個或這一個)已經有了非常詳細的講解。協同程序相對受到的關注就少了,所以協同程序雖然有很強大的功能但也很難被知曉,解釋起來也比較困難。 這篇文章

      需要在某個地方注冊這個任務,例如,你可以在run()方法的開始增 加$this->newTask($this->ioPollTask())。然后就像其他 任務一樣每執行完整任務循環一次就執行輪詢操作一次(這么做一定不是最好的方法)。ioPollTask將使用0秒的超時來調用ioPoll, 這意味著stream_select將立即返回(而不是等待)。 
      只有任務隊列為空時,我們才使用null超時,這意味著它一直等到某個套接口準備就緒。如果我們沒有這么做,那么輪詢任務將一而再, 再而三的循環運行,直到有新的連接建立。這將導致100%的CPU利用率。相反,讓操作系統做這種等待會更有效。

      現在編寫服務器相對容易了:

      復制代碼 代碼如下:
       <?php 

       function server($port) { 
           echo "Starting server at port $port...\n"; 

           $socket = @stream_socket_server("tcp://localhost:$port", $errNo, $errStr); 
           if (!$socket) throw new Exception($errStr, $errNo); 

           stream_set_blocking($socket, 0); 

           while (true) { 
               yield waitForRead($socket); 
               $clientSocket = stream_socket_accept($socket, 0); 
               yield newTask(handleClient($clientSocket)); 
           } 
       } 

       function handleClient($socket) { 
           yield waitForRead($socket); 
           $data = fread($socket, 8192); 

           $msg = "Received following request:\n\n$data"; 
           $msgLength = strlen($msg); 

           $response = <<<RES 
       HTTP/1.1 200 OK\r 
       Content-Type: text/plain\r 
       Content-Length: $msgLength\r 
       Connection: close\r 
       \r 
       $msg
       RES; 

           yield waitForWrite($socket); 
           fwrite($socket, $response); 

           fclose($socket); 
       } 

       $scheduler = new Scheduler; 
       $scheduler->newTask(server(8000)); 
       $scheduler->run();
       
      這段代碼將接收到localhost:8000上的連接,然后僅僅返回發送來的內容作為HTTP響應。要做“實際”的事情的話就愛哪個非常復雜(處理 HTTP請求可能已經超出了這篇文章的范圍)。上面的代碼片段只是演示了一般性的概念。

      你 可以使用類似于ab -n 10000 -c 100 localhost:8000/這樣命令來測試服務器。這條命令將向服務器發送10000個請求,并且其中100個請求將同時到達。使用這樣的數目,我得 到了處于中間的10毫秒的響應時間。不過還有一個問題:有少數幾個請求真正處理的很慢(如5秒), 這就是為什么總吞吐量只有2000請求/秒(如果是10毫秒的響應時間的話,總的吞吐量應該更像是10000請求/秒)。調高并發數(比如 -c 500),服務器大多數運行良好,不過某些連接將拋出“連接被對方重置”的錯誤。由于我對低級別的socket資料了解的非常少,所以 我不能指出問題出在哪兒。

      協程堆棧
      如果你試圖用我們的調度系統建立更大的系統的話,你將很快遇到問題:我們習慣了把代碼分解為更小的函數,然后調用它們。然而, 如果使用了協程的話,就不能這么做了。例如,看下面代碼: 復制代碼 代碼如下:
       <?php 

       function echoTimes($msg, $max) { 
           for ($i = 1; $i <= $max; ++$i) { 
               echo "$msg iteration $i\n"; 
               yield; 
           } 
       } 

       function task() { 
           echoTimes('foo', 10); // print foo ten times 
           echo "---\n"; 
           echoTimes('bar', 5); // print bar five times 
           yield; // force it to be a coroutine 
       } 

       $scheduler = new Scheduler; 
       $scheduler->newTask(task()); 
       $scheduler->run();
       

      分享:php修改NetBeans默認字體的大小
      在Netbeans中由于使用了Swing進行開發,所以其中界面的字體也是由Java虛擬機進行配置而不是隨操作系統的。在安裝完Netbeans后默認的字體大小是11px。而在Windows下的宋體最小支持12px。所以字體為11px就已經無法完整顯示了。 簡單的解決辦法就是將字體改大一點。詳細的

      來源:模板無憂//所屬分類:PHP教程/更新時間:2013-07-04
      相關PHP教程