Jetzt kostenlos Anmelden!

Muetze Männlich

Ein Pazifist mit der Waffe in der Hand

Beiträge: 681

Geschlecht: Männlich

Wohnort: zu Hause

PHPKIT Version: 1.6.5

1

Mittwoch, 4. August 2010, 14:58

PHP Zeitüberschreitung bei einer Schleife

Hallo, ich habe ein Problem mit einer Schleife, wenn ich diese ausführe dauert die ziemlich lange, bis am Ende der Prozess gestoppt wird & die Seite weiß wird, wie kann man das Problem umgehen?

PHP-Quelltext

1
2
3
4
5
$getuserinfo=$SQL->query("SELECT user_id, user_email, user_nick FROM ".pkSQLTAB_USER." WHERE user_activate='1' AND user_status='user'");
    while($userinfo=$SQL->fetch_array($getuserinfo))
        {
        Meine Aktion
        }


Habe jetzt den Timeout Limit verändert & es geht.

PHP-Quelltext

1
set_time_limit(0); 


Kann es damit Probleme geben? Habe mit leider keine Erfahrungen.
Es geht nicht darum zu haben was man will, sondern zu schätzen was man hat!
Blutrausch HP

Mauern sind auch nur Steine & Wassertropen können auch mal Wassermengen werden!

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Muetze« (4. August 2010, 15:10)

  • Zum Seitenanfang
  • Zum Seitenende

reddevil82 Männlich

BFM Stream Cheffe

Beiträge: 1 712

Geschlecht: Männlich

PHPKIT Version: 1.6.5

2

Mittwoch, 4. August 2010, 16:31

Biste sicher das es an der Schleife liegt. Mir fällt da ja nix auf. Was sind deine "AKTIONEN" liegt evtl. daran.
Seit 02.07.2010 Papa einer süssen Tocher !!!!

http://www.burnerfm.de

Mit den besten Hits der 80´s, 90´s und von heute. Plus einigen PHPKit Addons... uvm.
  • Zum Seitenanfang
  • Zum Seitenende

Muetze Männlich

Ein Pazifist mit der Waffe in der Hand

Beiträge: 681

Geschlecht: Männlich

Wohnort: zu Hause

PHPKIT Version: 1.6.5

3

Mittwoch, 4. August 2010, 16:43

Naja, das wird ein Newslettersystem. Wo Gäste ne Mail-Adresse eintragen können für Newsletter etc, aber registrierte User sollen ja auch optional als Status auch ne Mail bekommen, der komplette Code:

PHP-Quelltext

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
            if($_POST['sender_group']=='status')
                {
                if(is_array($_POST['user_status']))
                    {
                    foreach ($_POST['user_status'] as $sendstat)
                        {
                        $getuserinfo=$SQL->query("SELECT user_id, user_email, user_nick FROM ".pkSQLTAB_USER." WHERE user_activate='1' AND user_status='".$SQL->f($sendstat)."'");
                            while($userinfo=$SQL->fetch_array($getuserinfo))
                                {
                                $mail->AddAddress($userinfo['user_email'],$userinfo['user_nick']);
                                $bbin        = array('{site_name}','{site_email}','{site_url}','{site_slogan}','{site_urls}','{site_title}','{user_id}','{user_nick}');
                                $bbout        = array(pkGetConfigF('site_name'),pkGetConfigF('site_email'),pkGetConfigF('site_url'),pkGetConfigF('site_slogan'),pkGetConfigF('site_urls'),pkGetConfigF('site_title'),$userinfo['user_id'],pkEntities($userinfo['user_nick']));
                                $mailbody    str_replace($bbin,$bbout,$mailtext);
                                if(isset($_POST['html']) && $_POST['html']==1)
                                    {
                                    $mail->IsHTML(true);
                                    $mail->Body         nl2br($mailbody);
                                    if(isset($_POST['alttext']) && $_POST['alttext'] == 1)
                                        $mail->AltBody        strip_tags($mailbody);
                                    } else {
                                    $mail->Body         strip_tags($mailbody);
                                    }
                                if(!$mail->Send())
                                    {
                                    $errormsg 'Fehler: ' $mail->ErrorInfo '<br />';
                                    } else {
                                    $count++;
                                    }
                                $mail->ClearAddresses();
                                }
                            }
                        }
                    }


