ホームページ  >  記事  >  バックエンド開発  >  PHP ジェネレーターの収量は大量のデータ ビジネスを処理します (コード例)

PHP ジェネレーターの収量は大量のデータ ビジネスを処理します (コード例)

藏色散人
藏色散人転載
2020-01-25 13:54:175527ブラウズ

PHP ジェネレーターの収量は大量のデータ ビジネスを処理します (コード例)

#公式説明yield

yieldジェネレーターが#登場##php5.5 以降、公式ドキュメントでは次のように説明されています: yield は、Iterator Interface アプローチを実装するクラスを定義するのと比較して、単純な反復オブジェクトを実装する簡単な方法を提供します。パフォーマンスのオーバーヘッドと複雑さが大幅に軽減されます。 ジェネレーターの中核は

yield

キーワードです。ジェネレーター関数は通常の関数のように見えます。違いは、通常の関数は値を返すのに対し、ジェネレーターは yield を実行できることです。 必要なだけの値を生成します。ジェネレーター関数が呼び出されると、反復可能なオブジェクトが返されます。

yield

return に似ていますが、違いは、return は値を返してコードの実行を終了するのに対し、return は値を返してコードの実行を終了することです。 yield は、ループ内でこのジェネレーターを呼び出すコードに値を返し、ジェネレーター関数の実行を一時停止するだけです。

ここでは、PHP バージョンの非バッファー クエリを紹介します。

これは、データを 1 行ずつ読み取ることを意味します。 PHP 実行メモリ。PHP 実行メモリへの 1 回限りの読み取りではありません。ご存知のとおり、PHP にはデータの処理に役立つ多くの組み込み関数があります。データはメモリ内にあるため、操作できます。 , ただし、PHP の実行メモリには制限があり、デフォルトは 128M です。

注: バッファリングされていないクエリはデータベースへの接続に時間がかかるため、クエリの速度が遅くなったり、テーブル ロックなどが発生して、より多くの mysql リソースを消費する可能性があります。

非バッファー クエリとの比較 クエリはバッファー クエリです:

キャッシュされたクエリを使用すると、PHP メモリが直接爆発してメモリ不足になります。ここでの主な目的は、収量を強調することです

収量パフォーマンス

ジェネレーターは PHP アプリケーションのパフォーマンスに非常に大きな影響を与えます

PHP コードの実行時に大量のメモリを節約します

#大量のデータの計算に適しています

yield 操作

用途ジェネレーターを使用すると、メモリ内に配列を作成せずに、foreach ブロックにコードを記述してデータ セットを反復処理できます。これにより、メモリ制限に達したり、かなりの処理時間がかかってしまいます。代わりに、通常のカスタム関数と同じようにジェネレーター関数を作成できます。通常の関数が 1 回だけ返すのではなく、ジェネレーターは必要に応じて何度でも生成して、反復する必要がある値を生成できます。

例の説明

PHP ジェネレーターの収量は大量のデータ ビジネスを処理します (コード例)

デモするために配列を作成しました。通常は同じです。データベースの出力データを操作します。 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 ジェネレーターの収量は大量のデータ ビジネスを処理します (コード例) ここで大量のデータをテストします。

$this->read_temp_api_order_info(10); を変更するだけです。

データテーブルの数を計算している場合は、この方法を変更する必要があります。自分で変えてみてください。

PHP ジェネレーターの収量は大量のデータ ビジネスを処理します (コード例)

ここでは主にyieldの使い方を説明します。データ テーブルに挿入時刻フィールドを追加して、最初のデータ挿入と最後のデータ挿入の比較を確認できます。

関連する php の知識については、

php チュートリアル

をご覧ください。

以上がPHP ジェネレーターの収量は大量のデータ ビジネスを処理します (コード例)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcnblogs.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。