[php] php maakte fouten :(

Pagina: 1
Acties:
  • 597 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • BierPul
  • Registratie: Juni 2001
  • Laatst online: 12-09 14:07

BierPul

2 koffie graag

Topicstarter
Ik verstuur via een php applicatie zo'n 400.000 gepersonaliseerde mails.

Ik trek elke entry uit de database door een loop heen waar een aantal functies worden uitgevoerd als deze

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    $naam = stripslashes($array[2]);
                        $email_to = stripslashes($array[4]);
                        $postcode = stripslashes($array[6]);
                        $woonplaats = stripslashes($array[7]);
                        
                
                
                            if(empty($naam) && empty($postcode)) {
                                $subject = $subject_onpers;
                                $html = $onpers_html;
                            } else {
                                $subject = $subject_perso;
                                $html = $pers_html;
                            }
$html = str_replace("[voorvoegsel]",$voorvoeg,$html);
                                $html = str_replace("[geslacht]",$geslacht,$html);
                                $html = str_replace("[naam]",$naam,$html);
                                $html = str_replace("[email]",$email_to,$html);
                                $html = str_replace("[postcode]",$postcode,$html);
                                $html = str_replace("[woonplaats]",$woonplaats,$html);
                                $html = str_replace("[id]",$id,$html);


Bij 'kleine' hoeveelheden ging dit altijd goed.

Echter zijn er vannacht vreemde dingen gebeurt terwijl er niets aan de code is veranderd :/

Hij is fouten gaan maken bij

PHP:
1
if(empty($naam) && empty($postcode)) {


Hij heeft het een aantal keer als true gezien terwijl hij dat niet zo moest zijn, hebben jullie tips om dit voortaan te voorkomen :?

Ja man


Acties:
  • 0 Henk 'm!

  • Blue_Thunder_NL
  • Registratie: Februari 2000
  • Laatst online: 15-09 20:31
Hmmm, ik vind empty() altijd maar een eng statement....

uit de manual:

code:
1
"", 0, "0", NULL, FALSE, array(), var $var;, and objects with empty properties, are all considered empty


Dus misschien als iemand nul ('0') ingevuld heeft als naam ofzo, dan ziet ie het dus wel als empty.

Kan je in de verzonden mailtjes niet zien welke vars dan zgn. empty waren?

[ Voor 21% gewijzigd door Blue_Thunder_NL op 23-10-2003 16:36 ]

Ik wil zoveel, maar ik doe zo weinig


Acties:
  • 0 Henk 'm!

Verwijderd

Misschien iets te maken met globals?
zoals $_POST en $_GET ?
database leeg???


weet ik veel, misschien ben je hier wel iets mee.
Doorlees ook eens de FAQ :)

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Ik heb zelf wel meegemaakt dat ik na veel iteraties zomaar ineens geen gegevens meer blijk te hebben in een array ofzo, terwijl die er alle iteraties ervoor wel inzaten.

Op een of andere manier corrumpeert ie dan het geheugen, maar op een vrijwel identiek ander systeem kon ik dit al niet meer reproduceren.

Acties:
  • 0 Henk 'm!

  • Xboty
  • Registratie: September 2003
  • Laatst online: 04-09 13:18
ACM schreef op 23 oktober 2003 @ 16:39:
Ik heb zelf wel meegemaakt dat ik na veel iteraties zomaar ineens geen gegevens meer blijk te hebben in een array ofzo, terwijl die er alle iteraties ervoor wel inzaten.
ook weleens gehad

Acties:
  • 0 Henk 'm!

  • Roa
  • Registratie: December 2002
  • Laatst online: 03-07-2024

Roa

gebruik maken van

PHP:
1
if(name == ''){}

??

Research is what I'm doing when I don't know what I'm doing.


Acties:
  • 0 Henk 'm!

Verwijderd

Roa schreef op 23 October 2003 @ 16:47:
gebruik maken van

PHP:
1
if(name == ''){}

??
Dat is gewoonweg hetzelfde als:
PHP:
1
if(empty($name)) // showerror();

Acties:
  • 0 Henk 'm!

Verwijderd

bReEzAh dat is dus niet zo, zie ook de post van Blue_Thunder_NL hier een eindje verder naar boven...
empty() retourneert bij meer dan alleen '' true, dus de statements waarvan jij denkt dat die gelijk zijn, zijn dat in feite niet, zie ook de php manual: www.php.net/empty

Acties:
  • 0 Henk 'm!

  • BierPul
  • Registratie: Juni 2001
  • Laatst online: 12-09 14:07

BierPul

2 koffie graag

Topicstarter
Verwijderd schreef op 23 oktober 2003 @ 16:35:
Misschien iets te maken met globals?
zoals $_POST en $_GET ?
database leeg???


weet ik veel, misschien ben je hier wel iets mee.
Doorlees ook eens de FAQ :)
De FAQ staat op mn handpalm :P

