2

我有一个用 CakePHP 1.2 版编写的应用程序,由于对数据库的查询繁重且未优化,因此速度非常慢,这是 deleas 的一个示例:

$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 分钟后,其中一位用户将不得不缓慢地查看页面,以再次填充缓存。

我捕获了完成每个缓存访问控制器包含的缓存使用的剩余时间。

 $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);
}

我有第二个问题,说我有一张桌子亮片:

表 人 id (PK) 姓名 年龄 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

to second question:

don't know if there is CakePHP way to do it but, you can still use mysql statement in query() method:

$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);

the query returns comma separated ids affected by the update.

于 2012-08-31T08:18:40.583 回答