PHP中使用協(xié)同程序?qū)崿F(xiàn)合作多任務(wù)_PHP教程
推薦:php修改NetBeans默認(rèn)字體的大小在Netbeans中由于使用了Swing進(jìn)行開發(fā),所以其中界面的字體也是由Java虛擬機(jī)進(jìn)行配置而不是隨操作系統(tǒng)的。在安裝完Netbeans后默認(rèn)的字體大小是11px。而在Windows下的宋體最小支持12px。所以字體為11px就已經(jīng)無法完整顯示了。 簡單的解決辦法就是將字體改大一點(diǎn)。詳細(xì)的
PHP5.5一個比較好的新功能是實現(xiàn)對生成器和協(xié)同程序的支持。對于生成器,PHP的文檔和各種其他的博客文章(就像這一個或這一個)已經(jīng)有了非常詳細(xì)的講解。協(xié)同程序相對受到的關(guān)注就少了,所以協(xié)同程序雖然有很強(qiáng)大的功能但也很難被知曉,解釋起來也比較困難。
這篇文章指導(dǎo)你通過使用協(xié)同程序來實施任務(wù)調(diào)度,通過實例實現(xiàn)對技術(shù)的理解。我將在前三節(jié)做一個簡單的背景介紹。如果你已經(jīng)有了比較好的基礎(chǔ),可以直接跳到“協(xié)同多任務(wù)處理”一節(jié)。
生成器
生成器最基本的思想也是一個函數(shù),這個函數(shù)的返回值是依次輸出,而不是只返回一個單獨(dú)的值。或者,換句話說,生成器使你更方便的實現(xiàn)了迭代器接口。下面通過實現(xiàn)一個xrange函數(shù)來簡單說明:
復(fù)制代碼 代碼如下:<?php
function xrange($start, $end, $step = 1) {
for ($i = $start; $i <= $end; $i += $step) {
yield $i;
}
}
foreach (xrange(1, 1000000) as $num) {
echo $num, "\n";
}
上面這個xrange()函數(shù)提供了和PHP的內(nèi)建函數(shù)range()一樣的功能。但是不同的是range()函數(shù)返回的是一個包含屬組值從1到 100萬的數(shù)組(注:請查看手冊)。而xrange()函數(shù)返回的是依次輸出這些值的一個迭代器,而且并不會真正以數(shù)組形式計算。
這種方法的優(yōu)點(diǎn)是顯而易見的。它可以讓你在處理大數(shù)據(jù)集合的時候不用一次性的加載到內(nèi)存中。甚至你可以處理無限大的數(shù)據(jù)流。
當(dāng)然,也可以不同通過生成器來實現(xiàn)這個功能,而是可以通過繼承Iterator接口實現(xiàn)。通過使用生成器實現(xiàn)起來會更方便,而不用再去實現(xiàn)iterator接口中的5個方法了。
生成器為可中斷的函數(shù)
要從生成器認(rèn)識協(xié)同程序,理解它們內(nèi)部是如何工作的非常重要:生成器是可中斷的函數(shù),在它里面,yield構(gòu)成了中斷點(diǎn)。
緊接著上面的例子,如果你調(diào)用xrange(1,1000000)的話,xrange()函數(shù)里代碼沒有真正地運(yùn)行。相反,PHP只是返回了一個實現(xiàn)了迭代器接口的 生成器類實例:
<?php
$range = xrange(1, 1000000);
var_dump($range); // object(Generator)#1
var_dump($range instanceof Iterator); // bool(true)
你對某個對象調(diào)用迭代器方法一次,其中的代碼運(yùn)行一次。例如,如果你調(diào)用$range->rewind(),那么xrange()里的代碼運(yùn) 行到控制流 第一次出現(xiàn)yield的地方。在這種情況下,這就意味著當(dāng)$i=$start時yield $i才運(yùn)行。傳遞給yield語句的值是使用$range->current()獲取的。
為了繼續(xù)執(zhí)行生成器中的代碼,你必須 調(diào)用$range->next()方法。這將再次啟動生成器,直到y(tǒng)ield語句出現(xiàn)。因此,連續(xù)調(diào)用next()和current()方法 你將能從生成器里獲得所有的值,直到某個點(diǎn)沒有再出現(xiàn)yield語句。對xrange()來說,這種情形出現(xiàn)在$i超過$end時。在這中情況下, 控制流將到達(dá)函數(shù)的終點(diǎn),因此將不執(zhí)行任何代碼。一旦這種情況發(fā)生,vaild()方法將返回假,這時迭代結(jié)束。
協(xié)程
協(xié)程給上面功能添加的主要東西是回送數(shù)據(jù)給生成器的能力。這將把生成器到調(diào)用者的單向通信轉(zhuǎn)變?yōu)閮烧咧g的雙向通信。
通過調(diào)用生成器的send()方法而不是其next()方法傳遞數(shù)據(jù)給協(xié)程。下面的logger()協(xié)程是這種通信如何運(yùn)行的例子:
<?php
function logger($fileName) {
$fileHandle = fopen($fileName, 'a');
while (true) {
fwrite($fileHandle, yield . "\n");
}
}
$logger = logger(__DIR__ . '/log');
$logger->send('Foo');
$logger->send('Bar')
正如你能看到,這兒yield沒有作為一個語句來使用,而是用作一個表達(dá)式。即它有一個返回值。yield的返回值是傳遞給send()方法的值。 在這個例子里,yield將首先返回"Foo",然后返回"Bar"。
上面的例子里yield僅作為接收者。混合兩種用法是可能的,即既可接收也可發(fā)送。接收和發(fā)送通信如何進(jìn)行的例子如下:
復(fù)制代碼 代碼如下:<?php
function gen() {
$ret = (yield 'yield1');
var_dump($ret);
$ret = (yield 'yield2');
var_dump($ret);
}
$gen = gen();
var_dump($gen->current()); // string(6) "yield1"
var_dump($gen->send('ret1')); // string(4) "ret1" (the first var_dump in gen)
// string(6) "yield2" (the var_dump of the ->send() return value)
var_dump($gen->send('ret2')); // string(4) "ret2" (again from within gen)
// NULL (the return value of ->send())
馬上理解輸出的精確順序有點(diǎn)困難,因此確定你知道為什按照這種方式輸出。我愿意特別指出的有兩點(diǎn):第一點(diǎn),yield表達(dá)式兩邊使用 圓括號不是偶然。由于技術(shù)原因(雖然我已經(jīng)考慮為賦值增加一個異常,就像Python那樣),圓括號是必須的。第二點(diǎn),你可能已經(jīng)注意到 調(diào)用current()之前沒有調(diào)用rewind()。如果是這么做的,那么已經(jīng)隱含地執(zhí)行了rewind操作。
多任務(wù)協(xié)作
分享: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記錄頁面代碼執(zhí)行時間
- PHP中獎概率的抽獎算法程序代碼
- apache設(shè)置靜態(tài)文件緩存方法介紹
- php對圖像的各種處理函數(shù)代碼小結(jié)
- PHP 關(guān)于訪問控制的和運(yùn)算符優(yōu)先級介紹
- 關(guān)于PHP語言構(gòu)造器介紹
- php/js獲取客戶端mac地址的實現(xiàn)代碼
- php5.5新數(shù)組函數(shù)array_column使用
- PHP preg_match的匹配多國語言的技巧
- php 中序列化和json使用介紹
- php采集文章中的圖片獲取替換到本地
PHP教程Rss訂閱編程教程搜索
PHP教程推薦
- PHP CLI模式下的多進(jìn)程應(yīng)用分析
- 如何用PHP和mysql創(chuàng)建一個ShoutBox
- 《PHP設(shè)計模式介紹》第十一章 代理模式
- 解讀PHP開發(fā)人員應(yīng)熟悉的五個概念
- PHP應(yīng)用:PHP在linxu下的安裝與配置
- 用 PHP 使 Web 數(shù)據(jù)分析進(jìn)入更高境界
- 解讀Windows環(huán)境PHP的session為何不能正常使用
- php簡單縮略圖類|image.class.php
- Windows2003+IIS7 Express使用FastCgi運(yùn)行php
- PHP應(yīng)用程序加速探索之簡介
- 相關(guān)鏈接:
- 教程說明:
PHP教程-PHP中使用協(xié)同程序?qū)崿F(xiàn)合作多任務(wù)。