在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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中使用協程實現多任務調度的文章。

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

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

    關注

    117

    文章

    3787

    瀏覽量

    81038
  • 生成器
    +關注

    關注

    7

    文章

    315

    瀏覽量

    21010
  • PHP
    PHP
    +關注

    關注

    0

    文章

    452

    瀏覽量

    26687
收藏 人收藏

    評論

    相關推薦

    如何去使用生成器

    生成器的工作原理是什么?如何去使用生成器呢?
    發表于 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次下載

    自制酸奶生成器

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

    LED段碼生成器

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

    代碼生成器的應用

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

    數碼管代碼生成器

    數碼管代碼生成器,迅速生成數碼管的相應代碼
    發表于 04-25 10:54 ?40次下載

    STM32庫函數代碼自動生成器正式版

    STM32庫函數代碼自動生成器正式版 STM32庫函數代碼自動生成器正式版
    發表于 07-25 18:52 ?0次下載

    AN-113:精密坡道生成器

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

    python生成器是什么

    計算,從而緩解了在大量數據下內存消耗過猛的問題。 當你在 Python Shell 敲入一個生成器對象,會直接輸出 generator object 提示你這是一個生成器對象 gen = (i for i
    的頭像 發表于 02-24 15:53 ?3663次閱讀

    Arduino贊美生成器

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

    通用RFID生成器

    通用RFID生成器資料分享
    發表于 02-10 15:35 ?1次下載

    【虹科】為什么需要網絡流量生成器

    什么是網絡流量生成器,為什么我需要一個?網絡流量生成器是一種將流量饋送到網絡以測試和優化網絡設備、協議和拓撲性能的工具。使用流量生成器,可以選擇要在實驗室測試的特定流量類型。通過控制
    的頭像 發表于 03-11 10:09 ?1103次閱讀
    【虹科】為什么需要網絡流量<b class='flag-5'>生成器</b>?

    TSMaster報文發送的信號生成器操作說明

    信號生成器功能是TSMaster分析的報文發送模塊。信號生成器用于發送和配置每個CAN/LIN信號的值變化行為,簡而言之,這是一個可以控制和調整CAN/LIN信號值的功能。我們可選擇的信號
    的頭像 發表于 12-23 08:21 ?1012次閱讀
    TSMaster報文發送的信號<b class='flag-5'>生成器</b>操作說明
    主站蜘蛛池模板: videosex久久麻豆 | 日本大片成人免费播放 | 一级美女视频 | 国产一区二区高清在线 | 91久久婷婷国产综合精品青草 | 边摸边吃奶边做视频叫床韩剧 | 免播放器av少妇影院 | 国产秦先生大战白丝97在线 | 一区二区三区电影 | 亚洲天堂手机在线 | 天堂中文在线观看 | 亚洲免费网站在线观看 | 亚洲国产精品综合久久久 | 欧美在线天堂 | 亚洲人成网站色7777 | 天天干天天射天天插 | 成年网站在线观看 | 免费视频网站在线看视频 | 成人精品亚洲人成在线 | 丁香5月婷婷 | 天天干夜啪 | 岛国毛片一级一级特级毛片 | 国产三级国产精品 | 久久国产午夜精品理论篇小说 | 久久久久无码国产精品一区 | 日本三级全黄 | 一卡二卡四卡无卡乱免费网页 | 女人张腿让男桶免费视频观看 | 午夜两性色视频免费网站 | 欧美性色欧美a在线播放 | yyy6080韩国三级理论 | 免费在线欧美 | 日韩在线三级视频 | 国内精品视频 | 国产偷窥女洗浴在线观看亚洲 | 激情久久久久久久久久久 | 韩国三级理在线视频观看 | 真实一级一级一片免费视频 | 性色在线播放 | 婷婷六 | freesexvideo性2 |