<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

PHP中的生成器

汽車電子技術 ? 來源:程序猿零壹 ? 作者:程序猿零壹 ? 2023-01-20 10:44 ? 次閱讀
你好, 我是程序猿零壹。******

******今天要給大家帶來php中yield的用法。對于yield,我相信大部分的人依舊是不會用,甚至不知道什么是yield。那么今天這篇文章就是來告訴大家有關于yield的一些用法,以及如何用yield來解決我們在php中遇到的問題。希望對大家有所幫助。******

******不知道大家有沒有碰到過這樣的問題,使用excel導入大量數據的時候會失敗,并且提示以下錯誤信息:******

Fatal Error: Allowed memory size of xxxxxx bytes

******這個是因為在php程序中,是將變量存儲在內存中。當從excel中要導入的數據量過大的時候,會出現內存不足的錯誤提示。

要解決這個問題,可以通過修改php中對于最大運行內存的設置:

ini_set('memory_limit', '200M');

但是這么做不能從根本上解決問題,當我們需要讀取5g甚至更大文件的時候,我們的運行內存可能就吃不消了。

幸好,在php5.5之后提新增了生成器(Generators)特性,用于簡化實現迭代器接口(iterator)創建簡單的迭代器的復雜性。通過生成器,我們可以輕松的使用 foreach 迭代一系列的數據,而不需要事先在內存中構建要被迭代的對象,大大減少了內存的開銷。

這樣說可能比較抽象,不易于理解。所以我們先拋開有關于生成器的概念,先來看一個簡單的例子。

$arr = range(1,100)

這里用到了range函數,它的作用是在內存中生成一個數組包含每個在指定范圍內的值,并返回該數組。

如果我們自己來實現這樣一個數組,應該怎么做呢?我們來看下面的代碼:

function xrange($start,$end,$step=1){  
  $data = [];  
  for($i=$start;$i<$end,$i += $step) {    
    $data[] = $i;  
  }  
  return $data;
}
$start = memory_get_usage();
$data = xrange(1,1000);
foreach ($data as $value) {    
  echo $value.PHP_EOL;
}
$end = memory_get_usage();
echo "start:".$start.PHP_EOL;
echo "end:".$end.PHP_EOL;
echo "used:".($end - $start);

我們來看下start為1,end 分別為 10,100,1000,10000的情況下的內存消耗情況分別是怎么樣的:

xrange(1,10); // used = 3480 0.0033187866210938MB
xrange(1,100); // used = 30168 0.028770446777344MB
xrange(1,1000); // used = 285144 0.27193450927734MB
xrange(1,10000); // used = 2957784 2.8207626342773MB

不難看出,隨著$end的增大,所占用的內存也越來越大。

接下來我們來改造下xrange函數:

function xrange($start,$end,$step=1){  
  for($i=$start;$i<$end,$i += $step) {    
    yield $i;  
  }
}

我們刪除了數組data,并且也刪除了返回值,而在foreach的循環體里,在i前面添加關鍵字:yield。****

我們來看下改造之后的內存消耗:

xrange(1,10); // used = 256 0.000244140625MB
xrange(1,100); // used = 256 0.000244140625MB
xrange(1,1000); // used = 256 0.000244140625MB
xrange(1,10000); // used = 256 0.000244140625MB

Wow,這個結果令人驚訝。我們奇跡的發現了,內存消耗并沒有隨著$end的增大而增大,甚至是完全一樣。

我們來還原一下代碼的執行過程:

******首先調用xrange函數,傳參$end=10,但是for循環了一次然后停止了,并且告訴foreach第一次循環可以用的值。


  1. ******foreach開始對$data循環,并使用for給的一個值執行輸出。******
    
  2. ******foreach開始第二次循環,它向for循環又請求了一次******
    
  3. ******for循環又執行了一次,并將新的值告訴foreach
    

  4. ******foreach拿到第二個值,開始輸出。
    

******所以,整個代碼執行中,始終只有一個記錄值參與循環,內存中也只有一條信息。


無論開始傳入按的$end有多大,由于不會立即生成所有結果集,所以內存始終是一條循環的值,也就不會占用太大的內存了。

