php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2008

 
 
LinkBack Themen-Optionen Bewertung: Bewertung: 2 Stimmen, 1,00 durchschnittlich.
Alt 27.09.2008, 11:12  
Erfahrener Benutzer
 
Benutzerbild von litterauspirna
 
Registriert seit: 24.04.2008
Beiträge: 3.172
PHP-Kenntnisse:
Anfänger
litterauspirna sorgt für eine eindrucksvolle Atmosphärelitterauspirna sorgt für eine eindrucksvolle Atmosphäre
litterauspirna eine Nachricht über ICQ schicken
Standard [Erledigt] script an bestimmter stelle anhalten und an angehaltener steller weiter au

Hallo Luetz ich habe mal wieder ein Denkproblem!

Und zwar mache ich grad zu meinen Shopscript einen kleinen ganz einfachen Newsletterversand,der auch prima funktioniert!

Nun ist es ja aber so wenn eine größere Anzahl von email Adressen in der Datenbank stehen und der Versand des Newsletters deshalb länger dauert als die Beschränkung einer Scriptlaufzeit würde das Script ja dann abbrechen ohne das alle die Mail erhalten haben!

Meine Frage nun,wie kann ich es umsetzen das Script z.B. nach 100 versendeten Mails anzuhalten und wieder neu zu starten an der Stelle bzw. einer Stelle nach der angehaltenen Stelle wieder zu starten zum Weiterversand?

Ich würde Chronjob gern vermeiden!

Ich danke für ein paar Tipps! mfg der litter
__________________
Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
http://www.lit-web.de
litterauspirna ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 27.09.2008, 11:50  
Supermoderator HD
 
Benutzerbild von Manko10
 
Registriert seit: 16.03.2008
Beiträge: 8.709
PHP-Kenntnisse:
Fortgeschritten
Manko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende Zukunft
Standard

Meistens wird das so gemacht, dass die Zeit gezählt wird, die das Skript braucht. Braucht es zu lange, wird die aktuelle Datensatzposition gespeichert und das Skript beendet. Der User muss dann auf einen Button klicken, um den nächsten Block abzuarbeiten. Manche machen ihm es hier einfacher und verwenden Meta- oder JavaScript-Refreshs.
__________________
Refining Linux Advent Calendar series “24 Outstanding ZSH Gems
Manko10 ist offline  
Alt 27.09.2008, 11:56  
Erfahrener Benutzer
 
Benutzerbild von litterauspirna
 
Registriert seit: 24.04.2008
Beiträge: 3.172
PHP-Kenntnisse:
Anfänger
litterauspirna sorgt für eine eindrucksvolle Atmosphärelitterauspirna sorgt für eine eindrucksvolle Atmosphäre
litterauspirna eine Nachricht über ICQ schicken
Standard

Was bräuchte ich für funktionen um die zeit mitzuzählen!

Da die Daten ja aus eine DB Tabelle kommen müsste ich ja auch den Stand wo es abgebrochen wurde speichern um da dann wieder anzusetzen! Oder verstehe ich da was vom Grund her falsch?
__________________
Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
http://www.lit-web.de
litterauspirna ist offline  
Alt 27.09.2008, 13:38  
Moderator
 
Registriert seit: 06.06.2008
Beiträge: 4.945
PHP-Kenntnisse:
Fortgeschritten
Wolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer Anblick
Wolla eine Nachricht über ICQ schicken
Standard

Ich habe mein script so gebaut:

eine Spalte 'senden' steht defaultmäßig auf 'nein'. Wenn ich Mails sende, kipp ich das bei den erwünschten Empfängern um auf 'ja'.

Das Sendescript macht dann so was:

PHP-Code:
...
$sql "SELECT email,vorname,name FROM mails WHERE senden = 'ja' LIMIT 50";
... 
haut die 50 Mals raus, setzt bei diesen 50 Empfängern senden wieder auf 'nein' ,wartet dann auf einem HTML-Redirect 3 Sekunden und ruft sich dann ohne Parameter selbst wieder auf.

Wenn alles fertig ist, ruft das Script sich nicht mehr selbst auf sondern beendet die Arbeit.

Die Anzahl der mails (50) und die Wartezeit (3) holst du natürlich aus einer Setup-Datei. Das muss an deine Serverleistung angepasst werden.
Wolla ist offline  
Alt 27.09.2008, 17:08  
Moderator
 
Benutzerbild von robo47
 
Registriert seit: 03.09.2004
Beiträge: 11.792
PHP-Kenntnisse:
Fortgeschritten
robo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz sein
Standard

