2014-06-10 6 views
-1

스크립트를 실행하는 데 때때로 40 초 이상 걸리는 경우가 있습니다. 그러나 미세한 것은 1 초도 걸리지 않습니다.스크립트 시간을 올바르게 기록 할 수 없습니다.

첫 번째 문제는 왜 이렇게 오래 걸리는 것입니까? 두 번째 문제는 마이크로 시간이 정확하게 시간을 반환하지 않는 이유입니다.

질문에 대한 중요한 접선으로
<? 
    $inicio = microtime(true); 
    session_start(); 
    header('Content-Type: text/html; charset=utf-8'); 
    include 'coneccion-base-mails.php'; 
    include 'coneccion.php'; 
    include 'funciones.php'; 



    $id = $_POST["id"]; 

    //recuperamos los datos del envio 
    $R = $mysqli->query("SELECT * FROM envios WHERE id=".$id."")->fetch_array(); 

    $remitente = $R["remitente"]; 
    $lista = $R["lista"]; 
    $asunto = $R["asunto"]; 
    $cuerpo = $R["cuerpo"]; 
    $sustituto = $R["sustituto"]; 

    $contactos = array(); 



    //ahora creamos cargamos la lista 
    if($lista=="Todos"){ 
     $result = $mysqli->query("SELECT * FROM listas WHERE usuario='".$_SESSION["usuario"]."'"); 
     while($R = $result->fetch_array()){ 
      $dato = array($R["nombre"],$R["apellido"],$R["mail"]); 
      array_push($contactos,$dato); 
     } 
    } 
    else{ 
     $result = $mysqli->query("SELECT * FROM segmentos WHERE titulo='".$lista."' and usuario='".$_SESSION["usuario"]."'"); 
     $R = $result->fetch_array(); 
     $idsegmento = $R["id"]; 
     $result = $mysqli->query("SELECT * FROM listasegmentos WHERE idsegmento=".$idsegmento.""); 
     while($R = $result->fetch_array()){ 
      $dato = array(nombreContacto($R["idcontacto"]),apellidoContacto($R["idcontacto"]),mailContacto($R["idcontacto"])); 
      array_push($contactos,$dato); 
     } 
    } 

    //ya tenemos los contactos, 

    //ahora los recorremos uno a uno, fijandonos si ya fue enviado ese mail, si fue enviado vamos al siguiente, sino lo mandamos y cortamos. 
    $total = count($contactos); 
    $mm = 0; 

    if(mailsEnviadosEstaHora() < $limiteMailsPorHora){ 
     foreach($contactos as $contacto){ 
      $nombre = $contacto[0]; 
      $apellido = $contacto[1]; 
      $mail = $contacto[2]; 
      if(mailEnviado($mail)=="no"){ 
       if(strpos($mail,";")===false){ 

        enviarMail($nombre." ".$apellido." <".$mail.">",$mail,$nombre); 

       } 
       else{ 
        $mails = explode(";",$mail); 
        $comp = ""; 
        foreach($mails as $mailss){ 
         if($comp == ""){ 
          $comp = $nombre." ".$apellido." <".$mailss.">"; 
         } 
         else{ 
          $comp .= ",".$nombre." ".$apellido." <".$mailss.">"; 
         } 
        } 
        enviarMail($comp,$mail,$nombre); 
       } 
       break; 
      } 
      else{ 
       $mm++; 
      } 
     } 


     if($mm == $total){ 
      $mysqli->query("UPDATE envios SET estado='enviada' WHERE id=".$id.""); 
      echo "actualizar"; 
     } 
    } 
    else{ 
     //se llego al limite de mails por hora 
     echo "limite"; 
    } 






    function marcarEnviado($mail){ 
     global $mysqli; 
     global $id; 
     global $remitente; 
     global $lista; 
     global $asunto; 
     global $cuerpo; 
     global $mm; 
     global $total; 
     global $inicio; 


     $fecha = date("Y")."-".date("m")."-".date("d"); 

     $mysqli->query("INSERT INTO procesoenvio (idenvio,destinatario,estado,fecha,hora,solohora) VALUES (".$id.",'".$mail."','enviado','".$fecha."','".date('H:i:s')."','".date('H')."')"); 

     $caca = $mm+1; 
     echo $caca."/".$total; 
     $actual = microtime(true); 
    $totalsss= $actual- $inicio; 
    echo 'Tiempo : '.$totalsss.' segundos<br>'; 

    } 

    function enviarMail($para,$mail,$nombre){ 
     global $mysqli; 
     global $id; 
     global $remitente; 
     global $lista; 
     global $asunto; 
     global $cuerpo; 
     global $sustituto; 



     if($nombre==''){ 
      $nombre = $sustituto; 
     } 


     //from 
     $from = array(); 
     $_datos = explode("<",$remitente); 
     $_nombre = trim($_datos[0]); 
     $_mail = $_datos[1]; 
     $_mail = trim(str_replace(">","",$_mail)); 
     $from[$_mail] = $_nombre; 

     $cuentas = explode("---",$_SESSION['correo']); 

     foreach($cuentas as $cuenta){ 

      $correo = explode("|||",$cuenta); 
      $username = $correo[0]; 
      $password = $correo[1]; 
      if($username == $_mail){ 
       break; 
      } 
     } 



     // 

     require_once 'swiftmailer-master/lib/swift_required.php'; 

     // Create the mail transport configuration 
     $transport = Swift_SmtpTransport::newInstance("mail.dxxxxxxxxxxx.com",25); 
     $transport->setUsername($username); 
     $transport->setPassword($password); 

     // Create the message 
     $message = Swift_Message::newInstance(); 

     $destinatarios = explode(",",$para); 
     $destin = array(); 
     foreach($destinatarios as $destinatario){ 
      $s = strpos($destinatario,"<"); 
      if($s===false){ 
       array_push($destin,$destinatario); 
      } 
      else{ 
       $_datos = explode("<",$destinatario); 
       $_nombre = trim($_datos[0]); 
       $_mail = $_datos[1]; 
       $_mail = trim(str_replace(">","",$_mail)); 
       $destin[$_mail] = $_nombre; 
      } 

     } 


     $message->setTo($destin); 
     $message->setSubject($asunto); 

     $message->setFrom($from); 

     // adjuntos!!! 
     $ruta = '../../panel/envios/adjuntos/' . $id . '/'; // Relative to the root 

     if(file_exists($ruta)){ // Abrir archivos 
      $n = 0; 

      $archivos = array(); 

      foreach (new DirectoryIterator($ruta) as $file) { 
       if($file->isDot()) continue; 
       array_push($archivos,$file->getFilename()); 
      } 
      sort($archivos); 
      foreach($archivos as $archivo){ 

       $message->attach(Swift_Attachment::fromPath('http://xxxxxxxxxxxxxxxxxxxx.com'.str_replace('../../','/',$ruta).str_replace(' ','-',$archivo))); 
       $n+=1; 
       //break; 
      } 

      if($n==0){ 
       //no hay fotos en la carpeta 

      } 

     } 
     $cuerpoPersonalizado = str_replace('[[[Nombre]]]',$nombre,$cuerpo); 
     $message->setBody($cuerpoPersonalizado,'text/html'); 
     $msg = $message->toString(); 
     $msg = str_replace('http://xxxxxxxxxxxx.com/img.php?i','#',$msg); 
     $verificacion = base64_encode($id.'|||'.$mail); 
     $cuerpoPersonalizado = str_replace('numeroidentificacion',$verificacion,$cuerpoPersonalizado); 
     $message->setBody($cuerpoPersonalizado,'text/html'); 
     // Send the email 
     $mailer = Swift_Mailer::newInstance($transport); 

     //$mailer->send($message) or die($msg); 

     $mailer->send($message); 



     marcarEnviado($mail); 




     $hostname = '{localhost:143}Sent Items'; 
     $conn = imap_open($hostname,$username,$password) or die('No se pudo conectar con: usuario: '.$username.' y clave: '.$password.' ' . imap_last_error()); 

     imap_append($conn, '{localhost:143}Sent Items', $msg, "\\Seen") or die("error"); 


    } 





    ?> 
