私は 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)???
これは、既存のキャッシュを削除するときに必要です。