Počasen odzivni čas pri pošiljanju emailov

Na strani, ko uporabniki komentira fotografijo, skripta preveri komu vse mora poslati email. Vendar celoten proces samega pošiljanja emaila traja enostavno predolgo (od 2-10 sekund).

Malo sem raziskoval kaj v PHP kodi porabi največ časa in našel to:

// fetch response line after line
      while (!feof($fp)) {
        $result = fgets($fp, 1);
        if (strlen($result)!=0) {
          if (substr($result, 0, 3) == 250) {
            $ok = 1;
            // lower timeout after first valid response
            if (function_exists('stream_set_timeout')) {
              stream_set_timeout($fp, 1);
            }
          }
          else {
            // reset ok on error
            $ok = 0;
            break;
          }
        }
        else {
          // EOF
          break;
        }
      }

Od začetka tega "ukaza" pa do konca se porabi tisti 2 oziroma 10 sekund.

Je kdo tako dober in mogoče iz te kode lahko razbere ali je kakšna možnost optimizacije oziroma popravka?

4 odgovori

Tole je komunikacija s mail strežnikom. Če traja, preden se stran zaradi tega pokaže, bi bila moja rešitev problema asinhrono pošiljanje e-mailov.

Pošiljanje maila naj samo vse maile zapiše v bazo, ločena skripta pa pošilja maile. Zgorej pa čaka na response, da vrne. Lahko sicer daš timeout na 1, vendar če se ti bo strežnik javljal dlje kot 1 sekundo, bo izgledao, kot da mail ni bil poslan, čeprav je mogoče bil.

@Roky mogoče poznaš kak live example, da vidim kako bi to naredil?

Problem tukaj je, da uporabnik doda komentar prek jquery-a in čaka na celoten respond, da mu pokaže oddani komentar. Vmes pa seveda server počasi pošilja vse maile. Verjetno bi moral nekako ločit, da ena funkcija zapiše komentar v bazo, vzporedno pa se zalaufa še funkcija, ki pošlje obvestila na maile o novem komentarju.

Ne.. zapišeš komentar v bazo, pogledaš, in v drugo tabelo zapišeš vse potrebne podatke za pošiljanje mailov, Za Samo pošiljanje in sestavljanje mailov potem uporabiš drugo skripto, ki se zažene periodično recimo preko crona. Ali recimo uporabiš supervisord ...