Avatar billede Slettet bruger
18. november 2003 - 15:45 Der er 19 kommentarer og
1 løsning

Udskrive til skærm imens løkke kører

Hej!

Hvis jeg har en løkke hvor jeg gerne vil udskrive til skærmen imens løkken kører, f.eks. skrive

"10 ud af 1000 mails sendt"

"20 ud af 1000 mails sendt"

osv, hvordan gør jeg så det?

Her er et simpelt eksempel på dne løkke jeg forestiller mig:

for ($i = 0; $i <= 1000;$i++) {

$from = "mj@partout.dk";
$to_mail = "test@ost.$i";
$to_name = "test@ost.$i";
$subject = "SMTP Test nummer $i";
$body = "Besked nummer $i";

$smtp->email($from, $to_mail, $to_name, $header, $subject, $body);
}
Avatar billede jakoba Nybegynder
18. november 2003 - 16:06 #1
med flush efter hver linie http://dk.php.net/flush
og ingen tabeller på siden skulle det være muligt at få linierne vist efterhånden som dit script outputter dem.

Det skulle dog ikke undre mig om der er timeouts i browser og/eller php det wil komme ivejen hvis din mail-afsending tager for lang tid.

mvh JakobA
Avatar billede Slettet bruger
18. november 2003 - 16:07 #2
Hmm...jeg troede at smtp kald lå udenfor det PHP timeout? Men hvis man skriver ud så er man måske tilbage til samme "problem" med timeout?
Avatar billede doomstone-dk- Nybegynder
18. november 2003 - 16:10 #3
for ($i = 0; $i <= 1000;$i++) { <-- vil sende 1001 mails

for ($i = 0; $i < 1000;$i++) { <-- sådan
Avatar billede Slettet bruger
18. november 2003 - 16:11 #4
doomstone> Øhhh?

Det har jo ikke noget med mit spm. at gøre?
Avatar billede tipsen Nybegynder
18. november 2003 - 16:18 #5
Du kan bruge flush() som jakoba foreslår, men du kan alligevel ikke være sikker på, at det bliver vist i browseren, da eks. IE vistnok kun begynder at vise/behnadle indhold efter den har modtaget et bestemt antal karakterer - derudover mener jeg også dit output kan risikere at blive "buffered" andre steder i kæden...

Men udover det sikrer din direkte forbindelse til smtp-serveren dig nok den hurtigst mulige afsendelse af dine mails, men dit php-script er stadig underlagt den øvre tidsgrænse der er for udførelse af scripts - men det er muligt, at du manuelt kan indstille tidsgrænsen eller evt. sende dine mails i flere portioner - sidstnævnte kan også skåne dine/andres servere!

Mvh Tipsen
Avatar billede jakoba Nybegynder
18. november 2003 - 16:32 #6
en anden mulighed kunne være at genbruge koden fra en chat til at hente og genhente en fil du fylder flere linier på efterhånden. Bare husk at lukke filen igen efter hver gang du appender en linie.
Avatar billede Slettet bruger
18. november 2003 - 17:07 #7
Kunne man gøre sådan her (se bort fra output fejl, kan vel ordnes med ob_flush() )

<?

$antal_mails = 1000;

if($_REQUEST['naaet_hvortil'] == $antal_mails) {
echo "færdig";
} else {

if($_REQUEST['naaet_hvortil'] != "") {
$i = $_REQUEST['naaet_hvortil'];
} else {
$i = 1;
}

while ($i <= $antal_mails) {

if($i == 1) {
$header =  "Send e-mails $i - " . ($i+9) . "<br>";
echo $header;
} else if($i == 1000) {
echo "færdig";
} else {

if($i % 10 == 0) {
$header =  "Send e-mails " . ($i+1) . " - " . ($i+10) . "<br>";
echo $header;
$hvorhen = "mailtest2.php?naaet_hvortil=" . $i;
header("location:$hvorhen");

}

}

$i++;

}

}

?>
Avatar billede jakoba Nybegynder
18. november 2003 - 17:13 #8
Nej det vil ikke du. med
  header( "location: xxx" );
afbryder du det script du er igang med. du kan ikke bruge den 2 gange.
Avatar billede Slettet bruger
18. november 2003 - 17:30 #9
Hvad kan jeg ikke bruge til 2 gange?
Avatar billede jakoba Nybegynder
18. november 2003 - 17:40 #10
du kan ikke bruge sætningen  header( "location: $hvorhen");  2 gange.  dine headers bliver ikke sendt efterhånden som du genererer dem men i en stor klump når dit script enten slutter, eller også begynder at generere output.

det er også (delvis) derfor php manualen anbefaler en
    exit();
efter  header( "location: $hvorhen");  for at være sikker på scriptet slutter lige der.  http://dk.php.net/header
Avatar billede Slettet bruger
18. november 2003 - 18:07 #11
Hmmm...kan jeg så viderestille med JavaScript i stedet?
Avatar billede Slettet bruger
18. november 2003 - 18:13 #12
Altså..ovennævnte script udskriver det her til min skærm:

Send e-mails 1 - 10
Send e-mails 11 - 20
Send e-mails 21 - 30
Send e-mails 31 - 40
Send e-mails 41 - 50
Send e-mails 51 - 60
Send e-mails 61 - 70
Send e-mails 71 - 80
Send e-mails 81 - 90
Send e-mails 91 - 100
Send e-mails 101 - 110
Send e-mails 111 - 120
Send e-mails 121 - 130
Send e-mails 131 - 140
Send e-mails 141 - 150
Send e-mails 151 - 160
Send e-mails 161 - 170
Send e-mails 171 - 180
Send e-mails 181 - 190
Send e-mails 191 - 200
Send e-mails 201 - 210
Send e-mails 211 - 220
Send e-mails 221 - 230
Send e-mails 231 - 240
Send e-mails 241 - 250
Send e-mails 251 - 260
Send e-mails 261 - 270
Send e-mails 271 - 280
Send e-mails 281 - 290
Send e-mails 291 - 300
Send e-mails 301 - 310
Send e-mails 311 - 320
Send e-mails 321 - 330
Send e-mails 331 - 340
Send e-mails 341 - 350
Send e-mails 351 - 360
Send e-mails 361 - 370
Send e-mails 371 - 380
Send e-mails 381 - 390
Send e-mails 391 - 400
Send e-mails 401 - 410
Send e-mails 411 - 420
Send e-mails 421 - 430
Send e-mails 431 - 440
Send e-mails 441 - 450
Send e-mails 451 - 460
Send e-mails 461 - 470
Send e-mails 471 - 480
Send e-mails 481 - 490
Send e-mails 491 - 500
Send e-mails 501 - 510
Send e-mails 511 - 520
Send e-mails 521 - 530
Send e-mails 531 - 540
Send e-mails 541 - 550
Send e-mails 551 - 560
Send e-mails 561 - 570
Send e-mails 571 - 580
Send e-mails 581 - 590
Send e-mails 591 - 600
Send e-mails 601 - 610
Send e-mails 611 - 620
Send e-mails 621 - 630
Send e-mails 631 - 640
Send e-mails 641 - 650
Send e-mails 651 - 660
Send e-mails 661 - 670
Send e-mails 671 - 680
Send e-mails 681 - 690
Send e-mails 691 - 700
Send e-mails 701 - 710
Send e-mails 711 - 720
Send e-mails 721 - 730
Send e-mails 731 - 740
Send e-mails 741 - 750
Send e-mails 751 - 760
Send e-mails 761 - 770
Send e-mails 771 - 780
Send e-mails 781 - 790
Send e-mails 791 - 800
Send e-mails 801 - 810
Send e-mails 811 - 820
Send e-mails 821 - 830
Send e-mails 831 - 840
Send e-mails 841 - 850
Send e-mails 851 - 860
Send e-mails 861 - 870
Send e-mails 871 - 880
Send e-mails 881 - 890
Send e-mails 891 - 900
Send e-mails 901 - 910
Send e-mails 911 - 920
Send e-mails 921 - 930
Send e-mails 931 - 940
Send e-mails 941 - 950
Send e-mails 951 - 960
Send e-mails 961 - 970
Send e-mails 971 - 980
Send e-mails 981 - 990
Send e-mails 991 - 1000
færdig
Avatar billede jakoba Nybegynder
18. november 2003 - 18:17 #13
det med  header("location ... ?
så må der være noget jeg har misforstået.
Avatar billede Slettet bruger
18. november 2003 - 18:19 #14
Mjae, altså den gør det jo ikke løbende som jeg gerne vil have den til, men først til sidst.
Avatar billede tipsen Nybegynder
18. november 2003 - 18:40 #15
jakoba: Det med header() er da ikke så mærkeligt - den bliver jo kaldt én gang i scriptet - og så kalder den scriptet selv med nogle nye inputparametre...
Avatar billede jakoba Nybegynder
18. november 2003 - 19:21 #16
nixen tipsen. Det er blot mangelen på indrykninger der får dig til at overse while løkken hwor i går fra 0 til 1000.
Avatar billede tipsen Nybegynder
18. november 2003 - 20:07 #17
sorry - det kan jeg godt se nu - det betyder vel bare, at header-kaldet skal efterfølges af exit - så kan man være sikker på det altid fungerer?
Avatar billede Slettet bruger
18. november 2003 - 20:48 #18
Jeg har funderet lidt over det, kan kan køre det her, og så stadig nøjes med at lave et kald til åbning af SMTP serveren, og så sende demud løbende?

<?
$antal_emails = 200; //Antal e-mails der samlet skal sendes ud
$antal_ad_gangen = 5; //Hvor mange skal der sendes pr SMTP kald

if(isset($_REQUEST['side'])) {
$start = $_REQUEST['side'];
} else {
$start = 0;
}

echo "(Udsender e-mails " . ($start - ($antal_ad_gangen-1)) . " - " . $start . ")";

flush(); //Har den overhovedet noget formål her?

if($start < $antal_emails) {
?>
<script type="text/javascript">
location.href='test.php?side=<? echo ($start+$antal_ad_gangen);?>';
</script>
<?
} else {
echo "<br>færdig";
}
?>
Avatar billede Slettet bruger
18. november 2003 - 20:56 #19
Den her er lige lidt mere gennemskuelig når den køres:

<?

sleep(1);

$antal_emails = 200; //Antal e-mails der samlet skal sendes ud
$antal_ad_gangen = 5; //Hvor mange skal der sendes pr SMTP kald

if(isset($_REQUEST['side'])) {
$start = $_REQUEST['side'];
} else {
$start = 5;
}

/// 50 / 200 = 0.35 og så * med 100


echo "Samlet antal e-mails der skal sendes: " . $antal_emails . "<br>";

echo "(Udsender e-mails " . ($start - ($antal_ad_gangen-1)) . " - " . $start . ")<br>";

echo round(($start / $antal_emails * 100)) . " % færdig";

flush(); //Har den overhovedet noget formål her?

if($start < $antal_emails) {
?>
<script type="text/javascript">
location.href='test.php?side=<? echo ($start+$antal_ad_gangen);?>';
</script>
<?
} else {
echo "<br>Afsendelse lykkedes";
}
?>
Avatar billede Slettet bruger
23. november 2003 - 22:58 #20
Ja nu har jeg testet lidt og sendt mails ud til 5000 pseudomodtagere med ovenstående metode.

Min erfaring er at serveren sagtens kan følge med selvom jeg sender 1000 ad gangen, men for en sikkerheds skyld har jeg sat begrænsning på det endelige script til max 500 mails ad gangen.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester