php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 12.07.2011, 11:03  
Neuer Benutzer
 
Registriert seit: 11.05.2011
Beiträge: 16
PHP-Kenntnisse:
Fortgeschritten
El Gohr befindet sich auf einem aufstrebenden Ast
Standard Jobstatus

Moin,
es geht um einen Hintergundprozess, der etwas länger läuft (3-4 Stunden) und per Ajax angestartet wird. Derzeit setzt der Prozess (bei Start und Ende) in der Datenbank ein Flag, ob er läuft oder nicht. Die Flag dient zur Darstellung des Status(running || not running) für den Nutzer.
Geht das auch besser? (Ohne Datenbankflag)

Beispielcode:
PHP-Code:
setState(1); //Flag der DB (running)
set_time_limit(0);
doTheJob();
setState(0); //Flag der DB (not running) 
El Gohr ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 12.07.2011, 11:14  
Erfahrener Benutzer
 
Benutzerbild von tr0y
 
Registriert seit: 26.07.2010
Beiträge: 4.874
PHP-Kenntnisse:
Fortgeschritten
tr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblick
tr0y eine Nachricht über MSN schicken
Standard

Was man nicht speichert kann man nicht abrufen ?!

Die einzigste "andere" Möglichkeit wäre, das du die system-prozesse abtastes ob dein "job Script" dabei ist, setzt allerdings vorraus das das ganze auf einem Single-User-Modell basiert. Also das script in wirklich jedem möglichen Fall nur einmal aufgerufen wird ( werden kann - wobei man da wieder beim Speichern des Zustands wäre, per PID-File oder sonstwas ).
__________________
Lasse mir ohne Anwendung von Gewalt Dinge schenken, Amazon weiß darüber bald mehr.
tr0y ist gerade online   Mit Zitat antworten
Alt 12.07.2011, 11:19  
Neuer Benutzer
 
Registriert seit: 11.05.2011
Beiträge: 16
PHP-Kenntnisse:
Fortgeschritten
El Gohr befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von tr0y Beitrag anzeigen
Was man nicht speichert kann man nicht abrufen ?!

Die einzigste "andere" Möglichkeit wäre, das du die system-prozesse abtastes ob dein "job Script" dabei ist, setzt allerdings vorraus das das ganze auf einem Single-User-Modell basiert. Also das script in wirklich jedem möglichen Fall nur einmal aufgerufen wird ( werden kann - wobei man da wieder beim Speichern des Zustands wäre, per PID-File oder sonstwas ).
In Java würd ichs mit einem Singleton realisieren, welches den Status zwischenhält. Bei PHP verstehe ich allerdings nicht wie lange ein Objekt zwischengehalten wird (immer wenn ich das Singleton anfrage, obwohl der Prozess (welcher das Singleton instanzierte) noch läuft, wird es neu instanziert...). Suchen nach PID wäre ne ziemliche Bastelarbeit...
El Gohr ist offline   Mit Zitat antworten
Alt 12.07.2011, 11:20  
Erfahrener Benutzer
 
Registriert seit: 04.08.2010
Beiträge: 287
PHP-Kenntnisse:
Fortgeschritten
zwutz wird schon bald berühmt werden
Standard

Um die Datenbank wirst du nicht rumkommen, ich würds sogar ausweiten.
Eine extra Tabelle [job; start; last_update; end; status] in der für jeden deiner Jobs die entsprechenden Daten gesetzt sind. Innerhalb des Jobs aktualisierst du in regelmäßigen Abständen den Eintrag, damit du auch bei langlaufenden Jobs eventuelle mitbekommst, wenn er sich in nem Error verabschiedet
zwutz ist gerade online   Mit Zitat antworten
Alt 12.07.2011, 11:26  
Neuer Benutzer
 
Registriert seit: 11.05.2011
Beiträge: 16
PHP-Kenntnisse:
Fortgeschritten
El Gohr befindet sich auf einem aufstrebenden Ast
Standard

Was spricht denn gegen ein
PHP-Code:
<?php
class StatusHolder{

    private 
$status=false;

    private function 
__construct(){}
    private function 
__clone(){}

    public static function 
getInstance(){
        if (
self::$instance === null){
            
self::$instance = new self;
        }
        return 
self::$instance;
    }

    public function 
setStatus($stat){ //boolean please
        
self::$status $stat;
    }

    public function 
getStatus(){
        return 
self::$status;
    }
}
?>
Hab ich mal ausm Ärmel geschrieben, ist noch durch keinen Interpreter gelaufen
El Gohr ist offline   Mit Zitat antworten
Alt 12.07.2011, 11:43  
hts
Erfahrener Benutzer
 