Es läuft ja auch. Nur wenn es halt mehr als etwa 200 Empfänger sind, dann werden die 30 Sekunden überschritten. Habe jetzt folgendes eingestellt & es klapp so weit.

PHP-Quelltext

1
@set_time_limit(3600);


Benutzter mit Safe Mode on haben bei diesem Teil natürlich wie so oft Pech.
Es geht nicht darum zu haben was man will, sondern zu schätzen was man hat!
Blutrausch HP

Mauern sind auch nur Steine & Wassertropen können auch mal Wassermengen werden!

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Muetze« (4. August 2010, 16:48)

  • Zum Seitenanfang
  • Zum Seitenende

reddevil82 Männlich

BFM Stream Cheffe

Beiträge: 1 712

Geschlecht: Männlich

PHPKIT Version: 1.6.5

4

Mittwoch, 4. August 2010, 17:11

Was mir jetzt auf Anhieb auffällt das du zuerst ne foreach schleife nutzt und danach noch ne while schleife. dann isses logisch das der mit nem timeout abbricht
Seit 02.07.2010 Papa einer süssen Tocher !!!!

http://www.burnerfm.de

Mit den besten Hits der 80´s, 90´s und von heute. Plus einigen PHPKit Addons... uvm.
  • Zum Seitenanfang
  • Zum Seitenende

Muetze Männlich

Ein Pazifist mit der Waffe in der Hand

Beiträge: 681

Geschlecht: Männlich

Wohnort: zu Hause

PHPKIT Version: 1.6.5

5

Mittwoch, 4. August 2010, 17:19

Das habe ich als erstes auf gedacht, & habe die foreach weg gealssen & es ohne diese mit user_status='user' versucht (deshalb auch so in Post 1 beschrieben), das Ergebnis war aber das selbe.

Naja, es wird eine Klasse für Mailversand benutzt, die auch eine SMTP-Authentifizierung dann im KIT auf Wunsch zu lässt & Attachments etc kann das Teil auch senden.

Aber mit set_time_limit dauert es etwa ne Minute bis er 117 User durch geht (was ja nicht viele User sind), dazu kommt, das ich das auf einem Live System nicht getestet habe & quasi bei jedem User noch ein Fehler verarbeitet werden muss.

Edit: Ich habe gerade fest gestellt, das die Zeit nur merkbar länger dauert, wenn er nicht mit dem SMTP-Server connecten kann. 8o
Es geht nicht darum zu haben was man will, sondern zu schätzen was man hat!
Blutrausch HP

Mauern sind auch nur Steine & Wassertropen können auch mal Wassermengen werden!

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Muetze« (4. August 2010, 17:36)

  • Zum Seitenanfang
  • Zum Seitenende

HiGHteK Männlich

findet sich zurecht

Beiträge: 144

Geschlecht: Männlich

PHPKIT Version: 1.6.03

6

Mittwoch, 4. August 2010, 20:47

