php, process output 0-100% färdigt

Tråden skapades och har fått 15 svar. Det senaste inlägget skrevs .
1
  • Medlem
  • Stockholm
  • 2004-01-17 10:57

Tja!

Har ett script som mailar iväg en bunt mails, à la newsletter, och tänkte att man skulle få sig en snygg 0-100% process-bar så man vet att sidan arbetar samt hur långt det är kvar tills sidan är färdigladdad.

det enda jag kommit på är att kolla hur många mails som SKA skickas och sen vet jag inte riktigt hur man gör för att känna av när ett mail blivit skickat samt hur man uppdaterar sidan (utan att ladda om sidan givetvis).

Gissar att man ska använda sig av output buffer men förstår inte säkert hur det skulle gå till.

Tänkte mig kanske ha så här:

<div style="width: 300px">
   <div style="width: 1%; text-align:center;">working ...</div>
</div>

och undrar då hur jag uppdaterar så det istället för 1% står 2% och så vidare.

En till fundering. Är det tidskrävande att uppdatera på det viset? Vill ju inte att det ska vara feedbacken som bromsar scriptets hastighet... man kanske bara ska visa med 5% hopp tex...

Problemet är att det inte går att uppdatera sidan utan att ladda om den. Det du skulle kunna göra är antingen att använda sessionsvariabler för att hålla reda på vilka meddelanden som skickats (knöligt, slöar dessutom ner), forka loss en bakgrundsprocess som skickar meddelandena och som kan meddela hur många som skickats (bästa lösningen, men plågsamt svårt att göra i php), eller så titta på mer effektiva lösningar för att skicka många meddelanden.

Själv skulle jag nog använda en bättre lösning för själva skickandet. Använder du mail() i php så får du nämligen usla prestanda för många meddelanden, eftersom en ny anslutning öppnas för varje meddelande. Om du i stället öppnar en anslutning, skickar iväg alla meddelanden på en gång och sedan stänger ner anslutningen så får du mångdubbelt bättre prestanda, och förhoppningsvis går det så fort att du aldrig behöver bekymra dig om att implementera en förloppsindikator. Färdiga kodsnuttar för massutskick finns lite varstans, men den här är rätt enkel att använda:

http://www.zend.com/codex.php?id=347&single=1

jag är ingen höjdare på mailservers osv.. men är det inte upp till mailservern (sendmail, postfix et al) att que'a alla mail så dom inte skickas iväg alla på én gång? Det är väl därför dom finns liksom..

ivar, skippa progres bar'en, bara en onödig designer idé.
Bättre skriva typ "Mailen kommer skickas ut under dom närmsta 20 minuterna" eller så, istället för att tvinga besökeran sita titta på en laddningsgrej som han egentligen inte har det större intresset utav..

  • Medlem
  • Stockholm
  • 2004-01-19 22:25

Tänker köra vidare på mail() men det var intressant att höra Samuel.

Johan, tror du(ni?) missförstod vad jag sökte progressbaren till.. den ska vara när sidan laddar .. inte att visa att "utskick av mail pågår.. snart klart"
Köningen kommer ju sendmail sköta själv... jag fick bara höra att det kan ta ca 30sec att ladda in en sida där mail()'s $to består av några hundra adresser.

Men ok, jag struntar i progressbaren och skriver bara att man inte ska stänga fönstret förräns den har laddat in färdigt, annars är det risk att inte alla mails blivit skickade?

Alltså. om jag använder mail() och skriver in att $to ska innehålla flera hundra adresser... hur kan jag skriva ut något i stil med "mailar ..." och sen typ " ... ... ..." , dvs 3punkter ända fram tills alla blivit skickade. går det verkligen inte??

  • Medlem
  • Stockholm
  • 2004-01-20 00:04

Kolla här Ivar:

http://se.php.net/manual/en/function.flush.php

Tänk på att många webbläsare kräver att ett visst antal tecken skickats från servern innan de börjar generera sidan. Därav alla dummy-mellanslag i scriptet som finns under länken ovan.

