php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2005-2

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 15.06.2005, 00:27  
Gast
 
Beiträge: n/a
Standard [Erledigt] Eingaben ohne Timeout piepsen

Hallo Forum.
Aus Spaß am spielen hab ich eine Klasse zum Verschicken von Icq Nachrichten über php via einem cli client names micq geschrieben.
Das Problem ist, das man immer mit dem Piepsen der einzelnen Einstellunden etwas warten muss bis die vorherigen eingaben verarbeitet worden sind. Deshalb setzte ich mittels sleep() einen Timeout von 5 Sekunden. Das ist allerdings alles andere als optimal, denn wenn die methode process::readndgo() mehrmals aufgerufen wird der Timeout in nicht mehr Normale Geschwindigkeiten wächst. Weiss einer wie ich das geschickter machen kann, das die Eingaben wirklich nur dann rübergepiepst werden können, wenn sichergestellt ist, das das CLI Programm (hier micq) mit der Verarbeitung der zuvor gepiepsten Befehle fertig ist?

Hier der Code: Es geht primär nur um die Klasse process(bzw. deren Methode readndgo() siehe Kommentar) die andere klasse (micq_handler) dient nur dem besseren Verständnis.
PHP-Code:
<?php
class process{

    private 
$dspec = array(
    
=> array("pipe""r"),
    
=> array("pipe""w"),
    
=> array("file""/tmp/micq2php.txt""a"),);

    private 
$process NULL;
    private 
$pipes NULL;

    public final function 
__construct($cmd)
    {
        
$process proc_open($cmd$this->dspec$this->pipes);
        if (
is_resource($process)) {
            
$this->process $process;
        }
    }

    public function 
read($len=2$end="> ")
    {
        
stream_set_blocking($this->pipes[1], FALSE);
        while(
$ret fread($this->pipes[1],$len)){
            
$retval .= $ret;
            if(
substr_count($ret$end) > 0){ $this->pipes[1] = "" ; break;}
        }
        return 
$retval;
    }
    public function 
sendto($str =NULL ){
        
fwrite($this->pipes[0], $str."\n");
    }

    public function 
viewopts($opt){
        
sleep(1);
        
sendto($this->pipes$opt);
        return 
readit($this->pipes);
    }

    public function 
sendopts($opt){
        
sendto($this->pipes$opt);
        
usleep(50);
        return 
readit($this->pipes);
    }


/////////////////// UM DIESE FUNKTION geht es: ///////////////
    
public function readndgo($value Null){

        
sleep(5); //Timeout von 5 Sekunden
        
@$this->read(); //Zeilen Auslesen
        
$this->sendto($value); //Senden neuer eingaben
    
}

    public function 
__destruct()
    {
        @
fclose($this->pipes[0]);
        @
fclose($this->pipes[1]);
        return 
proc_close($this->process);
    }
}

class 
micq_handler {
    private 
$micq_process;

    public final function 
__construct(process $micq_proc)
    {
        
$this->micq_process $micq_proc;
    }
    
    public final function 
login($uid,$password)
    {
        
$this->micq_process->readndgo($uid);//ICQ UID
        
$this->micq_process->readndgo($password); //ICQ PASSWORD
        
$this->micq_process->readndgo(); //SOCKS5 TO DEFAULT [ENTER]
    
}
    
    public function 
msg($uid,$msg)
    {
        
$this->micq_process->readndgo('msg '.str_replace("-",NULL,$uid).' '.$msg); //TYPE MESSAGE
    
}
    
    public function 
logout()
    {
    
$this->micq_process->readndgo("exit"); //QUIT MICQ
    
}
    
}

$p = new process("micq");
$micq = new micq_handler($p);
$micq->login("312015739","******");
$micq->msg("321329316","HALLO GOTT!");
$micq->logout();
?>
Ich bitte den langen Quelltext zu entschuldigen. Andererseits sah ich keine andere möglichkeit es anders klarzumachen.
 
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 15.06.2005, 07:14  
Erfahrener Benutzer
 
Registriert seit: 10.07.2003
Beiträge: 280
freq.9
freq.9 eine Nachricht über ICQ schicken freq.9 eine Nachricht über MSN schicken
Standard

Nebenbei:
- Initialisiert man Klasseninterne Variablen nicht im Konstruktor?
- Geht die Klasse? Ich seh nirgends was, wo der ICQ Server angesprochen wird :!
freq.9 ist offline  
Alt 15.06.2005, 15:13  
Gast
 
