站長資訊網
        最全最豐富的資訊網站

        PHP生成器yield處理大量數據業務(代碼示例)

        PHP生成器yield處理大量數據業務(代碼示例)

        官方解釋yield

        yield生成器php5.5之后出現的,官方文檔這樣解釋:yield提供了一種更容易的方法來實現簡單的迭代對象,相比較定義類實現 Iterator 接口的方式,性能開銷和復雜性大大降低。

        生成器的核心是一個yield關鍵字,一個生成器函數看起來像一個普通的函數,不同的是:普通函數返回一個值,而一個生成器可以yield生成許多它所需要的值。生成器函數被調用時,返回的是一個可以被遍歷的對象。

        yieldreturn有點類似,不過不同的是,return會返回值并且終止代碼的執行,而yield會返回一個值給循環調用此生成器的代碼并且只是暫停執行生成器函數。

        這里順便給大家介紹一下php版本的非緩沖查詢

        意思即是 把數據一行行 讀取到php運行內存,并非一次性讀取到php運行內存,眾所周知,php有很多內置函數,可以幫助我們對數據進行加工操作,因為數據都在內存里面,所以能操作,但是php的運行內存是有極限,默認128M。

        注意:因為非緩沖查詢是 會長時間連接數據庫的,有可能會造成慢查詢、鎖表之類的情況,比較耗mysql資源

        相對非緩沖查詢就是 緩沖查詢:

        如果用緩存查詢,php內存就會直接爆了,出現內存不足的情況。好了,這里主要是為了突出yield

        yield性能

        生成器會對PHP應用的性能有非常大的影響

        PHP代碼運行時節省大量的內存

        比較適合計算大量的數據

        yield運

        生成器允許你在 foreach 代碼塊中寫代碼來迭代一組數據而不需要在內存中創建一個數組,那會使你的內存達到上限,或者會占據可觀的處理時間。相反,你可以寫一個生成器函數,就像一個普通的自定義函數一樣, 和普通函數只返回一次不同的是, 生成器可以根據需要 yield 多次,以便生成需要迭代的值。

        例子講解

        PHP生成器yield處理大量數據業務(代碼示例)

        我這里只是構建了一個數組來給大家演示,平常你在操作數據庫輸出數據也是一樣的。轉為array

        //倉庫庫存扣除測試 public function cangku_stock() {     //set_time_limit(0);  //表示永久運行,這里我是測試array的時候用到的     $order_info = $this->read_temp_api_order_info(10);  //這里我就測試了10條數據,效果是看不出來的     foreach($order_info as $temp_api_order_info){         dd($temp_api_order_info);  //打印出來看看數據         //處理數據         $api_ware_id = $this->o->getCangkuApiUrl() .'ware/program/addOutWare';         $out_wares = api_request($api_ware_id, $temp_api_order_info);         $temp_out_wares = json_decode($out_wares, true);         if ($temp_out_wares['code'] != 1) {             $msg =  (isset($temp_out_wares['msg']) && $temp_out_wares['msg']) ? $temp_out_wares['msg'] : var_export($out_wares, true);             throw new Exception($msg);         }     }     //dd("批量更新成功".date('Y-m-d H:i:s'));

        可以看到我們調用 $order_info = $this->read_temp_api_order_info(10);返回了一個 Generator 對象,這個對象可以使用 foreach 迭代,每次迭代,PHP 會要求 Generator 實例計算并提供下一個要迭代的值。

        生成器的優雅體現在每次產出一個值之后,生成器的內部狀態都會停頓;向生成器請求下一個值時,內部狀態又會恢復。生成器內部的狀態會一直在停頓和恢復之間切換,直到抵達函數定義體的末尾或遇到空的 return 語句為止。

        效果如下:

        PHP生成器yield處理大量數據業務(代碼示例)

        這里測試大量數據,直接更改$this->read_temp_api_order_info(10);就好,如果是計算數據表數量,那你就要改改這個方法了。自己試著更改一下吧。

        PHP生成器yield處理大量數據業務(代碼示例)

        這里我主要給大家講解yield的用法,如果要看插入數據表用了多長時間,自己可以在數據表增加插入時間的字段,再看看第一條數據插入與最后一條數據插入的時候的對比的。

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 欧美精品华人在线| 97久久久久人妻精品专区| 老司机69精品成免费视频| 天天视频国产精品| 亚洲AV无码久久精品狠狠爱浪潮| 国产办公室秘书无码精品99| 欧美精品亚洲人成在线观看| 无码精品人妻一区二区三区中| 国产精品99久久久久久宅男| 亚洲第一永久AV网站久久精品男人的天堂AV | 精品国产品香蕉在线观看75| 国产成人无码精品久久久免费| 精品久久久久久国产免费了| 亚洲国产精品成人网址天堂| 国产av无码专区亚洲国产精品| 97久久超碰国产精品旧版| 日本内射精品一区二区视频 | 国产日韩精品中文字无码| 亚洲精品高清久久| 蜜臀AV无码国产精品色午夜麻豆| 911亚洲精品国产自产| 在线观看国产精品普通话对白精品 | 日韩精品久久无码中文字幕| 日本精品一区二区三区在线视频一| 国产精品无码一区二区在线| 亚洲高清国产拍精品26U| 精品国产美女福利到在线不卡| 国产精品无码无卡在线播放 | 亚洲?V乱码久久精品蜜桃| 精品久久久久久99人妻| 精品久久久久久无码人妻热| 久久99精品久久久久久水蜜桃| 久久国产精品免费| 久久国产精品国语对白| 久久精品国产亚洲7777| 99久久人妻无码精品系列蜜桃 | 人妻一区二区三区无码精品一区| 男女男精品视频网站在线观看| 天天爽夜夜爽夜夜爽精品视频| 亚洲成人国产精品| 亚洲国产第一站精品蜜芽|