改善通过curl执行的脚本

时间:2012-10-14 04:04:58

标签: php crontab

我有一个文件将通过CRON调用30到30分钟,但是想要一些提示来改进它,因为他的方式非常慢。

他的逻辑很简单:

  1. 在数据库中搜索状态未就绪的所有记录

  2. 如果存在记录,它会执行foreach,并且对于此类的每个实例,它调用另一个类来执行curl以获取xml将其转换为md5哈希并将哈希值与当前数据库进行比较。

  3. 如果哈希值不同,则会执行其他操作

  4. 问题是这个过程非常慢,如果有人可以改善这个过程吗?

    <?php
    
    require_once($_SERVER['DOCUMENT_ROOT'] . 'setup.php');
    
    $MySQL = new MySQL();
    $resultados = $MySQL->query("SELECT * FROM objetos WHERE situacao != 'entregue' AND email = 1")->fetchAll(PDO::FETCH_ASSOC);
    
    if ($resultados) {
        foreach ($resultados as $resultado) {
            $Rastreio = new Correios(new cURL(), $resultado['cod_objeto']);
    
            if ($Rastreio->resultado['hash'] != $resultado['hash']) {
    
                $user = $MySQL->query("SELECT  nome, email FROM usuarios WHERE id_usuario = {$resultado['fk_id_usuario']}")->fetch(PDO::FETCH_LAZY);
    
            // Doing something different
    
                $MySQL->exec("UPDATE objetos SET situacao = $Rastreio->resultado['status'], hash = {$Rastreio->$resultado['hash']} WHERE cod_objeto = {$resultado['cod_objeto']} AND fk_id_usuario = {$resultado['fk_id_usuario']}");
            }
        }
        } 
    

    所有答案都很有用。我认为问题出在数据库中,我的查询也没有优化。我会试试你说的......

1 个答案:

答案 0 :(得分:1)

这不是一个完整的答案,但我无法发表评论,所以它必须在这里。

可以实现一些优化:

  • 你真的需要SELECT *吗?对于你需要的领域,它不能更具体吗?
  • 条件AND email = 1真的需要吗?
  • 您是在重复使用cURL会话还是为每个请求创建一个新会话?
  • 每次迭代后,unset可以$resultados行,因此集合较小 增益可能很小,但仍有帮助。
  • 您是否在cURL请求中检索不必要的内容?
    如果您不需要它们,请使用标题。
  • 如果您正在记录cURL错误,您是否可以访问该文件?
    你是在追加还是重写?

可能还有其他事情需要考虑,但这些问题应该是首先要检查的问题。