******看到這里,你是不是想說,“就這?”。生成器的用處當然不止這一些,還有其他的用武之地,比如協程。只不過因為本人才疏學淺,只能跟大家分享這么多了。大家感興趣的話,可以看下鳥哥關于在php中使用協程實現多任務調度的文章。

好了,今天就到這里,如果大家覺得有用的話,不要忘記點贊收藏哦~

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 程序
    +關注

    關注

    114

    文章

    3631

    瀏覽量

    79582
  • 生成器
    +關注

    關注

    7

    文章

    302

    瀏覽量

    20257
  • PHP
    PHP
    +關注

    關注

    0

    文章

    452

    瀏覽量

    26466
收藏 人收藏

    評論

    相關推薦

    不同雷達目標生成器的架構及目標生成器的設計要求和準則

    雷達目標生成器的性能和能力以及它們測試雷達系統的可用性是關鍵,這主要取決于幾個技術參數。本文介紹不同雷達目標生成器的架構,闡明適合雷達系統性能測試的目標生成器的設計要求和準則,同時給出測量結果舉例。
    發表于 03-29 11:40 ?1544次閱讀

    Minitab 交互式表格生成器

    生成器
    MinitabUG
    發布于 :2024年04月03日 15:58:54

    應用程序生成器

    我在生成應用程序的時候,右鍵點擊程序生成規范,點擊新建,只有源代碼發布和web兩項,沒有應用程序,安裝程序以及DLL和ZIP等,是因為我沒有應用程序生成器的問題嗎?那去哪可以整一個免費的LabVIEW2009 應用程序
    發表于 09-04 09:19

    如何去使用生成器

    生成器的工作原理是什么?如何去使用生成器呢?
    發表于 10-25 08:44

    python生成器

    了在大量數據下內存消耗過猛的問題。當你在 Python Shell 敲入一個生成器對象,會直接輸出 generator object 提示你這是一個生成器對象>>> gen
    發表于 02-24 15:56

    pim卡資料生成器

    pim卡資料生成器
    發表于 11-22 23:23 ?6次下載

    漢語句子聯想生成器

    在一定的語言環境中漢語詞語之間存在著優先組合搭配關系,據此,在本文中利用互信息、數理統計和人腦聯想記憶的相關理論,設計了一個漢語句子聯想生成器,使用該生成器
    發表于 09-26 14:25 ?20次下載

    展頻時脈生成器

    展頻時脈生成器展頻時脈的技術是頻率調變( FM )的一種應用,相反地,頻率調變通常會伴隨生成展頻的效果。展頻時脈最基本的想法,是稍微地調變時脈訊號的頻率,造成時脈訊
    發表于 02-26 11:05 ?23次下載

    自制酸奶生成器

    自制酸奶生成器
    發表于 04-23 11:48 ?880次閱讀
    自制酸奶<b class='flag-5'>生成器</b>

    LED段碼生成器

    本文提供的LED段碼生成器,希望對你的學習有所幫助!
    發表于 06-03 15:19 ?96次下載

    代碼生成器的應用

    jeesite框架代碼生成器,可以很方便的生成代碼,挺不錯的。
    發表于 01-14 15:19 ?0次下載

    AN-113:精密坡道生成器

    AN-113:精密坡道生成器
    發表于 05-16 12:04 ?6次下載
    AN-113:精密坡道<b class='flag-5'>生成器</b>

    python生成器是什么

    python生成器 1. 什么是生成器? 生成器(英文名 Generator ),是一個可以像迭代器那樣使用for循環來獲取元素的函數。 生成器的出現(Python 2.2 +),實現
    的頭像 發表于 02-24 15:53 ?3098次閱讀

    Arduino贊美生成器

    電子發燒友網站提供《Arduino贊美生成器.zip》資料免費下載
    發表于 11-09 14:22 ?1次下載
    Arduino贊美<b class='flag-5'>生成器</b>

    通用RFID生成器

    通用RFID生成器資料分享
    發表于 02-10 15:35 ?1次下載
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>