Ich würde mal davon ausgehen, dass der E-Mail-Versand, unabhängig davon wie man ihn nun umsetzt, immer seine Zeit braucht. Und spätestens wenn es mal viele tausend Empfänger sind, kann man die nicht mehr in einer Schleife abarbeiten ohne in einen Timeout zu laufen (Es sei denn man penetriert die php.ini entsprechend ;) ).
Als Verbesserungsvorschlag von meiner Seite...
Ich würde zu einer Mail eine Art Auftrag in der Datenbank erfassen, welcher neben der Mailnachricht und Informationen zu der Mail noch die Empfänger beinhaltet. Dazu dann noch ein Skript, welches so erfasste Aufträge abarbeitet. Das besondere bei dem Skript ist dabei eigentlich nur, dass es die Empfänger häppchenweise (z.B. 50 Empfänger) abarbeitet und sich danach selber aufruft. Das eben solange, bis alle Empfänger ihre E-Mail erhalten haben. Das ganze kann man dann noch via Cronjob oder ähnlichem in der Nacht laufen lassen, so dass der Server zu den Spitzenzeiten nicht so belastet wird.
Das einfach mal als Vorschlag meinerseits ;) Ich hab nun nicht ausprobiert, ob das Zeitlimit bis zum Timeout zurück gesetzt wird, wenn ein Skript auf sich selber weiterleitet bzw. sich selbst aufruft, würde aber davon ausgehen, dass das möglich ist.

Grtz
[Bevor du jemanden mit Füßen trittst, überleg ob du einem eventuellen Echo gewachsen bist]
  • Zum Seitenanfang
  • Zum Seitenende

Muetze Männlich

Ein Pazifist mit der Waffe in der Hand

Beiträge: 681

Geschlecht: Männlich

Wohnort: zu Hause

PHPKIT Version: 1.6.5

7

Mittwoch, 4. August 2010, 21:13

Also, die Mail-Klasse, die ich nutze, da wird für ein Newslettersystem in jedem Forum & Tutorial, wo das Thema Newsletter & die Klasse angesprochen wird immer zur Schleife geraten.

Die ini muss man ja dank set_time_limit nicht bearbeiten.

Und die letzten Tests mit knapp 150 Mailadressen haben gezeigt, das es nur länger dauert, wenn es zu einer Fehlerhaften SMPT-Verbindung kommt, ansonsten war es eine Sache von Sekunden.
Der Livetest wird am Ende mit knapp 500 E-Mail-Adressen vollzogen.

Ich werde also vor der Schleife jetzt die SMTP-Verbindung prüfen lassen, damit diese auch nur durchlaufen wird, wenn der Versand auch überhaupt möglich ist.

Eine Schleife könnte ich mir eigentlich sparen, aber dann könnte man für den internen Mailversand nicht user_id & user_nick verwenden.

Die Idee finde ich nicht so, denn ob das Script nun eine Pause macht oder ebend länger als 30 Sekunden arbeitet ist in meinen Augen eigentich egal


MfG
Es geht nicht darum zu haben was man will, sondern zu schätzen was man hat!
Blutrausch HP

Mauern sind auch nur Steine & Wassertropen können auch mal Wassermengen werden!
  • Zum Seitenanfang
  • Zum Seitenende

Proggi Männlich

schaut regelmäßig rein

Beiträge: 263

Geschlecht: Männlich

Wohnort: Berlin

PHPKIT Version: 1.6.5

8

Donnerstag, 5. August 2010, 06:03

Moin Moin ;)

Vielleicht hilft Dir auch die PHP-Funktion sleep() weiter.


Netten Gruß Andy --- Proggi
Es gibt viel zu tun - packen wir es an.....


  • Zum Seitenanfang
  • Zum Seitenende

Muetze Männlich

Ein Pazifist mit der Waffe in der Hand

Beiträge: 681

Geschlecht: Männlich

Wohnort: zu Hause

PHPKIT Version: 1.6.5

9

Donnerstag, 5. August 2010, 09:00

Danke. Die hatte ich auch im Sinn.

Ich habe aber fest gestellt, das es wirklich nur lange dauert, wenn ein Fehler pro Durchgang kommt.

Da nach 10 Fehlern es auch nicht besser werden wird, unterbricht die Schleife dann bei X Fehlern mit einem break.


MfG
Es geht nicht darum zu haben was man will, sondern zu schätzen was man hat!
Blutrausch HP

Mauern sind auch nur Steine & Wassertropen können auch mal Wassermengen werden!
  • Zum Seitenanfang
  • Zum Seitenende