Pages

ラベル CakePHP4 の投稿を表示しています。 すべての投稿を表示
ラベル CakePHP4 の投稿を表示しています。 すべての投稿を表示

2023年9月6日水曜日

CakePHP4 DBの複数レコード情報を一気に取得するとメモリーが足りないのでに少しずつ取得する

今回はCSV出力する際にレコード数が多くてメモリー不足にならない方法を考えていました。

CakePHP 4では、`enableBufferedResults`を利用してメモリー不足を発生させないようにすることができます。この設定は、データベースから大量のデータを取得する場合など、メモリーを効率的に管理するために役立ちます。

まずは公式ドキュメントの紹介
https://book.cakephp.org/4/ja/orm/retrieving-data-and-resultsets.html#id16

`enableBufferedResults`を有効にすると、CakePHPはデータベースのクエリ結果をメモリーに全て読み込むのではなく、イテレータを使用してデータを一部ずつ取得できるようになります。これにより、大規模なデータセットを取り扱う場合でもメモリー不足の問題を回避できます。

以下は、CakePHP 4で`enableBufferedResults`を設定する方法です。

1. コントローラーまたはモデルのアクション内で、`enableBufferedResults`を有効にします。たとえば、以下のように設定できます。

// コントローラーのアクション内で
public function getData() {
    // データベースから大量のデータを取得するクエリ
    $query = $this->Table->find()->enableBufferedResults();

    // データを取得
    foreach ($query as $row) {
        // データの処理
    }
}

2. 上記の例では、`enableBufferedResults`をクエリオブジェクトに適用し、`foreach`ループを使用してデータを一つずつ処理しています。この方法を使用することで、メモリー不足を回避できます。

注意事項:

- `enableBufferedResults`を有効にしてループしてる時などは別のクエリーを投げる事はできません。(多分。。)DBコネクションを追加して対応する方法もありますが、接続数をその分消費してしまうため可能であれば避けたい方法ではあります。

- `enableBufferedResults`を有効にすると、イテレータが内部で使用され、データベースの接続がクローズされると自動的にクリーンアップされます。

- 大規模なデータセットを処理する場合、`enableBufferedResults`を有効にしても、パフォーマンスの問題が発生する可能性があるため、適切なインデックスやクエリの最適化も検討してください。

- メモリーの使用状況に注意し、必要な場合には適切なタイミングで不要なリソースを解放することをお勧めします。

2023年4月27日木曜日

[CakePHP4] Controller から コマンドを実行する方法

$commandRunner = new CommandRunner(new Application(ROOT . DS . 'config'), 'cake');
$commandRunner->run([
    'bin' . DS . 'cake',
    'command_name',
    'param1',
    'param2,
]);

上記は

$ bin/cake command_name param1 param2

と同等。

2021年7月5日月曜日

FriendsOfCake / search の使い方メモ

FriendsOfCake/search

https://github.com/FriendsOfCake/search

インストール

composerをインストールした環境で

$ php composer.phar require friendsofcake/search

プラグインを追加したらソースから利用できるように

$ bin/cake plugin load Search

利用方法

https://github.com/FriendsOfCake/search/tree/master/docs

Tableの initialize() でビヘイベアを追加


同じく Table の initialize() に検索条件のテンプレートのようなもので コレクション を記載する。


解りにくいけど useCollection() から次の useCollection() までが1つのコレクションとなるみたい。

add() で追加できる1検索条件は色々なタイプが用意されている。

add() の第2パラメーターで、指定する他、メソッドからも検索タイプを指定可能。
この方が phpstorm とかなら候補で出てくるので解りやすい。

フィルター

  1. value()
    完全一致で検索をする。
  2. like()
    LIKE検索をする。
  3. boolean()
    結果を true または false で検索をする。
    ※true にはデフォルトで 1、true、 '1'、 'true'、 'yes'、 'on' を含む。
  4. exists()
    対象カラムがNOT NULLかを検索する。
  5. finder()
    finder****() という関数を使用して検索する。
    https://book.cakephp.org/3/ja/orm/retrieving-data-and-resultsets.html#custom-find-methods
  6. compare()
    比較演算子(>, <= など)を使って検索する。
  7. callback()
    コールバック関数を使って検索する。



対応オプジョン