Daar heeft het niets mee te maken gehad het gaat namelijk 370.000 keer wel goed en dan ineens niet :(

Ik gok het op de mening van ACM :)

Ja man


Acties:
  • 0 Henk 'm!

  • megamuch
  • Registratie: Februari 2001
  • Laatst online: 08-12-2024

megamuch

Tring Tring!

mag ik vragen waarom je php gebruikt om mail te verzenden. Daar zijn toch betere cq efficientere methoden voor bij deze getallen ?

Verstand van Voip? Ik heb een leuke baan voor je!


Acties:
  • 0 Henk 'm!

  • sirdupre
  • Registratie: Maart 2002
  • Laatst online: 27-04 09:36
Wat voor soort mails verstuur jij eigenlijk die bij 400.000 personen gewenst zijn??

Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

SirDupre schreef op 23 October 2003 @ 23:22:
Wat voor soort mails verstuur jij eigenlijk die bij 400.000 personen gewenst zijn??
doet het er voor dit verhaal toe?
kan toch gewoon een nieuwsbrief zijn :)
megamuch schreef op 23 October 2003 @ 23:14:
mag ik vragen waarom je php gebruikt om mail te verzenden. Daar zijn toch betere cq efficientere methoden voor bij deze getallen ?
waarom zou een andere (script) taal beter zijn om mails te sturen?

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

BierPul schreef op 23 October 2003 @ 17:08:
Ik gok het op de mening van ACM :)

Dat kan je vrij eenvoudig testen denk ik :)

Haal de mail-functie er even uit (vinden je klanten niet leuk ;) ) en laat het draaien, zodra er een 'fout' optreedt spuug je wat data uit, zoals die naam en het id.

A.d.h.v. het id kan je dan checken of de naam idd leeg is of niet, etc.

Als je echter een segfault krijgt is het script waarsch wel redelijk ok.
(evt kan je je php opstarten in gdb, dmv:
gdb php
set args /pad/naar/je/script
run

dan duurt het wel langer, maar zie je er ook iets meer aan.
Aan het eind kan je dan nog 'bt' intikken om een command-trace te krijgen en dmv quit stop je ;)
)

[ Voor 28% gewijzigd door ACM op 23-10-2003 23:36 ]


Acties:
  • 0 Henk 'm!

Verwijderd

waarom niet !isset() ipv empty()

Acties:
  • 0 Henk 'm!

Verwijderd

omdat een array element wel ge-set is, maar empty kan zijn.
zelfde met een $_GET/$_POST variabele uit een form...

Acties:
  • 0 Henk 'm!

  • BierPul
  • Registratie: Juni 2001
  • Laatst online: 12-09 14:07

BierPul

2 koffie graag

Topicstarter
SirDupre schreef op 23 October 2003 @ 23:22
Wat voor soort mails verstuur jij eigenlijk die bij 400.000 personen gewenst zijn??
pr0n natuurlijk :+


Maar ff back ontopic :)

Ik ben inderdaad ff wat gaan testen, maar helaas kreeg ik het niet reproduceerbaar.

Ik heb de mail functie eruit getrokken en inplaats daarvan de waarden in de database gezet en na een aantal steekproeven denk ik wel dat dit redelijk save is.

Ik denk dat het is gekomen door een algemeen te hoge load de combinatie van
-files serven
- mails opmaken (waarden berekenen)via PHP
- versturen via php en mail server draaien.

is hem denk ik teveel geworden.

Ik ga voortaaan mn mails pre-parsed in een temp tabel zetten zodat ik hem een hoop rekenwerk kan besparen door gewoon alles al opgemaakt direct aan de mail functie aan te kunnen bieden :)

