0

CRONを介して30〜30分間呼び出されるファイルがありますが、彼のやり方が非常に遅いため、それを改善するためのヒントが必要です。

彼の論理は単純です:

  1. ステータスが準備できていないすべてのレコードをデータベースで検索します

  2. レコードが存在する場合は、foreachを実行し、このクラスのインスタンスごとに別のクラスを呼び出してカールを実行し、xmlを取得してmd5ハッシュに変換し、ハッシュを現在のデータベースと比較します。

  3. ハッシュが異なる場合は、他のことを行います

問題は、誰かがこれを改善できるのであれば、このプロセスは非常に遅いということです。

<?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']}");
        }
    }
    } 

すべての答えは役に立ちました。問題はデータベースにあると思います。私のクエリも最適化されていません。私はあなたが言ったことを試してみます...。

4

1 に答える 1

1

これは完全な答えではありませんが、コメントすることはできないので、ここにある必要があります。

いくつかの最適化を実現できます。

  • 本当に必要SELECT *ですか?必要な分野をより具体的にすることはできませんか?
  • 条件AND email = 1は本当に必要ですか?
  • cURLセッションを再利用していますか、それともリクエストごとに新しいセッションを作成していますか?
  • セットが小さくなるように、各反復の後にunset行を作成できます。 ゲインは小さいかもしれませんが、それでも役立つかもしれません。$resultados
  • cURLリクエストで不要なものを取得していますか?
    あなたがそれらを必要としないならば、ヘッダーのように。
  • cURLエラーをログに記録している場合、ファイルにアクセスできますか?
    追加しますか、それとも書き直しますか?

他にも考慮すべきことがあるかもしれませんが、これらの質問を最初に確認する必要があります。

于 2012-10-14T04:22:13.030 に答える