+0

당신은'에코 '티엠포 :'를 사용한다. .round ($의 totalsss, 5) ' segundos
'; – barell

+2

거기에는 많은 것이 있습니다. 더 이상 시간이 걸리지 않을 때까지 파트를 꺼낸 다음 빨리 제거되기 전에 제거 된 마지막 청크에 집중하십시오. 어떤 쿼리 (다른 것들 중에서도)가 느려질 수 있습니다. –

+0

가장 이상한 점은 스크립트가 보통, 1 초, 그리고 40 초 이상 실행되는 경우가 종종 있습니다. 호스팅 회사는 제한이 아니라고 말했고, 서버의 유일한 메일 제한은 시간당 500 메일이지만, 그보다 훨씬 적습니다. –

답변

2

, 당신은 당신의 데이터를 정화 확인하십시오 - 그 $ _POSTs는 SQL 주입을 위해 활짝 열려 있습니다 Do htmlspecialchars and mysql_real_escape_string keep my PHP code safe from injection?

PDO prepared statements를 사용하는 방법에 대한 생각. 그것은 더 안전합니다 (SQL injection에 대한 명령문 준비에 도움이 됨).

귀하의 대답은, 당신이 microtime()이 반환하는 것을 오해하고 있다고 생각합니다. 예상 할 수있는 방식으로 마이크로 초의 수를 형식화하는 링크를 포함 시켰습니다.

php microtime() format value

+0

rroberts $ _POSTs에 대한 조언을 해 주셔서 감사합니다. 나는 그것을 고쳐야 할 것입니다. 지금 당장은 공개적으로 공개하지 않는 것이 내부 용입니다. 따라서 SQL 주입에 대해 걱정할 필요가 없습니다. ,하지만 앞으로는 그것을 처리해야 할 것입니다. 고마워요. –

+0

그건 물론 잘못된 소프트웨어 엔지니어링 관행의 커다란 징후입니다. 안전한 방법을 사용하지 않아도되고 위험한 것을 사용하지 않아도됩니다. –

관련 문제