php-cli am leben halten ?

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • php-cli am leben halten ?

    Hallo,

    ich habe folgendes Problem:

    Ich würde gerne unter WinXP ein php-script welches aus einer datei sql-queries (sofern vorhanden) ausliest und ausführt schreiben.

    Aus performance-gründen würde ich dazu gerne eine persistente Verbindung zur DB (mysql auf entferntem Webserver, Client-Libraries mit OpenSSL) benutzen.

    Im Prinzip sollte das Skript so (oder ähnlich) aussehen:

    PHP-Code:
    while (is_file(FILENAME)) {
     
        
    /*hier wird noch geprüft ob die datei gesperrt ist - e.g. ein lock-file der
          schreibenden applikation vorhanden ist
        */
        
    if (! is_file(LOCKFILE_GTK)) {
          
    /*
          hier wird eine datei erzeugt die der schreibende appikation
          ein lock-file erzeugt:
         */    

          
    $query file_get_contents (FILENAME);    
          
    mysql_query($query,$db);
          
          
    /*
         Den Inhalt von FILENAME löschen damit die queries nicht 
         mehrfach ausgeführt werden.
          */
     
         /*
         Das eigene Lockfile löschen
         */      
          
    }

         
    /* und HIER ist auch schon das Problem:
         -> warte ~ 1 sec. ressourcenschonend
         */
    }
    die ();
    /*
    beenden wenn die Datei nichtmehr vorhanden ist ... 
    */ 


    Was ich suche ist also eine Funktion die möglichst ressourcenschonend eine gewisse Zeit einfach 'nichts' macht.

    Das kleine Skript benutzt die PHP5-CLI unter WinXP auf einer recht flotten Maschine.

    Über Vorschläge/Ideen wäre ich sehr dankbar.

    Alex

    P.S.:
    [wen's interessiert]

    Die schreibende Applikation ist ein PHP-GTK Client der leider nicht in der Lage ist mit selbstgestrickten, SSL-Fähigen mysql-client libraries zu arbeiten - daher der Umweg über einen 'Listener' per php5-cli der sich um update/inserts auf der Web-Datenbank kümmert.

    Der GTK-Client liest von einem lokalen mysql-server der per beim Programmstart (und in regelmäßigen Abständen während das Programm läuft) per batch auf den stand der webdatenbank gebracht wird. Die batch benutzt das ebenfalls mit openssl-support selbstgebastelte tool mysqldump und anschliessend den mysql-client um die lokale datenbank zu füttern.

    Am schluss soll alles zusammen ein Client werden der Kunden/Bestelldaten von einem Webshop abolt, sich um Rechnungen/Mahnungen/CRM kümmert und gleichzeitig die Daten auf dem Webserver bei Änderungen mit abgleicht um einem weiteren Mitarbeiter der nicht vor Ort ist Zugang zum aktuellen Status verschiedener Vorgänge zu gewähren ....

    [Ok, ok @ Tobias]
    Zuletzt geändert von ___jemand; 27.01.2005, 19:28.

  • #2
    lesen!
    INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


    Kommentar


    • #3
      ja gibt es, sofern das nicht aus neueren php versionen verbannt wurde:

      1) mit fopen einen dateistream im w+ mode öffnen
      2) diesen fortwährend auslesen (schleife mit sleep() verlangsamen)
      3) den dateipointer kurz vor dateiende wieder an den anfang setzen

      dadurch passieren zwei dinge:

      a) der script läuft weiter
      b) das script bricht nicht ab wegen dem offenen dateistream

      Kommentar


      • #4
        Hallo beebob,

        danke für die Antwort, sleep() war wohl nach was ich gesucht habe.

        Ich bin mir nicht sicher ob man in dem Fall wirklich eine datei öffnen muss und wild drin rumlesen, ich kann mir gut vorstellen dass:

        PHP-Code:

        while (is_file($path)) {
                
        //mach irgendwas, s.o.

                
        sleep (1);
        }
        die (); 
        schon ausreicht.

        Die Datei ist ja solange vorhanden (d.h. is_file() sollte true zurückgeben) bis die gtk-applikation geschlossen wird.

        Oder seh ich das falsch ?

        Viele Grüsse,
        Alex

        Kommentar


        • #5
          Brich bitte deinen Code um!

          Kommentar


          • #6
            jein, das entscheidende ist das scriptimeout und den verhinderst du damit, indem du einen filestream offen hast, den du permanent ausliest.

            der trick ist ziemlich dirty und es kann gut sein, dass das nicht mehr geht bei neueren php versionen.

            Kommentar


            • #7
              Hm, den Timeout (bzw. die Max_execution_time) wollte ich per ini_set entweder auf einen astronomischen wert setzen bzw. ganz deaktiverien was mit max_execution_time=0 angeblich möglich ist.

              Ich les hier auch gerade:
              Wenn set_time_limit() aufgerufen wird, dann startet der Zähler neu.
              Vielleicht auch ne Option bei jedem Durchlauf das Timelimit neu setzen ?

              Der nächste Timeout der zuschlagen könnte ist der des mysql-servers. Ein sporadisches 'SELECT 1=1' könnte hier evtl. abhilfe schaffen

              Wundern würd es mich auch nicht wenn das mehrt oder weniger ein 'Bug' war der entfernt wurde - ansonsten ist's n 1A Workaround um den Timeout den man sich sicherlich im Hinterkopf behalten sollte :-)

              Die applikation wird wohl 8h/tag laufen, mal sehn was hier noch alles probleme macht ...

              Für mich ist dasmehr oder weniger Neuland ne richtige gui zu basteln.

              Zur Not wirds in C++ umgesetzt, da hab ich nur ehrlich gesagt keine Lust drauf wenns mit n paar kleinen Tricksereien auch mit php geht.

              Ich denk morgen gibts mal n 'proof-of-concept', mal sehn obs das Wochenende überlebt.

              Alex

              Kommentar

              Lädt...
              X