Registriert seit: 07.09.2010
Beiträge: 722
PHP-Kenntnisse:
Fortgeschritten
hts befindet sich auf einem aufstrebenden Ast
Standard

Deine Singleton-Idee funktioniert nur innerhalb eines PHP-Prozesses. Wenn du ein weiteres PHP-Script startest (Cronjob?), bekommst du eine neue Instanz deiner Klasse.

Siehe auch hier: http://stackoverflow.com/questions/1...mand-line-call
hts ist offline   Mit Zitat antworten
Alt 12.07.2011, 12:17  
Erfahrener Benutzer
 
Benutzerbild von lstegelitz
 
Registriert seit: 07.09.2009
Beiträge: 4.005
PHP-Kenntnisse:
Fortgeschritten
lstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nett
Standard

Benutz doch eine Sempahore zur Synchronisation... das sollte Prozessübergreifend funktionieren
http://de2.php.net/manual/de/ref.sem.php
__________________
Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.
lstegelitz ist offline   Mit Zitat antworten
Alt 12.07.2011, 16:05  
Neuer Benutzer
 
Registriert seit: 11.05.2011
Beiträge: 16
PHP-Kenntnisse:
Fortgeschritten
El Gohr befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von hts Beitrag anzeigen
Deine Singleton-Idee funktioniert nur innerhalb eines PHP-Prozesses. Wenn du ein weiteres PHP-Script startest (Cronjob?), bekommst du eine neue Instanz deiner Klasse.

Siehe auch hier: http://stackoverflow.com/questions/1...mand-line-call
Thx, das erklärt zumindest wieso er neu instanziert, leider
Btw. eine Semaphore dient der Speicherkonsistenz, wenn ich keine Klasse hab, die prozessübergreifend ist brauch ich hier auch keine Semaphore...

Ich schliesse also daraus, dass die Lösung per Datenbank wirklich die einzig gangbare ist?! Enttäuscht mich jetzt n bisschen, hätte da mehr von PHP erwartet...
El Gohr ist offline   Mit Zitat antworten
Alt 12.07.2011, 16:12  
Erfahrener Benutzer
 
Benutzerbild von tr0y
 
Registriert seit: 26.07.2010
Beiträge: 4.874
PHP-Kenntnisse:
Fortgeschritten
tr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblick
tr0y eine Nachricht über MSN schicken
Standard

Nö ist es nicht, bau nen deamon der den Prozess spawnt und den status observiert, und connecte mit dem restlichen Ramsch der den Status wissen will per socket auf den deamon, fertig. Ganze ohne DB.

aber naja..
PHP-Code:
$db = new msqli('localhost','erwin','seinpw','seinedb');
$db->query("UPDATE `bratwurst` SET `oben_drauf`='senf' WHERE `wurst_waerme` BETWEEN 40 AND 65 LIMIT 1"); 
ist halt kürzer
__________________
Lasse mir ohne Anwendung von Gewalt Dinge schenken, Amazon weiß darüber bald mehr.
tr0y ist gerade online   Mit Zitat antworten
Alt 12.07.2011, 17:14  
Erfahrener Benutzer
 
Benutzerbild von lstegelitz
 
Registriert seit: 07.09.2009
Beiträge: 4.005
PHP-Kenntnisse:
Fortgeschritten
lstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nett
Standard

Zitat:
Zitat von El Gohr Beitrag anzeigen
Btw. eine Semaphore dient der Speicherkonsistenz, wenn ich keine Klasse hab, die prozessübergreifend ist brauch ich hier auch keine Semaphore...
Eine Sempaphore wird klassischerweise bei der Synchronisation von Resourcenzugriffen verwendet, lässt sich aber hierfür "mißbrauchen" (es geht im wesentlichen darum, das Semaphoren auch Prozessübergreifend arbeiten)

Und wenn mich nicht alles täuscht, ging es doch darum:
Zitat:
Zitat von El Gohr Beitrag anzeigen
Derzeit setzt der Prozess (bei Start und Ende) in der Datenbank ein Flag, ob er läuft oder nicht. Die Flag dient zur Darstellung des Status(running || not running) für den Nutzer.
Geht das auch besser? (Ohne Datenbankflag)
Das Arbeitsscript fordert zu Beginn die Semaphore an und belegt sie die gesamte Laufzeit, gibt sie erst am Ende wieder frei.

Das Script, welches den Status visualisieren soll muss lediglich versuchen die Semaphore zu anzufordern. Scheitert das, läuft das Arbeitsscript noch.

Simpel & ebenfalls ohne Datenbank...
__________________
Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.
lstegelitz ist offline   Mit Zitat antworten
Antwort


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

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
visualisierungen jobstatus, msn status observation

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