2016-11-01 8 views
0

私は、メール送信プログラムを作成し、待機中に進行状況バーを使用してユーザーに通知します。残念ながら、期待通りに機能しません。プログレスバーは更新されません。phpとjqueryを使用したプログレスバー

プログラムがデータベースに由来メール住所がの配列をループ。最初にメールアドレスがメールボックス内に存在することが確認されます。そうでない場合は、報告されます。レポートは収集され、最後にブラウザに送り返されます。

進捗状況はjavascript関数 "mitgl.progressBar"によって毎秒別々のajax投稿によって報告され、PHPの下にある関数 "getProgress"を介してサーバーから送信されます。

メールの確認やメールの送信動作しますが、でgetProgressは一度だけの代わりに作られたようです。付属のコードAltough

は断片のみで、コードの残りの部分は正常に動作します。

私は多分誰かが私が盲目だものを見ることができ、問題を見つけることができません

...

Javascriptを:

versandMail: function() { 
    mitgl.unselectRec(); 
    mitgl.pInt = window.setInterval(mitgl.progressBar, 1000); 
    var oForm = $('form[name=vs]').get(0); 
    $.post(location.href, { 
     cmd: 'M mailVersand', 
     de: oForm.de.value, 
     fr: oForm.fr.value, 
     sr: oForm.sr.value, 
     aktiv: oForm.aktiv.value, 
     anfragen: oForm.anfragen.value, 
     vorstand: oForm.vorstand.value, 
     idList: (oForm.idList ? oForm.idList.value : ''), 
     betreff: oForm.betreff.value, 
     mailtext: $('textarea[name=mailtext]', oForm).htmlarea('html'), 
     attachments: JSON.stringify(mitgl.oVersand.mail.attachments) 
    }, function(data, status, oXhr){ 
     window.clearInterval(mitgl.pInt); 
     $('#progressbar').remove(); 
     $('#mailReport').remove(); 
     if (data.isEmpty()) { 
      window.alert('Auswahl hat keine Adressen ergeben'); 
     } else if (data.substr(0, 6) === 'Fehler') { 
      window.alert(data); 
     } else { 
      $('#protokoll tbody').html(data); 
      mitgl.protoLink(); 
      mitgl.selectTop(); 
     } 
    }); 
}, 
progressBar: function() { 
    $.post(location.href, { 
     cmd: 'M getProgress' 
    }, function(nProgress) { 
     if ($('#progressbar').length > 0) { 
      $('#progressbar .bar').css({width: nProgress+'%'}); 
     } else { 
      var pb = $('<div/>') 
        .attr('id', 'progressbar') 
        .appendTo('#cmd'); 
      $('<div/>') 
        .addClass('bar') 
        .appendTo(pb); 
     }     
    }); 
}, 

PHP:

function mailVersand() { 
    // ... Prepare Mail Data ... 

    require_once 'phpmailer.class.php'; 
    require_once('class.smtp.php'); 
    require_once('class.verifyEmail.php'); 

    $oVerify = new verifyEmail(); 
    $oVerify->setEmailFrom($cMailFrom); 

    $oMail = new PHPMailer(); 
    $oMail->SMTPDebug = 0; 
    $oMail->IsSMTP(); // telling the class to use SMTP 
    // 
    // ... and so on ... 
    $oMail->Host = ... 

    $aErrors = []; 
    $nSent = 0; 
    $nError = 0; 
    $nProcessed = 0; 
    $nMails = count($aMitglied); 

    session_start();    // <-- Session starts 
    $_SESSION['nProgress'] = '0'; // progress is zero 

    // loop through mailing list 
    foreach ($aMitglied as $r) { 
     $aEmail = explode(';', $r->email); 
     $email = $aEmail[0]; 
     if ($oVerify->check($email)) { 
      $oMail->AddAddress($email,"$r->vorname $r->name"); 

      // mail verificatio is ok, try to send 
      if ($oMail->send() === TRUE) { 
       $nSent++; 
      } else { 
       // no, report error 
       $e = new stdClass(); 
       $e->email = $email; 
       $e->name = $r->name; 
       $e->vorname = $r->vorname; 
       $e->error = $oMail->ErrorInfo; 
       $aErrors[] = $e; 
       $nError++; 
      }*/ 
      $oMail->ClearAddresses(); 
     } else { 
      // Mail verification failed, report error 
      $e = new stdClass(); 
      $e->email = $r->email; 
      $e->name = $r->name; 
      $e->vorname = $r->vorname; 
      $e->error = $oVerify->getAllErrors(); 
      $aErrors[] = $e; 
      $nError++; 
     } 
     $nProcessed++;  // <-- Next processed record 
           // v-- Calulate percentage of progress 
     $_SESSION['nProgress'] = strval(round($nProcessed *100 /$nMails)); 
    } 

    // create error report 
    $oBericht = new stdClass(); 
    $oBericht->sent = $nSent; 
    $oBericht->error = $nError; 
    $oBericht->fails = $aErrors; 

    // now procedure finished, reply final report 
    // .... 
    $s = $this->listVersand(); 
    echo ($s); // send reply 
    session_write_close(); // session ends 
    exit; 
} 

function getProgress() { 
    session_start(); 
    //$n = isset($_SESSION['nProgress']) ? "$_SESSION[nProgress]" : "5"; 
    $n="20"; 
    echo ($n); 
    exit(); 
} 

答えて

0

私は問題を発見しました。セッションは、Webページへの連続した呼び出しの間に値を格納できます。私が意図したことは、アクティブなPHPプロセスの間に価値を渡すことです。

これを行う1つの方法は、APCコールを使用することです。しかしこれは5.3より新しいPHPバージョンではもはや利用できないので、データベースに進捗情報を格納する方法を選択しました。

それはrecourcesの多くを使用して、非常に効果的ではありません。アクティブなPHPプロセス間で変数を共有する方が良い方法を知っている人は、ここでそれを伝えるのがよいでしょう。

関連する問題