Bei einem Script in dem Bereich an dem ich mal weiterentwickelt habe, habe ich es so gelöst, dass in einer extra Tabelle für jeden größeren Versand Informationen standen:

Uhrzeit wann der versand startet
alle wie viele minuten er sendet
wie viele mails pro versandwelle,
die ID des letzten Users an den geschickt wurde
PoolId (User waren in Pools unterteilt da das System mehrere Newsletter verwaltete)
Id des Letters
Id des Mailservers

Das Script das via Cron (je nach Konfiguration z.B. alle 30 Minten) aufgerufen wurde, hat dann überprüft ob noch mails zu versenden sind für den jeweiligen auftrag, dann hat es sich die die userdaten (für die personalisierung) abgerufen + den Mailinhalt und hat in einer Schleife angefangen zu senden.
Nach jeder gesendeten Mail wurde die Id des letzten Users in der Datenbank geändert (mögen zwar viele querys sein, aber war die einzige Lösung die das System auch bei Kunden halbwegs vernünftig laufen liesen mit recht kurzen max_execution_time, oder servern die öfters mal stärker ausgelastet waren).
Dann wurde überprüft wie viel von der max_execution_time noch zur Verfügung steht, wenn die Zeit einen gewissen rahmen unterschritt, wurde das Script vorzeitig abgebrochen und konnte beim nächsten durchlauf bei dem letzten User wieder weitermachen.


Man sollte bei sowas auch sehr darauf achten, dass eine gewisse Zeit (15 - 20 Minuten oder mehr war damals ein guter Wert) zwischen dem Versand größere Mengen an Mails liegt, da einige Mailserver (AOL ist da immer sehr schnell gewesen) wenn sie zu viele Mails in kurzer Zeit erhalten von einem Mailserver, dichtmachen und die Mails direkt ohne Bouncemail oder sonstwas im Nirvana landen.
robo47 ist offline  
Alt 17.04.2009, 16:21  
Erfahrener Benutzer
 
Benutzerbild von litterauspirna
 
Registriert seit: 24.04.2008
Beiträge: 3.172
PHP-Kenntnisse:
Anfänger
litterauspirna sorgt für eine eindrucksvolle Atmosphärelitterauspirna sorgt für eine eindrucksvolle Atmosphäre
litterauspirna eine Nachricht über ICQ schicken
Standard

Tach Leute ich muss den mal wieder hochholen.

Und zwar habe ich nun folgendes Script geschrieben für mein Ziel.

PHP-Code:
//auslesen aller emfpänger für die bildung der gesamtsumme
$sqlbefehl ="
   Select
    Count(*) As summe_empf
   From
    "
.$prefix."nl
   "
;
$erg_empf_ges mysql_query($sqlbefehl)or die(mysql_error().$sqlbefehl);
$empf_ges mysql_fetch_assoc($erg_empf_ges);
 
if(isset(
$_POST['send_nl']))
     {
      
//uodate sendestatus machen
      
$sqlbefehl ="
         Update
          "
.$prefix."letter
         Set
          status = 1
         Where
          id_letter ="
.(int)$_POST['id']."
         "
;
      
$result_status mysql_query($sqlbefehl)or die(mysql_error().$sqlbefehl);
 
      
//senden des newsletters
      
$empfs $empf_ges['summe_empf']; //gesamtempfenger
 
      
$durchlauf = (int)$_GET['durchlauf'];
 
      if(!isset(
$durchlauf) || $durchlauf =='')
      {
       
$durchlauf 1;
      }
      
//maximale mails per durchlauf
      
$max_send 2;
 
      
//neues limit berechnen
      
$max_durchlauf = ($durchlauf $max_send) - $max_send;
 
      
//auslesen der empfenger für den versand
      
$sqlbefehl ="
         Select
          id_nlmail,
          email
         From
          "
.$prefix."nl
         Limit
          $max_durchlauf,$max_send
         "
;
      
$erg_send mysql_query($sqlbefehl)or die(mysql_error().$sqlbefehl);
      while(
$senden mysql_fetch_assoc($erg_send)){
 
       
mail($senden['email'],$betreff,$mailtext,$header);
 
      }
 
      
//errechnen wieviele empfenger es geben wird
      
$max_empf $empfs $max_send;
 
      for(
$a 0$a $max_empf$a++)
      {
       
$b $a +1
 
       echo 
'<meta http-equiv="refresh" content="2; url='.$path.'/admin/nl_send_form.php?durchlauf='.$b.'&amp;send_letter='.(int)$_GET['send_letter'].'">';
      }
     } 