[ Voor 16% gewijzigd door BierPul op 24-10-2003 09:36 ]

Ja man


Acties:
  • 0 Henk 'm!

  • demonite
  • Registratie: April 2000
  • Laatst online: 09-09 20:48

demonite

the way is up

Ik zou het maar erg vreemd vinden als dat het geval was.
Ook onder hoge load geld nog steeds dat 1==1.

Uiteraard is het goed om je scripts aan te passen zodat ze minder load genereren, maar volgens mij verminder je daardoor niet de kans dat deze fout nog een keer optreed.

Hoe ben je er achter gekomen dat het op dat punt fout is gegaan ? Misschien is het handig om een errorlogging mechanisme in te bouwen die dan allerlei gegevens opslaat op het moment dat het fout gaat.

Acties:
  • 0 Henk 'm!

  • BierPul
  • Registratie: Juni 2001
  • Laatst online: 12-09 14:07

BierPul

2 koffie graag

Topicstarter
Ben ik met je eens.

Maar ik vraag me af hoe ik deze error af moet handelen als PHP denkt dat ie het goed doet :?

Met de code is immers niks mis anders had ie het niet zovaak wel goed gedaan :)

Ik ben erachter gekomen omdat er een vreemde waarde aan het rond zwerven was in de mails die bij record 365.000 opdook op de een of andere mannier bleef deze waarde in het geheugen hangen of whatever :/

Moet eerlijk zeggen dat het me ook een compleet raadsel is :)

Ja man


Acties:
  • 0 Henk 'm!

  • Mithrandir
  • Registratie: Januari 2001
  • Laatst online: 23:25
Wat je ook kunt doen is een script starten per 10000(0) emails. Of eens per 10.000 emails alles uit de database plukken in plaats van alles in een keer (of deed je dat al?)

Verbouwing


Acties:
  • 0 Henk 'm!

  • slm
  • Registratie: Januari 2003
  • Laatst online: 12-11-2023

slm

php gebruiken om 100.000+ mails te versturen roept bij mij alleen maar enge herinneringen op. Niet gebruiken daarvoor zeg ik dan ook meer uit ervaring dan uit wijsheid. Je kan beter perl gebruiken en nog beter gewoon een (niet web-based of webscript-based) massmailer app. Kost misschien een paar centen, maar bij zulke massmailings moet je zo min mogelijk risico willen lopen. Als het misgaat, gaat het meestal erg mis en krijgen (tien/honderd)duizenden mensen een verkeerd mailtje, wat ze allemaal -terecht- helemaal niet leuk vinden en jou weer gaan mailen dat er iets niet klopt. Imago van je bedrijf kan er vervolgens ook schade door ondervinden, alhoewel je imago met pr0n natuurlijk sowieso al minimaal is ;)

To study and not think is a waste. To think and not study is dangerous.


Acties:
  • 0 Henk 'm!

  • BierPul
  • Registratie: Juni 2001
  • Laatst online: 12-09 14:07

BierPul

2 koffie graag

Topicstarter
slm schreef op 25 oktober 2003 @ 05:38:
Imago van je bedrijf kan er vervolgens ook schade door ondervinden, alhoewel je imago met pr0n natuurlijk sowieso al minimaal is ;)
Hey tis wel heel goeie pr0n :P

Maar ik ga dus ff kijken naar wat alternatieven.

Ik zal PHP waarschijnlijk wel blijven gebruiken om het geheel op te maken en te plannen (daar heeft al best wat tijd in gezeten :( )

Maar een oplossing in de een of andere vorm moeten zoeken die de mail uit de db haald en verstuurd , tips zijn altijd welkom ;)

[ Voor 38% gewijzigd door BierPul op 25-10-2003 08:53 ]

Ja man


Acties:
  • 0 Henk 'm!

  • BierPul
  • Registratie: Juni 2001
  • Laatst online: 12-09 14:07

BierPul

2 koffie graag

Topicstarter
Toch wil ik et topic nog ff schoppen.

