用PHP的生成器yield處理大量資料,確實很快!
yield生成器是php5.5之後出現的,官方文件這樣解釋:yield提供了一種更容易的方法來實現簡單的迭代物件,相比較定義類實現 Iterator 介面的方式,效能開銷和複雜性大大降低。
這裡順便給大家介紹一下php版本的非緩衝查詢
如果用快取查詢,php記憶體就會直接爆了,出現記憶體不足的情況。好了,這裡主要是為了突出yield
yield效能
-
生成器會對PHP應用的效能有非常大的影響
-
PHP程式碼執行時節省大量的記憶體
-
比較適合計算大量的資料
yield運用
生成器允許你在 foreach 程式碼塊中寫程式碼來迭代一組資料而不需要在記憶體中建立一個陣列,那會使你的記憶體達到上限,或者會佔據可觀的處理時間。相反,你可以寫一個生成器函式,就像一個普通的自定義函式一樣, 和普通函式只返回一次不同的是, 生成器可以根據需要 yield 多次,以便生成需要迭代的值。
例子講解
public function read_temp_api_order_info($number){ for($i=1; $i <= $number; $i++){ $temp_api_order_info = [ 'address' => "這裡是磊豐的測試地址:13號50".$i."室", 'card_no' => "8888888711172157", 'city' => "440300", 'create_id' => 1, 'create_name' => "zhuomaquan333", 'created_at' => "2019-11-11 10:05:36", 'customer_name' => "磊豐", 'customer_phone' => "1008611", 'dealer_id' => "111", 'delivery_id' => 115, 'dispatch_info' => "", 'district' => "440306", 'examine_id' => 1, 'examine_name' => "zhuomaquan333", 'goods' => [203 => 3], 'order_id' => "D201911119000".$i, 'order_status' => "14", 'order_type' => 2, 'province' => "440000", 'remark' => null, 'updated_at' => "", 'ware_id' => "151", ]; yield $temp_api_order_info; } }
我這裡只是構建了一個陣列來給大家演示,平常你在運算元據庫輸出資料也是一樣的。轉為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 語句為止。
這裡測試大量資料,直接更改 $this->read_temp_api_order_info(10);就好,如果是計算資料表數量,那你就要改改這個方法了。自己試著更改一下吧。
這裡我主要給大家講解yield的用法,如果要看插入資料表用了多長時間,自己可以在資料表增加插入時間的欄位,再看看第一條資料插入與最後一條資料插入的時候的對比的。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70009696/viewspace-2841244/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- php-yield生成器PHP
- 在PHP中怎麼解決大量資料處理的問題PHP
- 小程式處理大量資料列表的方法
- 前端如何處理十萬級別的大量資料前端
- PHP yield from 生成器用法探究 (二)PHP
- PHP效能優化:生成器 yield的初體驗PHP優化
- 大量資料如何做分頁處理
- PHP yield 協程 生成器用法探究 (一)PHP
- php生成器函式與yield關鍵字PHP函式
- 處理XML資料應用實踐XML
- 簡單瞭解一下php的迭代生成器yieldPHP
- phpexcel 處理大量資料時記憶體溢位PHPExcel記憶體溢位
- php傳送超大資料處理PHP大資料
- 處理MySQL資料庫出現大量Locked的一個案例MySql資料庫
- 影像處理的實現與應用(PHP 版)PHP
- PHP匯入大量CSV資料PHP
- php yieldPHP
- 解決Oracle中Exp/Imp大量資料處理問題Oracle
- 大量資料需精確快速查詢時的資料結構?資料結構
- 主庫千萬級的資料更新後,STANDBY日誌應用大量延遲的問題處理
- php插入資料含有特殊符號的處理方法PHP符號
- PHP 結合 MySQL 千萬級資料處理PHPMySql
- 如何在 PHP 中處理 Protocol Buffers 資料PHPProtocol
- Python資料處理:Pandas模組的 12 種實用技巧Python
- Jtti:怎樣正確處理Redis中的海量資料JttiRedis
- 使用Slonik框架基於Node.js和PostgreSQL處理大量資料框架Node.jsSQL
- 用R處理不平衡的資料
- RAC資料庫大量載入資料造成歸檔日誌空間滿處理資料庫
- 生成器yield,next()與send()
- 大量time-wait的處理方法AI
- PHP+MySQL 千萬級資料處理案例(一)PHPMySql
- java大資料處理:如何使用Java技術實現高效的大資料處理Java大資料
- 用 Python 實現 PowerDesigner 資料模型檔案的處理Python模型
- 【Pandas學習筆記02】處理資料實用操作筆記
- 處理百萬級以上的資料處理
- Python多程式處理:如何將大量資料放入有限記憶體Python記憶體
- Apache Flink 如何正確處理實時計算場景中的亂序資料Apache
- 用 UI 多執行緒處理 WPF 大量渲染的解決方案UI執行緒