hilfdirselbst.ch
Facebook Twitter gamper-media
« « 1 2 » »  
jrandi
Beiträge: 794
7. Feb 2008, 16:06
Beitrag #1 von 18
Bewertung:
(3730 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

newsletter - mysql server has gone away


Hallo zusammen,

trotz vielen google-ergenissen immer noch keine lösung gefunden. . .

es geht um einen kleinen newsletter. ich erhalte zwar ein feedback für jedes der 250 mails, welche verschickt werden, am schluss heisst es dann aber Mysql server has gone away, statt "ok, alle mails versendet. . .".

der server erlaubt mir z.B. nicht folgende var zu verwenden ini_set('max_execution_time',500);

wollte nachfragen, wie ich das sonst lösen kann, in dem ich im script folgende Zeile einfüge ?
set-variable = max_allowed_packet = 16M;
(oder müsste man das in der PHP-InI machen - wozu ich jedoch nicht berechtigt bin. . .

eine function sleep() ? wobei da die DB wohl offen bleibt, also nützt dies auch nichts ? oder wo setzte ich diese ein ? nach compteur++ ?

Das dumme ist, ich kann nicht testen, ohne 250 empfänger zu belästigen. . .
Deshalb danke ich im voraus für Eure Hilfe !
____________________________________
das wichtigste aus dem script : si jamais :

$q = mysql_query("SELECT * FROM actualite_nl WHERE langue=\"fr\""); // requete LANGUE = FR

$compteur=1; // variable pour compter les mails

while ($r = mysql_fetch_array($q)) {
$e_mail = $r['email']; //prend l'email de la table
$link = "<a href=\"http://www.siavs.ch/index_actualite.php?action=delete_email_nl&email=" .$r['email']. "&id=" .$r['id']. "&langue=$langue\"><font face=\"arial\" size=\"2\">se désabonner</font></a><br />";
// envoi du mail HTML
$from = "From:news@siavs.ch\nMime-Version:";
$from .= " 1.0\nContent-Type: text/html; charset=ISO-8859-1\n";

$envoye = mail($e_mail,$titre,"$contenu <br />$link",$from);
echo'N° '.$compteur.' - '.$e_mail.' : envoyé avec succés!<br />';
$compteur++; // ajoute 1 à la variale du compteur
///////////////// jr . . .
}
if ($envoye) {
// update dans DB !! ensuite
$sql = "UPDATE actualite SET send_fr=\"oui\" WHERE id=\"$id_actualite\"";
$query = sql($sql);
// header ("location:index_actualite.php?langue=$langue");
echo "<br />ok - fin pour mails en français : <a href=\"index.php\">retourner au sommaire</a>";
}
else {. . . }
____________________

vielen dank und gruss
jurg

p.s. php5.2.x - apache server
(Dieser Beitrag wurde von jrandi am 7. Feb 2008, 16:07 geändert)
Top
 
X
randy S
Beiträge: 436
7. Feb 2008, 16:29
Beitrag #2 von 18
Beitrag ID: #335614
Bewertung:
(3721 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

newsletter - mysql server has gone away


Dir ist schon klar, dass die Var $envoye 250 mal überschrieben wird? Will sagen, die Mail wird verschickt und $envoye ist true, dann die nächste usw. Die letzte Mail gibt true oder false zurück und dann kommt erst die if-Abfrage

regards randy
als Antwort auf: [#335604] Top
 
jrandi
Beiträge: 794
7. Feb 2008, 16:34
Beitrag #3 von 18
Beitrag ID: #335616
Bewertung:
(3718 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

newsletter - mysql server has gone away


Hallo randy,

ja, das ist mir bewusst. soll auch so sein, denn das ECHO "OK..."; soll ja auch erst kommen, wenn alle mails verschickt sind.

gruss
jurg
als Antwort auf: [#335614] Top
 
randy S
Beiträge: 436
7. Feb 2008, 16:38
Beitrag #4 von 18
Beitrag ID: #335620
Bewertung:
(3714 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

newsletter - mysql server has gone away


Ok, dann sag doch mal, wann der MySQL-Server die Grätsche macht. weil das ist aus deinem Script jetzt nicht zu sehen.

regards randy
als Antwort auf: [#335616] Top
 
jrandi
Beiträge: 794
7. Feb 2008, 16:49
Beitrag #5 von 18
Beitrag ID: #335621
Bewertung:
(3712 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

newsletter - mysql server has gone away


die ausgabe erfolgt "glücklicherweise" erst am schluss. . . d.h. zuerst
. . .
. . .
N° 233 - info-AT-xyz.ch : envoyé avec succés! (erfolgreich versendet auf deutsch)
N° 234 - bw-AT-yxz.ch : envoyé avec succés!
N° 235 - jr-AT-randj.net : envoyé avec succés!

>> d.h. alle mails wurden verschickt, denn id 235 bin ich und somit der letzte eingetragene z.Z.
>> nachher kommt die 2. if else abfrage wo anstelle des "OK" diese meldung kommt :

signalé par function.php (function sql) - mais ce n'est pas la source d'erreur. . .
L'erreur suivante c'est produite
MySQL server has gone away

>> die ersten 2 zeilen sind mein persönlicher hinweis, wenn's nicht klappt, nicht von bedeutung und dann eben "Mysql server has gone. . ."

voilà so sieht das aus. wahrscheinlich klapp der versand ja auch von a bis z, nur ist der kunde über diese fehlermeldung verunsichert. möchte diese entsprechend weghaben. auch damit es nachher im admin-bereich heisst, dass diese news verschickt wird, was jetzt nicht der fall ist.

gruss
jurg
als Antwort auf: [#335620] Top
 
Pozor
Beiträge: 892
7. Feb 2008, 19:55
Beitrag #6 von 18
Beitrag ID: #335668
Bewertung:
(3675 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

newsletter - mysql server has gone away


Hallo,

Dein Ansatz ist problematisch, sobald viele Emails versandt werden.
Um dieses Problem zu umgehen solltest Du eine Logtabelle haben (oder direkt beim Eintrag selber),
in welcher du markierst, welche Email schon versandt ist.
Dann kann dein Script auch mehrmals gestartet werden (Cron?), bis alle Emails versandt sind.

Nachteil, wenn man die Versandinfo direkt beim Emaileintrag speichert:
Nur immer ein Mailing darf aktiv sein (sprich versandt werden).

Nach jedem Versand den aktuellen Logeintrag updaten, so wird kein Email 2mal versendet
(oder wenn dann nur sehr wenige). Dies funktioniert ganz gut (funktioniert mit Newslettern
welche um die 75'000+ Emails versenden einwandfrei).

Dein Ansatz mit dem Updaten als versandt ganz am Ende für alle funktioniert nicht,
wenn die letzte email ein False zurückgibt...


Gruss Stefan


"KISS - KEEP IT SIMPLE, STUPID"
PHP Documentation Download
als Antwort auf: [#335621] Top
 
jrandi
Beiträge: 794
7. Feb 2008, 20:19
Beitrag #7 von 18
Beitrag ID: #335671
Bewertung:
(3668 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

newsletter - mysql server has gone away


hallo Pozor,

Danke für Deine Inputs.

Leider checke ich nicht ganz alles, was Du sagst. . .

es werden ja nur knapp 250 mails verschickt. z.Z. von 75'000 ist keine rede.

in meinem script wird einfach laufend ausgegeben :
N° 1 - info-AT-xxx.ch :
. . . .
N° 233 - info-AT-xyz.ch : envoyé avec succés! (erfolgreich versendet auf deutsch)
N° 234 - bw-AT-yxz.ch : envoyé avec succés!
N° 235 - jr-AT-randj.net : envoyé avec succés!

dies wird fortlaufend angezeigt während der versand läuft.

Ein Cron erachte ich nicht als notwendig, der versand ist innert ca. 1,2 minuten erledigt. . . auch wenn es 500 mails wären, oder 1000 - in 4,5 minuten sollte das erledigt sein.

und wie gesagt, die No 235 - also ich - habe den Newsletter erhalten, das letzte mail sollte also kein False zurückgeben.

Hingegen habe ich doch die Fehlermeldung mysql server has gone away

Meiner Meinung nach liegt das Problem nicht beim Versenden der Mails, sondern dass die DB nicht solange "online" ist . . .

um diese "länger am Leben zu erhalten" wollte ich diesbezüglich wissen, wie. . .

z.B. mit
>> set-variable = max_allowed_packet = 16M; ?
aber eben, ist dies möglich das einfach in das script einzufügen ?

und zudem, die PHP-INI ist so konfiguriert, dass ich folgende Zeile nicht eintragen darf :
>> ini_set('max_execution_time',500); resp
>> ini_set('max_execution_time',0); womit das script endlos läuft - was ja auch nicht gut ist. . .

und wollte mal nachfragen, ob man mit sleep() was machen kann - siehe auch thread weiter oben.

und das mühsame ist, ich kann nicht testen, ohne 235 Empfänger zu belästigen. . .

vielen dank für Eure Inputs ! Weiter sind gerne willkommen ;-) danke.
jurg
als Antwort auf: [#335668] Top
 
Intermedia S
Beiträge: 1285
7. Feb 2008, 20:41
Beitrag #8 von 18
Beitrag ID: #335674
Bewertung:
(3662 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

newsletter - mysql server has gone away


Hi,

an welcher Stelle kommt denn die Fehlermeldung der DB, beim select oder beim update?

Wie machst du das connect zu DB? Mit mysql_pconnect oder mit mysql_connect?

Sieh dir mal das an: http://dev.mysql.com/doc/refman/5.1/de/gone-away.html

Das du die php.ini nicht ändern kannst sollt normal sein, das ist eine Maßnahme der Sicherheit bei Providern.

Sprich mal mit deinem Provider und erklär ihm mal was du vor hast. Es gibt Provider die keine Massenmailings zulassen. Es geht fix da steht dann der Mailserver auf der Spamliste und alle anderen Kunden haben das nachsehen.

Gruß Sven


http://www.aurahysil.de?hds Mit Aurahysil Freizeit schaffen - Beschichtungen der besonderen Art - http://www.intermedia-bg.de?hds INTERMEDIA bürogemeinschaft
als Antwort auf: [#335671] Top
 
jrandi
Beiträge: 794
8. Feb 2008, 00:56
Beitrag #9 von 18
Beitrag ID: #335705
Bewertung:
(3632 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

newsletter - mysql server has gone away


Hallo Sven,

Danke für Deine Inputs.

Kurz zusammengefasst :
- alle 235 mails scheinen verschickt geworden zu sein -> deshalb das feedback auf der site :
N° 1 - info-AT-abc.ch : envoyé avec succés!
. . .
N° 233 - info-AT-xyz.ch : envoyé avec succés! (erfolgreich versendet auf deutsch)
N° 234 - bw-AT-yxz.ch : envoyé avec succés!
N° 235 - jr-AT-randj.net : envoyé avec succés!

Die Fehlermeldung kommt nicht beim select - jedoch am schluss, beim Update.
Wenn ich will, dass im Admin-Bereich signalisiert wird, dass diese News verschickt wurde.
------
>>>> Wie machst du das connect zu DB? Mit mysql_pconnect oder mit mysql_connect?

ich mache dies mit mysql_connect (habe dies so gelernt, wo ist denn der unterschied zwischen pconnect und connect ? sorry, bin wohl nicht auf dem neusten stand. . .
-------
>>>> Das du die php.ini nicht ändern kannst sollt normal sein, das ist eine Maßnahme der Sicherheit bei Providern.

> das ist mir schon klar, verstehe ich auch. . .
-------
>>>> Sprich mal mit deinem Provider und erklär ihm mal was du vor hast. Es gibt Provider die keine Massenmailings zulassen. Es geht fix da steht dann der Mailserver auf der Spamliste und alle anderen Kunden haben das nachsehen.

> das habe ich bereits gemacht, ich will ja auch nicht HDS mit unnötigen Fragen überhäufen. . . es ist mir auch bewusst, dass gewisse Foren mit Fragen überlastet werden, obwohl man die Antworten via Googel findet, nur ist dies in meinem Falle leider nicht der Fall - Bref. sniff :-)

Antwort meines providers : bis zu 500 mails sollten kein problem darstellen, wenn der absender "unser Kunde ist". . . resp. eine absender-adresse hat, xy@bei-uns-gehostest.ch
-------------------------

nochmals, wenn ich mir erlauben darf, wie halte ich "meine DB länger am leben" !?

wie bereits oben erwähnt, ini_set('max_execution_time',500); kann ich nicht ändern, ist verboten ;-)

wie sieht es aus mit :
set-variable = max_allowed_packet = 16M;
kann ich dies einfach in mein script reintragen ?
(oder müsste man das in der PHP-InI machen - wozu ich jedoch nicht berechtigt bin. . . ?)

für Eure Hilfe danke ich im voraus bestens und grüsse
jurg

p.s. für alle die weiterhelfen möchten, hier das ganze script :
(es scheint mir nicht allzu schlecht zu sein, nur dass der timeout der DB wohl nicht auf der Höhe ist. . . , oder täusche ich mich einmal mehr ?)
----------------------------------------------------

<?php
##### include fichiers connect et functions_sys ###########################
include("../connect.php");
include("../function_global.php");
$id_actualite = $_GET["id"];
//
$sql = "SELECT id, jour, mois, annee, titre, titre_de, texte, texte_de FROM actualite WHERE id=\"$id_actualite\"";
$query = sql($sql);
while($row = mysql_fetch_object($query)) {
$contenu .= "<body text=\"#000000\" link=\"#CC0000\" vlink=\"#990000\" alink=\"#990000\">";
$contenu .= "<table class=\"text\" width=\"871\" bgcolor=\"#DBDBDB\" cellspacing=\"15\" link=\"#330000\"><tr><td>";
$contenu .= "<img src=\"http://www.siavs.ch/img/img_home/mail_fr_nl.gif\" width=\"871\" height=\"120\"><br /><br />";
$contenu .= "<font face=\"arial\" size=\"2\"> $row->jour - $row->mois - $row->annee <br /></font></size>";
$contenu .= "<font face=\"arial\" size=\"3\" color=\"CC0000\"><strong>";
$contenu .= $row->titre;
$contenu .= "</strong></font>";
//$contenu .= "<br /><br /></span>";
$contenu .= "<font face=\"arial\" size=\"2\">";
$contenu .= "<br /><br />";
$contenu .= $row->texte;
$contenu .= "<br /><br /><a href=\"http://www.siavs.ch/index_actualite.php?id=$row->id&action=detail&langue=$langue\">en savoir plus</a><br />";
//$contenu .= "<br /><br /><a href=\"http://www.siavs.ch/index_actualite.php?langue=$langue\">se désabonner</a><br />";
$contenu .= "</font></size></td></tr></table></body>";
$titre .= "newsletter SIA VS - ";
$titre .= $row->titre;
}
///////// envoi /////////////////////////////////////////////////////////////////////////
//ini_set('max_execution_time',500);
//set-variable = max_allowed_packet = 16M;
$q = mysql_query("SELECT * FROM actualite_nl WHERE langue=\"fr\""); // requete LANGUE = FR
$compteur=1; // variable pour compter les mails
while ($r = mysql_fetch_array($q)) {
$e_mail = $r['email']; //prend l'email de la table
$link = "<a href=\"http://www.siavs.ch/index_actualite.php?action=delete_email_nl&email=" .$r['email']. "&id=" .$r['id']. "&langue=$langue\"><font face=\"arial\" size=\"2\">se désabonner</font></a><br />";
// envoi du mail HTML
$from = "From:news@siavs.ch\nMime-Version:";
$from .= " 1.0\nContent-Type: text/html; charset=ISO-8859-1\n";
$envoye = mail($e_mail,$titre,"$contenu <br />$link",$from);
echo'N° '.$compteur.' - '.$e_mail.' : envoyé avec succés!<br />';
$compteur++; // ajoute 1 à la variale du compteur
///////////////// jr . . .
}
if ($envoye) {
// update dans DB !! ensuite
$sql = "UPDATE actualite SET send_fr=\"oui\" WHERE id=\"$id_actualite\"";
$query = sql($sql);
// header ("location:index_actualite.php?langue=$langue");
echo "<br />ok - fin pour mails en français : <a href=\"index.php\">retourner au sommaire</a>";
}
else {
echo "blème . . . à revoir";
}
mysql_close();
?>

___________________________________________________

net & print production : www.randj.net / www.alpha-randj.net
als Antwort auf: [#335674] Top
 
jrandi
Beiträge: 794
8. Feb 2008, 01:05
Beitrag #10 von 18
Beitrag ID: #335706
Bewertung:
(3631 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

newsletter - mysql server has gone away


p.s.

>>>> Sieh dir mal das an: http://dev.mysql.com/doc/refman/5.1/de/gone-away.html

dank Google habe ich diese Seite bereits mehrmals konsultiert. . . aber offensichtlich ist mein Hirn nicht auf der Höhe ;-(
habe das nicht kapiert. . . und wie gesagt, ich habe keinen zugriff auf die PHP-INI.

für tipps und tricks danke ich entsprechend bestens.
jurg
als Antwort auf: [#335674]
(Dieser Beitrag wurde von jrandi am 8. Feb 2008, 01:12 geändert)
Top
 
Intermedia S
Beiträge: 1285
8. Feb 2008, 08:27
Beitrag #11 von 18
Beitrag ID: #335715
Bewertung:
(3588 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

newsletter - mysql server has gone away


Moin Jurg,

also mysql_pconnect ist eine ständige Verbindung zu einer DB welche mehrfach genutzt werden kann. Hab aber damit schlechte Erfahrungen gemacht, gerade bei vielen gleichzeitigen Verbindungen.

Am Scripttimeout sollte es nicht liegen. Ich versende auf ähnliche Art und Weise ca. 3500 Mails.

Es scheint also am Update zu liegen, hast du schonmal versucht nur update zu starten ohne das Ganze vorneweg?

Über die Logik würde ich mir trotz alle dem mal Gedanken machen, was ist wenn nur die letzte Mail einen Fehler vorweist, da wird ja der gesamte Versand als Fehler ausgegeben.

Mehr fällt mir hierzu erstmal nicht ein.

Gruß Sven


http://www.aurahysil.de?hds Mit Aurahysil Freizeit schaffen - Beschichtungen der besonderen Art - http://www.intermedia-bg.de?hds INTERMEDIA bürogemeinschaft
als Antwort auf: [#335705] Top
 
randy S
Beiträge: 436
8. Feb 2008, 09:16
Beitrag #12 von 18
Beitrag ID: #335728
Bewertung:
(3580 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

newsletter - mysql server has gone away


Sag mal, was macht den die Funktion sql?

Das Select machst du herkömmlich mit mysql_query, das Update machst du über die

Code
$query = sql($sql); 


Da zu PHP keine Funktion sql gehört, was macht diese Funktion also?

regards randy
als Antwort auf: [#335715] Top
 
jrandi
Beiträge: 794
8. Feb 2008, 20:24
Beitrag #13 von 18
Beitrag ID: #335881
Bewertung:
(3556 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

newsletter - mysql server has gone away


Danke für Eure Inputs.

Sven, wenn ich mich also mit pconnect arbeiten würde, wäre dies doch gar nicht so schlecht, am ende des scripts ist ja mysql_close() womit die Verbindund wieder unterbrochen wäre. . . ? sehe ich das richtig ?

set-variable = max_allowed_packet = 16M;
ins script reinzuschreiben bring also nichts ?

eben, das blöde ist ja, dass ich nicht testen kann ohne die Leute zu belästigen, deshalb möchte ich schon ne lösung haben, die beim nächsten offiziellen newsletter einfach funktioniert. . .

Randy sql($sql) ist einfach eine function, welche ich include statt jedes mal den ganzen rattenschwanz zu schreiben. falls dich die function interessiert :
############################
# Execute les requêtes SQL #
############################
function sql($sql){
global $db;
$query = mysql_query($sql);
if($query){
return $query;
}
else{
echo "signalé par function.php (function sql) - mais ce n'est pas la source d'erreur. . .<br><br>";
echo "L'erreur suivante c'est produite <br><br><span class='h2'>";
echo mysql_error();
echo "<br /><br />";
echo $query;
echo "</span>";
exit;
}
}
####################
es geht da ganz einfach darum, eine fehlermeldung zu haben, wenn's nicht klappt und das bei allen request separat zu schreiben ist wirklich zeitverlust. . .



Für weitere Inputs danke ich bestens und grüsse
jurg
als Antwort auf: [#335728] Top
 
Intermedia S
Beiträge: 1285
8. Feb 2008, 23:55
Beitrag #14 von 18
Beitrag ID: #335905
Bewertung:
(3546 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

newsletter - mysql server has gone away


Hi Jurg,

vergiss erstmal deine Versuche mit er php.ini, die bringen dich hier nicht weiter.

Du kannst dir selber eine Testumgebung aufbauen in dem du z.B. eine deiner Mailadressen in die DB schreibst. Es müssen ja nicht gleich 250 DS sein.

Lass die Finger von pconnect, das ist nicht die Ursache deines Problems.

Um auf randy's Frage zurück zu kommen, warum verwendest du nicht die gleiche Vorgehensweise auch für Update?

Was passiert denn nun wenn du das Update machst? Da taucht doch die Fehlermeldung auf, also beginnt dort auch die Suche.

Gruß Sven


http://www.aurahysil.de?hds Mit Aurahysil Freizeit schaffen - Beschichtungen der besonderen Art - http://www.intermedia-bg.de?hds INTERMEDIA bürogemeinschaft
als Antwort auf: [#335881] Top
 
jrandi
Beiträge: 794
10. Feb 2008, 00:37
Beitrag #15 von 18
Beitrag ID: #335997
Bewertung:
(3515 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

newsletter - mysql server has gone away


hallo allerseits

besten dank für die inputs.

OK, vergessen wir die PHP-Ini. Bez. einer Test-Umgebung, easy-php und Xampp habe ich schon länger aufgegeben, denn wenn dort alles klappt und man die Site auf den offiziellen Server überträgt, gibt es manchmal überraschungen. . .

und auch sonst, ich habe dasselbe Script für die Newsletter in deutsch - mit ca. 20 Abonnenten, und es hat immer geklappt. kein "gone away". . . deshalb glaube ich, dass die DB einfach zulange offen ist. . .? wobei "zu lange..." es geht ja schnell. . . 235 Abonnenten wenn wirs genau nehmen.

bez. randy's frage : wenn ich recht verstehe. . . ob ich jetzt eine "mysql_query" mache oder $sql mit anschliessender function $query=sql($sql) kommt in etwa auf dasselbe raus.

Aber Sven, Du sagst, dass Du mit einem ähnlichen Script 3'500 mails verschicken kannst. Da würde es mich natürlich schon interessieren, was anders ist an Deinem Code. Wäre froh, wenn Du mir diesen mal zeigen könntest ? Oder, aber, liegt es am Server. . . ?

"Lustigerweise" - als ich diesen Newsletter aufgeschalten habe - damals auf PHP4.3.10 - klappte es auch, kein Problem.
Mittlerweile laufen "meine" Server auf PHP5.2.5 - et voilà, les emmerdes arrivent ;-) auf deutsch, freundlich ausgedrückt : die probleme kommen. . . ;-) bref. . .

tja, ich komme nicht weiter. muss vielleicht einmal mehr beim Provider intervenieren ?

Oder habt Ihr noch eine Idée ? Diese wären sehr willkommen.

Danke für alle inputs - weiss das zu schätzen !

gruss
jurg
als Antwort auf: [#335905] Top
 
« « 1 2 » »  
X