Vandaag kreeg ik echt een grappige (:() mail binnen.

Deze mail had in het subject de postcode van record 365.000 maar het email adres in de unsubscribe link van record nummer 1.

Ik vraag me toch echt af hoe die dat voor elkaar heeft gekregen.

Kan het zijn dat qmail de messages door elkaar heeft gehaald een que van 400.000 is natuurlijk niet niks.

Ik plaats voor de zekerheid ook al mn code ik heb het zelf 3 keer nageken en geprobeerd te reproduceren (geen mail aanroepen maar de vars in de database opnemen leverde alleen een zware database op maar geen dingen zoals deze)

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
<?php
    set_time_limit(0);
    $nu = time();
    $dag = date("d", $nu);
    $maand = date("m", $nu);
    $jaar = date("Y", $nu);

    
        function send_mailing($aantal, $groepen, $pers2_html, $onpers_html, $pers_html, $subject_onpers, $afzender, $afzendernaam, $text, $nwsl_id, $subject_perso) { //2
                $ontvanger_query = mysql_query("SELECT 
                                                ml_id,
                                                ml_voorvoeg,
                                                ml_naam,
                                                ml_titel,
                                                ml_email,
                                                pers2,
                                                ml_postcode,
                                                ml_woonplaats
                                            FROM
                                                tbl_mailinglist
                                            WHERE 
                                                ml_reject_nwsletter = 0
                                            AND
                                                ml_nwsl_verzonden = 0
                                            AND
                                                RFC_ok = 0 LIMIT ".$aantal);
                
                if((int)mysql_num_rows($ontvanger_query) > 0) { //3
                    WHILE($array = mysql_fetch_row($ontvanger_query)){ //4
                        $id = $array[0];
                        $voorvoeg = stripslashes($array[1]);
                        $naam = stripslashes($array[2]);
                        $email_to = stripslashes($array[4]);
                        $postcode = stripslashes($array[6]);
                        $woonplaats = stripslashes($array[7]);
                        
                        echo($subject);
                        echo( $subject_perso);
                
                            if(empty($naam) && empty($postcode)) {
                                $subject = $subject_onpers;
                                $html = $onpers_html;
                            } else {
                                $subject = $subject_perso;
                                $html = $pers_html;
                            }
                    
    
                            /*een switch om het geslacht weer te geven*/
                            switch($array[3]) {
                                case '0':
                                    $geslacht = "heer of mevrouw";
                                break;

                                case '01':
                                    $geslacht = "heer";
                                break;

                                case '02':
                                    $geslacht = "mevrouw";
                                break;

                                case '03':
                                    $geslacht = "heer, mevrouw";
                                break;

                                case '04':
                                    $geslacht = "familie";
                                break;

                                case '05':
                                    $geslacht = "firma";
                                break;

                                case '06':
                                    $geslacht = "heer e/o mevrouw";
                                break;

                                case '07':
                                    $geslacht = "stichting";
                                break;

                                case '08':
                                    $geslacht = "relatie";
                                break;

                                case '09':
                                    $geslacht = "erfgenamen van";
                                break;

                                default:
                                    $geslacht = "heer of mevrouw";
                                break;
                            }

                                $html = str_replace("[voorvoegsel]",$voorvoeg,$html);
                                $html = str_replace("[geslacht]",$geslacht,$html);
                                $html = str_replace("[naam]",$naam,$html);
                                $html = str_replace("[email]",$email_to,$html);
                                $html = str_replace("[postcode]",$postcode,$html);
                                $html = str_replace("[woonplaats]",$woonplaats,$html);
                                $html = str_replace("[id]",$id,$html);
                                
                                $text = str_replace("[voorvoegsel]",$voorvoeg,$text);
                                $text = str_replace("[geslacht]",$geslacht,$text);
                                $text = str_replace("[naam]",$naam,$text);
                                $text = str_replace("[email]",$email_to,$text);
                                $text = str_replace("[postcode]",$postcode,$text);
                                $text = str_replace("[woonplaats]",$woonplaats,$text);
                                $text = str_replace("[id]",$id,$text);
                                
                                $subject = str_replace("[postcode]",$postcode,$subject);

                                
                                $boundary = "This_is_the_boundary_hip_ho";

                                $headers = "From: $afzendernaam <$afzender>\n";
                                $headers .= "Reply-To: $afzender\n"; 
                                $headers .= "Subject: $subject\n";
                                $headers .= "MIME-Version: 1.0\n";
                                $headers .= "Content-Type: multipart/alternative;\n";
                                $headers .= "\tboundary=\"$boundary\"\n";
                                $headers .= "Content-Transfer-Encoding: 7bit\n";
                                $message = "--$boundary\n";
                                $message .= "Content-Type: text/plain; charset=us-ascii\n";
                                $message .= "Content-Transfer-Encoding: 7bit\n";
                                $message .= "\n";
                                $message .= "$text\n";
                                $message .= "\n";
                                $message .= "--$boundary\n";
                                $message .= "Content-Type: text/html; charset=us-ascii\n";
                                $message .= "Content-Transfer-Encoding: 7bit\n";
                                $message .= "\n";
                                $message .= "$html\n";
                                $message .= "\n";
                                $message .= "--$boundary--";
                                
                                if(!empty($html)) {
                                    /*verstuur de mail*/
                                    mail($email_to, $subject, $message, $headers);
                                
                                    /*vink aan dat deze persoon de mail heeft ontvangen*/       
                                    mysql_query("update tbl_mailinglist SET ml_nwsl_verzonden = 1 WHERE ml_id = '$id'");
                                    echo("woei");
                                } else {
                                    mail("michael@postcodeloterij.nl", "error in nieuwsbrief", "var html is leeg :(");
                                }
                    } //4
                    mysql_free_result($ontvanger_query);
                    flush();
                    send_mailing(5000, $groepen, $pers2_html, $onpers_html, $pers_html, $subject, $afzender, $afzendernaam, $text, $nwsl_id, $subject_perso);

                } else {    mysql_query("update tbl_nieuwsbrief SET nwsbrf_verzonden = 2 WHERE nwsbrf_id = '$nwsl_id'");    } //2
        } /*einde functie*/



        //Vast stellen of er uberhaupt een mail verstuurd moet worden vandaag, daarom eerst datum van vandaag maken 


$newsl_query = mysql_query("SELECT  
                                    nwsbrf_onderwerp,
                                    nwsbrf_perso,
                                    nwsbrf_onperso,
                                    nwsbrf_groepen,
                                    nwsbrf_id,
                                    nwsbrf_perso2,
                                    nwsbrf_onderwerp_perso
                                    
                            FROM 
                                    tbl_nieuwsbrief 
                            WHERE 
                                    nwsbrf_verzonden = 1
                            AND
                                    MONTH(FROM_UNIXTIME(nwsbrf_datum))= $maand
                            AND 
                                    YEAR ( FROM_UNIXTIME(nwsbrf_datum) ) = $jaar
                            AND
                                    DAYOFMONTH( FROM_UNIXTIME(nwsbrf_datum)) = $dag"
                            ) or die (mysql_error());

if(mysql_num_rows($newsl_query) > 0) { //1
    
    /*Er is meer te doen dan alleen kijken we gaan nu de HTML opmaken */
    $newsl = mysql_fetch_row($newsl_query);

    /*dbase info voor versturen de groepen zijn ingedeeld in bitmasks*/
    $groepen = $newsl[3];
    $nwsl_id = $newsl[4];
    
    /*header info*/
    $subject_onpers = stripslashes($newsl[0]);
    $subject_perso = stripslashes($newsl[6]);
    $afzender = "bla@bla.nl";
    $afzendernaam = "woei";
    
    /*inhoud*/
    $text = "Geachte Nieuwsbrief-lezer,\r\nUw mailprogramma ondersteunt geen HTML.\r\nWilt u de Nieuwsbrief toch lezen, kopieer dan de volgende url naar de adresbalk in uw browser, 
of klik op de link:\r\nhttp://www.bla.nl/nieuwsbrief\r\r\nIndien u geen e-mail meer wilt ontvangen, ga dan naar het volgende adres http://dev01.bla.nl/nieuwsbrief/unsub_newsletter.php?mail=[email]&id=[id]";
    $pers_html = stripslashes($newsl[1]);
    $pers2_html = stripslashes($newsl[5]);
    $onpers_html = stripslashes($newsl[2]);

    send_mailing(5000, $groepen, $pers2_html, $onpers_html, $pers_html, $subject_onpers, $afzender, $afzendernaam, $text, $nwsl_id, $subject_perso);

} else {
    echo("Niks te versturen vandaag");
}


Misschien zien jullie iets geks :?

[ Voor 8% gewijzigd door BierPul op 27-10-2003 18:56 ]

Ja man

Pagina: 1