Ich habe mit Absicht die Mail Header Sachen und so raus gelassen weil die irrelevant dafür sind.

Mein Problem ist nun folgendes. Es erfolgt ein Versand aber eben nur an die ersten 2 EMpfänger und dann ist Schluss es bleibt hängen und macht nicht mehr weiter. Ich verstehe nicht warum, suche schon ne Weile den Fehler.

Nachdem ich den Sende Button drücke steht dann folgendes in der Browseradressleiste.

Code:
http://localhost/lit-shop/admin/nl_send_form.php?durchlauf=2&send_letter=1
Wäre nett wenn Ihr mal drüber schaut was da noch der Fehler ist. Vielen Dank Gruß litter.
__________________
Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
http://www.lit-web.de

Geändert von litterauspirna (17.04.2009 um 16:24 Uhr).
litterauspirna ist offline  
Alt 17.04.2009, 17:03  
Moderator
 
Benutzerbild von agrajag
 
Registriert seit: 02.10.2006
Beiträge: 3.820
PHP-Kenntnisse:
Fortgeschritten
agrajag wird schon bald berühmt werdenagrajag wird schon bald berühmt werden
Standard

Das ganze wird nur ausgeführt wenn $_POST['send_nl'] gesetzt ist - ergo nur wenn es überhaupt ein POST-Request ist.
Beim ersten Durchlauf klickst du also vermutlich auf einen Button um das Scritp anzuschubsen. Beim zweiten Durchlauf - nach der meta-weiterleitung - ist es dann ein GET-Request...

