PHP中使用協(xié)同程序?qū)崿F(xiàn)合作多任務(wù)(6)_PHP教程
推薦:php修改NetBeans默認(rèn)字體的大小在Netbeans中由于使用了Swing進(jìn)行開(kāi)發(fā),所以其中界面的字體也是由Java虛擬機(jī)進(jìn)行配置而不是隨操作系統(tǒng)的。在安裝完Netbeans后默認(rèn)的字體大小是11px。而在Windows下的宋體最小支持12px。所以字體為11px就已經(jīng)無(wú)法完整顯示了。 簡(jiǎn)單的解決辦法就是將字體改大一點(diǎn)。詳細(xì)的
需要在某個(gè)地方注冊(cè)這個(gè)任務(wù),例如,你可以在run()方法的開(kāi)始增 加$this->newTask($this->ioPollTask())。然后就像其他 任務(wù)一樣每執(zhí)行完整任務(wù)循環(huán)一次就執(zhí)行輪詢操作一次(這么做一定不是最好的方法)。ioPollTask將使用0秒的超時(shí)來(lái)調(diào)用ioPoll, 這意味著stream_select將立即返回(而不是等待)。
只有任務(wù)隊(duì)列為空時(shí),我們才使用null超時(shí),這意味著它一直等到某個(gè)套接口準(zhǔn)備就緒。如果我們沒(méi)有這么做,那么輪詢?nèi)蝿?wù)將一而再, 再而三的循環(huán)運(yùn)行,直到有新的連接建立。這將導(dǎo)致100%的CPU利用率。相反,讓操作系統(tǒng)做這種等待會(huì)更有效。
現(xiàn)在編寫(xiě)服務(wù)器相對(duì)容易了:
<?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上的連接,然后僅僅返回發(fā)送來(lái)的內(nèi)容作為HTTP響應(yīng)。要做“實(shí)際”的事情的話就愛(ài)哪個(gè)非常復(fù)雜(處理 HTTP請(qǐng)求可能已經(jīng)超出了這篇文章的范圍)。上面的代碼片段只是演示了一般性的概念。
你 可以使用類似于ab -n 10000 -c 100 localhost:8000/這樣命令來(lái)測(cè)試服務(wù)器。這條命令將向服務(wù)器發(fā)送10000個(gè)請(qǐng)求,并且其中100個(gè)請(qǐng)求將同時(shí)到達(dá)。使用這樣的數(shù)目,我得 到了處于中間的10毫秒的響應(yīng)時(shí)間。不過(guò)還有一個(gè)問(wèn)題:有少數(shù)幾個(gè)請(qǐng)求真正處理的很慢(如5秒), 這就是為什么總吞吐量只有2000請(qǐng)求/秒(如果是10毫秒的響應(yīng)時(shí)間的話,總的吞吐量應(yīng)該更像是10000請(qǐng)求/秒)。調(diào)高并發(fā)數(shù)(比如 -c 500),服務(wù)器大多數(shù)運(yùn)行良好,不過(guò)某些連接將拋出“連接被對(duì)方重置”的錯(cuò)誤。由于我對(duì)低級(jí)別的socket資料了解的非常少,所以 我不能指出問(wèn)題出在哪兒。
協(xié)程堆棧
如果你試圖用我們的調(diào)度系統(tǒng)建立更大的系統(tǒng)的話,你將很快遇到問(wèn)題:我們習(xí)慣了把代碼分解為更小的函數(shù),然后調(diào)用它們。然而, 如果使用了協(xié)程的話,就不能這么做了。例如,看下面代碼: 復(fù)制代碼 代碼如下:
<?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刪除數(shù)組中特定元素的兩種方法這篇文章介紹了PHP中刪除數(shù)組中特定元素的兩種方法,有需要的朋友可以參考一下 方法一: 復(fù)制代碼 代碼如下: ?php $arr1 = array(1,3, 5,7,8); $key = array_search(3, $arr1); if ($key !== false) array_splice($arr1, $key, 1); var_dump($arr1); ? 輸出: array(4)
- PHPNOW安裝Memcached擴(kuò)展方法詳解
- php記錄頁(yè)面代碼執(zhí)行時(shí)間
- PHP中獎(jiǎng)概率的抽獎(jiǎng)算法程序代碼
- apache設(shè)置靜態(tài)文件緩存方法介紹
- php對(duì)圖像的各種處理函數(shù)代碼小結(jié)
- PHP 關(guān)于訪問(wèn)控制的和運(yùn)算符優(yōu)先級(jí)介紹
- 關(guān)于PHP語(yǔ)言構(gòu)造器介紹
- php/js獲取客戶端mac地址的實(shí)現(xiàn)代碼
- php5.5新數(shù)組函數(shù)array_column使用
- PHP preg_match的匹配多國(guó)語(yǔ)言的技巧
- php 中序列化和json使用介紹
- php采集文章中的圖片獲取替換到本地
PHP教程Rss訂閱編程教程搜索
PHP教程推薦
- PHP CLI模式下的多進(jìn)程應(yīng)用分析
- 如何用PHP和mysql創(chuàng)建一個(gè)ShoutBox
- 《PHP設(shè)計(jì)模式介紹》第十一章 代理模式
- 解讀PHP開(kāi)發(fā)人員應(yīng)熟悉的五個(gè)概念
- PHP應(yīng)用:PHP在linxu下的安裝與配置
- 用 PHP 使 Web 數(shù)據(jù)分析進(jìn)入更高境界
- 解讀Windows環(huán)境PHP的session為何不能正常使用
- php簡(jiǎn)單縮略圖類|image.class.php
- Windows2003+IIS7 Express使用FastCgi運(yùn)行php
- PHP應(yīng)用程序加速探索之簡(jiǎn)介
- 相關(guān)鏈接:
- 教程說(shuō)明:
PHP教程-PHP中使用協(xié)同程序?qū)崿F(xiàn)合作多任務(wù)(6)
。