Det är ju egentligen lite hopplöst att göra såna här saker med http, men man kan ju försöka...

  • Medlem
  • Stockholm
  • 2004-01-20 00:07

Trevligt trevligt men det verkar som koden för progress-bar'en bara är slö och sinkar ner sidan...

Tror jag ska strunta i progress-bar tillsvidare....

mvh
Ivar

  • Oregistrerad
  • 2004-01-20 00:18

Slöar ner och slöar ner, det är i första hand anropen till mail() som tar tid..

$spaces = str_repeat(" ", 100);
$addresses = array("a@a.a", "b@b.b", "c@c.c");

echo "Sending mail ";

foreach ($a in $addresses)
{
  mail($a, $subject, $message);
  echo "..." . $spaces;
  flush();
}

echo "\nAll mails sent.";

Jag gjorde en lösning på problemet en gång...

Fast då handlade det om kundlistor med 70.000+ kunder som skulle laddas upp och behandlas. Detta tog tid - lång tid. Så lång tid att jag valde att köra det som en bakgrundsprocess med exec-funktionen, om jag inte minns namnet fel.

I mitt skript la jag sedan en funktion som var tionde rad eller så uppdaterade en text-fil med aktuell rad (samt antal rader totalt).

Webbsidan som kickade igång textfilen fick en autorefreash på en sekund och läste in antal rader av totalt antal och skrev ut procent. Gick hyffsat snabbt och fyllde sin funktion

Citat:

Skrevs ursprungligen av Fredrik Lange
Slöar ner och slöar ner, det är i första hand anropen till mail() som tar tid..

$spaces = str_repeat(" ", 100);
$addresses = array("a@a.a", "b@b.b", "c@c.c");

echo "Sending mail ";

foreach ($a in $addresses)
{
  mail($a, $subject, $message);
  echo "..." . $spaces;
  flush();
}

echo "\nAll mails sent.";

Aha... då lärde jag mig något nytt! Inte för att jag lär använda mail() ändå, tycker den ger för dålig kontroll över vilka headers som ska skickas. Alltid trevligt att kunna bestämma content-type, content-transfer-encoding, etc... vill inte bara kunna skicka många mail, de ska vara fina och utan skräptecken också

  • Medlem
  • Stockholm
  • 2004-01-20 09:19
Citat:

Skrevs ursprungligen av Samuel K
Aha... då lärde jag mig något nytt! Inte för att jag lär använda mail() ändå, tycker den ger för dålig kontroll över vilka headers som ska skickas. Alltid trevligt att kunna bestämma content-type, content-transfer-encoding, etc... vill inte bara kunna skicka många mail, de ska vara fina och utan skräptecken också

Menar du att det är otydligt eller att det inte skulle gå?
För visst sjutton går det bra att skicka ett html-mail och/eller bifoga en eller flera filer också för den delen.
http://www.zend.com/zend/spotlight/sendmimeemailpart1.php
Länken är en liten tutorial.

Fredrik Lange.
Din metod gör ju att man anropar mail() 400ggr om det är 400st email-adresser i databasen. Är det inte bättre att anropa mail() en endaste gång och där skriva in alla mottagarna?
Men din metod gör det istället möjligt att skriva ut hur många procent som är färdigt! Det är inte alls tokigt

Jag håller mig jämt borta från javascript men kanske skulle göra ett undantag i värsta fall och köra din metod Fredrik tillsammans med ett java-script som firrar en progress-bar.

/ivar

Citat:

Skrevs ursprungligen av ivar
Menar du att det är otydligt eller att det inte skulle gå?
För visst sjutton går det bra att skicka ett html-mail och/eller bifoga en eller flera filer också för den delen.
http://www.zend.com/zend/spotlight/sendmimeemailpart1.php
Länken är en liten tutorial.