Beiträge: n/a
Standard

Zitat:
Zitat von freq.9
Nebenbei:
- Initialisiert man Klasseninterne Variablen nicht im Konstruktor?
Die 2 Null werte und das Array die ihren Default Wert behalten bis der KONSTRUKTOR kommt...
Zitat:
- Geht die Klasse? Ich seh nirgends was, wo der ICQ Server angesprochen wird :!
Hättest du dir die Zeit genommen nicht wie ein Schnipselgeiler über meinen Code zu fliegen hättest du gelesen, das diese Klasse eine CLI Icq client via der Process Class fernsteuert.
 
Alt 26.06.2005, 19:24  
Gast
 
Beiträge: n/a
Standard

Keiner eine Idee?
 
Alt 12.07.2005, 21:17  
Gast
 
Beiträge: n/a
Standard

OK..kann es dann mal einer ne ebene höher schieben wenn es hier kein schwein weiss?
 
Alt 13.07.2005, 00:31  
Benutzer
 
Registriert seit: 02.02.2005
Beiträge: 41
Netspire
Standard

Zugegebenermaßen hatte ich jetzt keine Lust um diese Uhrzeit den ganzen Code zu lesen und zu verstehen.

Aber wenn ich das richtig verstehe, ist dein Problem, dass die Funktion blabla mehrmals aufgerufen wird, obwohl der vorherige Aufruf noch nicht abgeschlossen ist.

Meine Vorschlag:

Erstelle eine boolean Variable $GoOn und definiere die als "static" (nur PHP5, glaube ich). Das bewirkt, dass diese Variable zur Klasse gehört und nicht zur Instanz einer Klasse.

Wenn du jetzt die Funktion blabla aufrufst, wird vorher gecheckt, ob $GoOn true ist und nur dann wird weitergemacht. Jetzt wird $GoOn false gesetzt und die Funktion abgearbeitet. Am Schluss wird $GoOn wieder true.

Das Zauberwort sollte hier halt "static" heißen.

So, hoffe, dass es dir weiterhilft.
Netspire ist offline  
Alt 13.07.2005, 11:46  
Gast
 
Beiträge: n/a
Standard

Ok.
Problem: Wie soll ich wissen das der Befehl feddich ist?
 
Alt 13.07.2005, 17:39  
Benutzer
 
Registriert seit: 02.02.2005
Beiträge: 41
Netspire
Standard

Die Funktion wird doch wohl einen Rückgabewert liefern oder nicht?
Netspire ist offline  
Alt 13.07.2005, 19:20  
Gast
 
Beiträge: n/a
Standard

Ja aber indirekt als Stream und ich weiss nicht wie ich testen soll wann der zuende is.
 
 


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
Session - Timeout Black-Devil PHP Tipps 2008 13 07.06.2008 11:54
COUNT() mit zehntausenden von Datensätzen für zu timeout fmueller Datenbanken 6 02.03.2006 19:28
File Funktion mit Timeout PHP-Fortgeschrittene 3 29.01.2006 11:28
fsockopen - timeout funktioniert nicht! PHP Tipps 2007 3 23.01.2006 23:46
Timeout umgehen hemorieder PHP-Fortgeschrittene 10 27.06.2005 05:03
Große Daten in Datenbank einspielen ohne timeout PHP-Fortgeschrittene 5 22.05.2005 08:47
eingaben prüfen jens76 PHP Tipps 2005 5 17.03.2005 10:47
Eingaben auf mehreren Seiten PHP Tipps 2005 4 26.01.2005 23:18
timeout problöme ... PHP Tipps 2005 5 20.01.2005 17:17
timeout PHP Tipps 2005 6 14.01.2005 10:48
[Erledigt] Server lokal - php.ini Timeout einstellen PHP-Fortgeschrittene 7 28.12.2004 12:05
Zurück Funktion überschreibt die geänderten Eingaben nicht PHP Tipps 2004-2 1 02.12.2004 13:19
Session Timeout stefan-miti HTML, Usability und Barrierefreiheit 11 16.11.2004 15:32
TCP-Verbindungstest - Timeout einbauen PHP Tipps 2004 13 30.10.2004 14:37
Session Timeout ? PHP Tipps 2004 4 12.09.2004 11:44

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php process timeout, php prozess ohne timeout, php proc_open timeout, was bewirkt stream_set_blocking

Alle Zeitangaben in WEZ +2. Es ist jetzt 04:26 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

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.