-1

我有一个有时需要超过 40 秒才能运行的脚本。但是微时间的东西返回不到 1 秒。

第一个问题是为什么要这么长时间????第二个问题是为什么 microtime 不能正确返回时间?

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


  }





  ?>
4

1 回答 1

2

As an important tangent to your question, please ensure you cleanse your data - those $_POSTs are wide open for SQL injection: Do htmlspecialchars and mysql_real_escape_string keep my PHP code safe from injection?

Think about using PDO prepared statements. It's more secure (helps prepare statements against SQL injection) and makes transactions easy (for several repeated queries).

As for your answer, I think you are misunderstanding what microtime() returns. I've included a link to format the number of microseconds in the way you may expect.

php microtime() format value

于 2014-06-10T20:13:24.703 回答