共通で利用できるオプジョン

  1.  fields (array)
    検索に使用するフィールドの名前を指定する。
  2. name (string、デフォルトでは、add filterメソッドの最初の引数に渡された名前になります)
    フィルターの名前をフィールドとは別にしたい場合に利用する。
  3. alwaysRun (bool、デフォルトはfalse)
    存在するかどうかに関係なく、フィルタを常に実行するかどうかを定義する。
  4. filterEmpty (bool、デフォルトはfalse)
    空の場合に、フィルターを実行しないかどうかを定義する。
  5. flatten (bool、デフォルトはtrue)
    入力フォームから配列として渡される値をフラット化するかどうかを定義する。
  6. beforeProcess (callable、デフォルトはnull)
    $queryと$argsを引数として受け取ります。たとえば、クエリに結合または包含を設定するためにコールバックを使用。
  7. aliasField (bool、デフォルトはtrue)
    フィールド名にエイリアスを設定する場合に利用する。
  8. defaultValue (mixed、デフォルトはnull)
    デフォルト値を指定する。

Boolean

  1. mode (string、デフォルトはOR)
    複数のフィールドと照合するときに使用する条件付きモード。
    有効な値は、ORとAND。

 Exists

  1. mode (string、デフォルトはOR)
    複数のフィールドと照合するときに使用する条件付きモード。
    有効な値は、ORとAND。
  2. nullValue (stringまたはnull、デフォルトはnull)
    null許容でない列に使用できます。
    =/の!=代わりにIS NULL/を介してチェックするには、空の文字列に設定しIS NOT NULLます。

Compare

  1. operator (string、デフォルトは>=)
    比較に使用する演算子。有効な値は>=、<=、>と<。
  2. mode (string、デフォルトはAND)
    複数のフィールドと照合するときに使用する条件付きモード。
    有効な値は、ORとAND。

Like

  1.  multiValue (bool、デフォルトはfalse)
    フィルターが複数の値を受け入れるかどうかを定義します。
    無効になっていて、複数の値が渡されている場合、フィルターは defaultValue オプションで定義されたデフォルト値の使用にフォールバックします。
  2. multiValueSeparator (string、デフォルトはnull)
     特定の区切り文字列を使用して、フィルターが複数の値を自動トークン化するかどうかを定義します。無効にした場合、データは配列の形式である必要があります。
  3. colType (array)
    連想配列。実際の型に関係なく、文字列列として扱う必要がある列のカスタム型を設定するために使用します。これは、整数フィールドが検索対象のフィールドの一部である場合など、整数フィールドにとって重要です。使用例: 'colType' => ['id' => 'string']
  4. before (bool、デフォルトはfalse)
    検索語の前にワイルドカードを自動的に追加するかどうか 。
  5. after (bool、デフォルトはfalse)
    検索語の後にワイルドカードを自動的に追加するかどうか 。
  6. fieldMode (string、デフォルトはOR)
    複数のフィールドと照合するときに使用する条件付きモード。有効な値は、ORとAND。
  7. valueMode (string、デフォルトはOR)
    複数の値を検索するときに使用する条件付きモード。有効な値は、ORとAND。
  8. comparison (string、デフォルトはLIKE)
    使用する比較演算子。
  9. wildcardAny (string、デフォルトは*)
    として扱われるべき文字列を定義する任意のそれは検索用語に遭遇している場合にワイルドカードを。この動作により、これは内部的に適切なSQL互換のワイルドカードに置き換えられます。これは、検索語内で実際のワイルドカード文字を使用して用語の一部として扱われるようにしながら、検索語内でワイルドカードを渡したい場合に役立ちます。たとえば、の検索語* has reached 100%はに変換され% has reached 100\%ます。さらに、オプションを参照してくださいescapeDriver。
  10. wildcardOne (string、デフォルトは?)
    検索語で検出された場合に1つのワイルドカードとして扱われる文字列を定義します。と同様に動作しwildcardAnyます_。つまり、検索語が使用された場合、実際のSQL互換ワイルドカード()はエスケープされます。
  11. escaper (stringへのデフォルトnull)
    エスケープする必要がありエスケー定義%とは_。エスケープ機能が設定されていない場合(escapeDriver => 'null')、エスケープ機能はデータベースドライバによって設定されます。ドライバがある場合 に使用される(エスケープするとします)。他のすべての場合に (エスケープに使用されるにし、に)。と設定にエスケープを追加することで、独自のエスケープを追加できます。SqlserverSqlserverEscaper%[%]_[_]DefaultEscaper%\%_\_App\Model\Filter\Escaper\OwnEscaper'escaper' => 'App.Own'

