2

私は CakePHP バージョン 1.2 で書かれたアプリケーションを持っていますが、データベースへの重くて最適化されていないクエリのために非常に遅くなりました。これは問題の例です:

$pedidos_entregas = $this->Pedido->query('select pedidos.*, lojas.*, pessoas.*, formas_pagamentos.* from pedidos inner join veiculos_periodos
          on pedidos.veiculos_periodo_id = veiculos_periodos.id inner join lojas
          on veiculos_periodos.loja_id = lojas.id inner join pessoas
          on pessoas.id = pedidos.pessoa_id inner join formas_pagamentos
          on pedidos.formas_pagamento_id = formas_pagamentos.id
          where
         (finalizado = 1 or pedidos.id in
         (
            select pedido_id from status_pedidos where statu_id = 11
         )
         ) order by entrega desc limit 200;');

キャッシュが 30 分間適用され、サイトのパフォーマンスが大幅に向上しました。しかし、30 分後、ユーザーの 1 人がページをゆっくりと表示して、キャッシュを再びいっぱいにする必要がある場合。

キャッシュの使用を含む各キャッシュ アクセス コントローラーを終了するまでの残り時間をキャプチャしました。

 $vencimento = file_get_contents(CACHE . 'cake_siv_financeiro_pedidos_entregas');
$vencimento = explode("\n",  $vencimento);
$vencimento = $vencimento[0];
$agora = strtotime('now');

$faltam = ($vencimento - $agora)/60; //remaining time
echo $faltam;

そのため、キャッシュが 30 分前に獲得し、10 分以下を逃した場合、たとえば誰かがページにアクセスした場合、キャッシュは既に再更新されています。

それでも、クエリを実行する必要があるため、ユーザーはゆっくりとページを表示する必要があります。

私の質問は: ユーザーのビューのレンダリング後に何らかの機能を実行する方法は? 私はこのようなことをしたいのですが、これはうまくいきません

public function afterFilter() 
{
    parent::afterFilter();
    //$this->atualizar_log();   

    $saida = $this->output;
    $this->output = "";
    ob_start();
    print $saida;
    flush();
    ob_end_flush();
    //I need that sleep after html returned to browser
    sleep(500);
}

2 番目の質問があります。テーブル squinte があるとします。

table people id (PK) name age 1 bob 20 2 ana 19 3 maria 50

そして、次のSQLを実行します

UPDATE people SET age = 20 where id <3  

これは ID 行 1 と 2 に影響します。CakePHP では、更新後に影響を受ける ID をどのように取得しますか? (1と2)???

これは、既存のキャッシュを削除するときに必要です。

4

2 に答える 2

1

リクエスト後にコードを実行することはできません。最善の方法は、cron ジョブを設定することです。Cake Shell を cron に接続する必要があります。http://book.cakephp.org/1.2/view/846/Running-Shells-as-cronjobsを参照してください。

なんらかの理由で cron を使用できない場合は、キャッシュを更新するアクションに対してクライアントに AJAX リクエストを発行させることを検討してください。これはページの読み込み後に発生するため、ユーザーに遅延は発生しません。

編集:1.2バージョンのドキュメントにリンク

于 2012-09-01T01:20:58.520 に答える
0

2番目の質問へ:

それを行う CakePHP の方法があるかどうかはわかりませんが、query() メソッドで mysql ステートメントを引き続き使用できます。

$sql = "SET @affids := '';
 UPDATE people
    SET age = 20
 WHERE id < 3
    AND ( SELECT @affids := CONCAT_WS(',', @affids, id) );
 SELECT TRIM(LEADING ',' FROM @affids) AS affected; ";

$rs = $this->MODELNAME->query($sql);
debug($rs);

クエリは、更新の影響を受けたコンマ区切りの ID を返します。

于 2012-08-31T08:18:40.583 に答える