Jo, jag vet ju att det går precis lika bra att göra med mail()-funktionen direkt också, men jag tycker att implementationen blir lite knölig. Jag brukar i stället använda mig av en egenhändigt hoptotad smtp-klass som sköter den biten åt mig, men det är mest bara för att jag personligen tycker att den lösningen känns mer estetiskt tilltalande.

  • Medlem
  • Stockholm
  • 2004-01-20 09:53

Men då hänger jag inte riktigt med...
du skrev "Inte för att jag lär använda mail() ändå, tycker den ger för dålig kontroll över vilka headers som ska skickas. "

Men du menar alltså att du visst använder mail() och headers fast du anropar inte mail() själv utan du går via en shysst klass som är mer estetiskt tilltalande? (vilket jag helt och hållet förstår, har varit inne på den vägen själv).

Men borde jag ha ångest över att jag väljer att fortsätta arbeta med mail() för utskick av några hundra brev? Det är ett nyhetsbrev alltså och vill helst att allt ska fungera felfritt (mitt första lite större jobb)

  • Medlem
  • Stockholm
  • 2004-01-20 11:05

Jag tycker inte du ska ha ångest.

Det går som sagt att lägga in headers i mail() också. Här är en wrapper-funktion jag brukar använda, ursprungligen från något forum el dyl, men modifierad av mig.

function send_mail(
  $myname, $myemail, $contactname, $contactemail, $subject, $message
) { 

  $headers = "MIME-Version: 1.0\r\n"; 
  $headers .= "Content-type: text/plain; charset=iso-8859-1\r\n"; 
  $headers .= "X-Priority: 1\r\n"; 
  $headers .= "X-MSMail-Priority: Normal\r\n"; 
  $headers .= "X-Mailer: php\r\n"; 
  $headers .= "From: \"".$myname."\" <".$myemail.">\r\n"; 
  $headers .= "Reply-to: \"".$myname."\" <".$myemail.">\r\n"; 
  $headers .= "Return-path: \"".$myname."\" <".$myemail.">\r\n"; 

  return(
    mail("\"".$contactname."\" <".$contactemail.">", $subject, $message, $headers)
  ); 

}

Jag har testat att skicka upp till ca 100 adresser med mail() och det funkar men den tuggar igenom adresserna lite slött kanske.

Ändrade formatering

  • Medlem
  • Stockholm
  • 2004-01-20 11:12

Då kommer frågan.

Vad innebär slött? tar det 30sec att skicka 100brev?
Kör du en endaste mail() och skickar alla 100 direkt inuti den? Eller kör du 100st mail() med en mottagare i varje?

Läste här på 99mac att någon skrev in ca 4000st mottagare i mail() och att det DÅ hade tagit ca 30sec att ladda in sidan... men 100st borde ju inte ta lång tid alls...

misstänker att du kör 100st mail() då va?

  • Medlem
  • Stockholm
  • 2004-01-20 11:16

Ja, jag körde en loop med en adress i varje mail(). Jag tror att det tog lite onaturligt lång tid för mig p g a att sendmail inte var helt rätt inställt (för mail() använder sendmail, men kanske andra MTAs också). Tog kanske nån minut totalt.

Citat:

Skrevs ursprungligen av ivar
Men då hänger jag inte riktigt med...
du skrev "Inte för att jag lär använda mail() ändå, tycker den ger för dålig kontroll över vilka headers som ska skickas. "

Men du menar alltså att du visst använder mail() och headers fast du anropar inte mail() själv utan du går via en shysst klass som är mer estetiskt tilltalande? (vilket jag helt och hållet förstår, har varit inne på den vägen själv).

Nästan! Enda grejen är att mail() aldrig anropas, utan att min klass själv öppnar port 25 och pratar smtp med servern.

Citat:

Men borde jag ha ångest över att jag väljer att fortsätta arbeta med mail() för utskick av några hundra brev? Det är ett nyhetsbrev alltså och vill helst att allt ska fungera felfritt (mitt första lite större jobb)

Nej, absolut inte. Det kommer att fungera utmärkt även om du använder mail().

1
Bevaka tråden