Das hier:
PHP-Code:
      $durchlauf = (int)$_GET['durchlauf'];
 
      if(!isset(
$durchlauf) || $durchlauf ==''
Ist auch nicht gerade sinnvoll und lässt sich zum Beispiel auf dieses verkürzen:
PHP-Code:
if(!empty($_GET['durchlauf']))
{
  
//$durchlauf = $_GET['durchlauf']; 
__________________
Today you...Tomorrow me.
agrajag ist offline  
Alt 17.04.2009, 17:08  
Erfahrener Benutzer
 
Benutzerbild von litterauspirna
 
Registriert seit: 24.04.2008
Beiträge: 3.172
PHP-Kenntnisse:
Anfänger
litterauspirna sorgt für eine eindrucksvolle Atmosphärelitterauspirna sorgt für eine eindrucksvolle Atmosphäre
litterauspirna eine Nachricht über ICQ schicken
Standard

Heist das ich muss das Formular als method="get" abschicken? Also das der Sendebutton ein $_GET['send_nl']; wird?

Weil so richtig verstanden habe ich den Post jetzt net.

[EDIT]
auch wenn das Formualr als GET verschickt wird funktioniert es nicht. Es werden nur 2 versand.
__________________
Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
http://www.lit-web.de

Geändert von litterauspirna (17.04.2009 um 17:15 Uhr).
litterauspirna ist offline  
Alt 17.04.2009, 17:20  
Moderator
 
Benutzerbild von agrajag
 
Registriert seit: 02.10.2006
Beiträge: 3.820
PHP-Kenntnisse:
Fortgeschritten
agrajag wird schon bald berühmt werdenagrajag wird schon bald berühmt werden
Standard

Ok, nochmal anders gesagt: Ein Meta-Refresh ist immer ein GET-Request und somit hast du in deinem Script keinerlei $_POST-Variablen zur Verfügung.
Also kein $_POST['id'] und kein $_POST['send_nl'].
__________________
Today you...Tomorrow me.
agrajag ist offline  
Alt 17.04.2009, 17:36  
Erfahrener Benutzer
 
Benutzerbild von litterauspirna
 
Registriert seit: 24.04.2008
Beiträge: 3.172
PHP-Kenntnisse:
Anfänger
litterauspirna sorgt für eine eindrucksvolle Atmosphärelitterauspirna sorgt für eine eindrucksvolle Atmosphäre
litterauspirna eine Nachricht über ICQ schicken
Standard

Ja also alles auf GET umstellen, das habe ich getan, aber er sendet trotzdem nur an die ersten 2 Mailempfänger raus.

Der Code.

PHP-Code:
//auslesen aller emfpänger für die bildung der gesamtsumme
$sqlbefehl ="
   Select
    Count(*) As summe_empf
   From
    "
.$prefix."nl
   "
;
$erg_empf_ges mysql_query($sqlbefehl)or die(mysql_error().$sqlbefehl);
$empf_ges mysql_fetch_assoc($erg_empf_ges);
 
 
if(isset(
$_GET['send_nl']))
     {
      
//uodate sendestatus machen
      
$sqlbefehl ="
         Update
          "
.$prefix."letter
         Set
          status = 1
         Where
          id_letter ="
.(int)$_GET['id']."
         "
;
      
$result_status mysql_query($sqlbefehl)or die(mysql_error().$sqlbefehl);
 
      
//senden des newsletters
      
$empfs $empf_ges['summe_empf']; //gesamtempfenger
 
      
$durchlauf = (int)$_GET['durchlauf'];
 
      if(!isset(
$durchlauf) || $durchlauf =='')
      {
       
$durchlauf 1;
      }
      
//maximale mails per durchlauf
      
$max_send 2;
 
      
//neues limit berechnen
      
$max_durchlauf = ($durchlauf $max_send) - $max_send;
 
      
//auslesen der empfenger für den versand
      
$sqlbefehl ="
         Select
          id_nlmail,
          email
         From
          "
.$prefix."nl
         Limit
          $max_durchlauf,$max_send
         "
;
      
$erg_send mysql_query($sqlbefehl)or die(mysql_error().$sqlbefehl);
      while(
$senden mysql_fetch_assoc($erg_send)){
 
       
mail($senden['email'],$betreff,$mailtext,$header);
 
      }
 
      
//errechnen wieviele empfenger es geben wird
      
$max_empf $empfs $max_send;
 
      for(
$a 0$a $max_empf$a++)
      {
       
$b $a +1
 
       echo 
'<meta http-equiv="refresh" content="2; url='.$path.'/admin/nl_send_form.php?send_letter='.(int)$_GET['id'].'&amp;durchlauf='.$b.'">';
      }
     } 
Wenn ich auf senden drücke sieht es dann in der Browseradressleiste folgendermasen aus.

Code:
http://localhost/lit-shop/admin/nl_send_form.php?send_letter=0&durchlauf=2
__________________
Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
http://www.lit-web.de

Geändert von litterauspirna (17.04.2009 um 17:41 Uhr).
litterauspirna ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Script mehrfach ausführen .David. PHP Tipps 2008 11 21.01.2010 18:51
ASP URL in einem PHP Script ausführen?!? becks123 PHP-Fortgeschrittene 12 06.04.2009 10:11
Nach Ablauf einer Zeit Script ausführen PHP-Fortgeschrittene 5 20.12.2005 15:11
Script regelmäßig ausführen PHP Tipps 2005-2 7 13.08.2005 16:33
PHP Script von einem fremden Server ausführen lassen. Zero.exe PHP Tipps 2005-2 4 11.08.2005 01:05
IncludeDatei erst an bestimmter Stelle ausgeben? PHP Tipps 2005-2 11 29.06.2005 14:12
[Erledigt] Script nach 1 minute Ausführen.. keine Sekunde früher. PHP Tipps 2005 6 06.05.2005 22:52
zu einer stelle im script springen PHP Tipps 2005 12 15.04.2005 12:05
Befehl erst nach Bestimmter Zeit ausführen? PHP Tipps 2005 21 28.02.2005 00:13
[Erledigt] shell script ausführen PHP-Fortgeschrittene 15 01.01.2005 21:28
shell script ausführen PHP Tipps 2004-2 0 28.12.2004 21:02
script in shell über shell_exec ausführen ... ?!?!?! PHP Tipps 2004 1 01.09.2004 14:05
Script nur einem am Tag ausführen? themonk PHP Tipps 2004 1 14.08.2004 13:37
bei einer bestimmten zahl ein script ausführen? Eddaholzbein PHP Tipps 2004 4 23.06.2004 14:55
PHP Script ausführen PHP Tipps 2004 6 03.06.2004 14:13

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php script anhalten, php script unterbrechen, php anhalten, php script pausieren, script anhalten, php code anhalten, http://www.php.de/php-tipps-2008/47721-erledigt-script-bestimmter-stelle-anhalten-und-angehaltener-steller-weiter-au.html, php skript pausieren, shell script anhalten, php skript unterbrechen, php skript anhalten, javascript für bestimmte zeit unterbrechen, php script abbrechen, php script stoppen, php code unterbrechen, html skript anhalten javascript, php an einer stelle anhalten, skript anhalten, php an einer bestimmten stelle stoppen, php skript stoppen

Alle Zeitangaben in WEZ +2. Es ist jetzt 17:02 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum