2012-10-14 4 views
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']}"); 
     } 
    } 
    } 

모든 대답은 유용했다. 나는 문제가 데이터베이스에 있다고 생각하고 나의 쿼리는 최적화되지 않았다. 나는 당신이 말한 것을 시도 할 것입니다 ....

+2

프로파일 링을 수행하고 대부분의 시간을 보내고 있는지보십시오. 나는 그것이 "컬 (curl)"이라고 생각하거나 단순히 "결과 (resultados)"를 단순히 매우 큰 배열로 생각한다. – xbonez

+2

병목 현상을 테스트하는 간단한 방법은 스크립트의 각 부분이 실행 된 후 타임 스탬프를 기록하는 것입니다. 이렇게하면 "문제"가 데이터베이스 또는 컬 부분을 쿼리하는 데 있는지 확인할 수 있습니다. – Tivie

답변

1

이것은 완전한 대답은 아니지만 나는 말할 수 없으므로 여기에 있어야합니다.

일부 최적화를 달성 할 수있다 :

  • 당신이 정말 SELECT *가 필요하십니까? 당신이 필요로하는 분야에 더 구체적 일 수는 없습니까?
  • AND email = 1 상태가 실제로 필요합니까?
  • cURL 세션을 재사용 하시거나 요청할 때마다 새로운 세션을 만드시겠습니까?
  • 각 반복 이후에 행부터 $resultados 행까지 설정할 수 있으므로 더 작습니다.
    이득은 적지 만 여전히 도움이 될 수 있습니다.
  • cURL 요청에서 불필요한 것을 검색하고 있습니까?
    헤더가 필요없는 경우에는 헤더를 사용하십시오.
  • cURL 오류를 기록하는 경우 파일에 대한 액세스 권한이 있습니까?
    추가 또는 다시 작성 하시겠습니까?

고려해야 할 다른 사항이있을 수 있지만 이러한 질문은 먼저 확인해야합니다.

관련 문제