Value

  1. multiValue (bool、デフォルトはfalse)
    フィルターが複数の値を受け入れるかどうかを定義します。無効になっていて、複数の値が渡されている場合、フィルターはdefaultValueオプションで定義されたデフォルト値の使用にフォールバックします。
  2. multiValueSeparator (string、デフォルトはnull)
    特定の区切り文字列を使用して、フィルターが複数の値を自動トークン化するかどうかを定義します。無効にした場合、データは配列の形式である必要があります。
  3. mode (string、デフォルトはOR)
    複数のフィールドと照合するときに使用する条件付きモード。有効な値は、ORとAND。
  4. negationChar (string、デフォルトはnull)
    multiValue特に値が多い場合は、の代替。フィルタは任意の文字列を受け入れますが、理想的には、検索値のプレフィックスとして単一の一意の文字である必要があります。たとえば!、文字列値または-数値の場合。有効にすると、フィルターはこの値の式を無効にします。

Finder

  1. finder (string、デフォルトはフィルター名)
     使用する検索タイプ。
  2. map (array、デフォルトは[])
     フィールドをファインダーキー('to_field' => 'from_field')にマップする必要がある場合は、配列を構成します。
  3. options (array、デフォルトは[])
    ファインダーに渡す追加オプション。
 

2021年5月22日土曜日

[CakePHP4] 翻訳ファイルの作成まで

翻訳辞書ファイル(.po)を作成するまでの手順

PS D:\prj\example.com\www.example.com> ./bin/cake i18n
I18n Shell
-------------------------------------------------------------------------------
[E]xtract POT file from sources
[I]nitialize a language from POT file
[H]elp
[Q]uit
What would you like to do? (E/I/H/Q)
> E
Current paths: None
What is the path you would like to extract?
[Q]uit [D]one
[D:\prj\example.com\www.example.com\src\] >

Current paths: D:\prj\example.com\www.example.com\src\
What is the path you would like to extract?
[Q]uit [D]one
[D:\prj\example.com\www.example.com\templates\] >

Current paths: D:\prj\example.com\www.example.com\src\, D:\prj\example.com\www.example.com\templates\
What is the path you would like to extract?
[Q]uit [D]one
[D] >

Would you like to extract the messages from the CakePHP core? (y/n)
[n] > y
What is the path you would like to output?
[Q]uit
[D:\prj\example.com\www.example.com\resources\locales\] >


Extracting...
-------------------------------------------------------------------------------
Paths:
   D:\prj\example.com\www.example.com\src\
   D:\prj\example.com\www.example.com\templates\
   D:\prj\example.com\www.example.com\vendor\cakephp\cakephp\src\
Output Directory: D:\prj\example.com\www.example.com\resources\locales\
-------------------------------------------------------------------------------
==========================================================================> 100%
default.pot is unchanged. Skipping.
cake.pot is unchanged. Skipping.

Done.

ここまでで .po ファイルの雛形となる .pot ファイルが作成される。

What would you like to do? (E/I/H/Q)
> I
Please specify language code, e.g. `en`, `eng`, `en_US` etc.
> ja_JP
What folder?
[D:\prj\example.com\www.example.com\resources\locales\] >

.po が ja_JP 以下に作成される。

2021年5月18日火曜日

[CakePHP4] bake template で index,view,add,edit 以外を追加

自分は
  • add.php
  • edit.php
  • index.php
  • view.php
以外にも form.php を作成していて、 add.php, edit.php からそれを呼び出して共通かしています。
なので、bakeコマンドで form.php も作ってほしい。

あと基本的には Bootstrap を利用しているので、テーマを自作してと。。
  • plugins/BootstrapTheme/templates/bake/Template/add.twig
  • plugins/BootstrapTheme/templates/bake/Template/edit.twig
  • plugins/BootstrapTheme/templates/bake/Template/index.twig
  • plugins/BootstrapTheme/templates/bake/Template/view.twig
  • plugins/BootstrapTheme/templates/bake/Template/form.twig
こんな感じ。

作成して 

$ ./bin/cake bake template

とするけど。。

いつも通り
  • add.php
  • edit.php
  • index.php
  • view.php
ができるだけ。。

form.php だけを追加するのは以下のようなコマンドでできるので、自分のそれで追加しています。。

$ ./bin/cake bake template samples form


Followers