Serverweite Variablen?
Sumafu
- php
0 Auge0 Jörg Reinholz
Hey, ich bin grade dabei, ein kleines PHP-Script für eine Webseite zu entwicklen. Auf dieser Webseite kann sich der Benutzer einen Account anlegen und dort soll es einen "Aktualisieren"-Knopf geben. Mit diesem Knopf soll das PHP-Script dann ausgeführt werden. Allerdings darf das Script nur einmal gleichzeitig ausgeführt werden. Dass heißt, selbst wenn zwei Benutzer exakt gleichzeitig auf diesen Button klicken, darf das Script nur einmal ausgeführt werden, da es sonst zu einer nicht gewollten Datenredundanz kommt. Ich habe mir dafür schon eine Lösung in der Theorie entwickelt. Und zwar wird mit diesem Knopf erst ein anderes Script gestartet, dieses Script speichern irgendwo eine eindeutige ID ab, wenn noch keine abgespeichert ist, dies wäre in diesem Fall die Session-ID, welche ich noch um den Benutzernamen erweitere. Anschließend wartet das Script eine oder zwei Sekunden und überprüft, ob immer noch die eigene ID abgespeichert ist, nur dann wird das Script auch ausgeführt. Am Ende entfernt das Script die ID wieder.
Meine Frage dazu ist jetzt: Gibt es in PHP superglobale Variablen, auf die ich aus verschiedenen Scripts zugreifen kann und auch in verschiedenen Scripts den gleichen Inhalt haben? Ansonsten würde ich das über Dateien machen, die ich irgendwo abspeichern, oder über MySQL. Oder kennt jemand von euch eine bessere Lösung für mein Problem?
Nebenbei: Eine andere Möglichkeit wäre eine regelmäßige Ausführung des Scripts mit Cronjobs, aber ich darf das Script nicht vollautomatisch ausführen lassen, und ich kann sowieso keine Cronjobs konfigurieren.
Hallo
Hey, ich bin grade dabei, ein kleines PHP-Script für eine Webseite zu entwicklen. Auf dieser Webseite kann sich der Benutzer einen Account anlegen und dort soll es einen "Aktualisieren"-Knopf geben. Mit diesem Knopf soll das PHP-Script dann ausgeführt werden. Allerdings darf das Script nur einmal gleichzeitig ausgeführt werden. Dass heißt, selbst wenn zwei Benutzer exakt gleichzeitig auf diesen Button klicken, darf das Script nur einmal ausgeführt werden, da es sonst zu einer nicht gewollten Datenredundanz kommt.
Aha.
Ich habe mir dafür schon eine Lösung in der Theorie entwickelt. Und zwar wird mit diesem Knopf erst ein anderes Script gestartet, dieses Script speichern irgendwo eine eindeutige ID ab, wenn noch keine abgespeichert ist, dies wäre in diesem Fall die Session-ID, welche ich noch um den Benutzernamen erweitere.
Wenn du einen Benutzernamen und eine Session-ID hast, hast du auch Daten, mit denen du eine Datenredundanz verhindern kannst.
Meine Frage dazu ist jetzt: Gibt es in PHP superglobale Variablen, auf die ich aus verschiedenen Scripts zugreifen kann und auch in verschiedenen Scripts den gleichen Inhalt haben?
Du kannst dir ja mal die Ausgabe von php_info()
, insbesondere die superglobalen Arrays &_SERVER
und $_ENV
, anschauen.
Tschö, Auge
Wenn du einen Benutzernamen und eine Session-ID hast, hast du auch Daten, mit denen du eine Datenredundanz verhindern kannst.
Leider nicht. Denn das Script an sich ist unabhängig davon. Ich lese mit dem Script Daten von einer anderen Webseite aus und speichere Sie dann in MySQL ab. Das beste wäre ein Cronjob, den ich aber nicht nutzen darf, da das der Betreiber der anderen Webseite verboten hat (wegen Serverlast)
Du kannst dir ja mal die Ausgabe von php_info(), insbesondere die superglobalen Arrays &_SERVER und $_ENV, anschauen.
Werde ich mir anschauen :)
Hallo
Wenn du einen Benutzernamen und eine Session-ID hast, hast du auch Daten, mit denen du eine Datenredundanz verhindern kannst.
Leider nicht. Denn das Script an sich ist unabhängig davon. Ich lese mit dem Script Daten von einer anderen Webseite aus und speichere Sie dann in MySQL ab.
Du möchtest also den durch den Aufruf einer Seite erfolgenden Start eines anderen Skriptes realisieren. Dann starte dieses Skript mit der Voraussetzung, dass eine zu bestimmende Datei nicht ensistiert, lege diese als ersten Schritt an und lösche sie als letzten Schritt in der Abarbeitung des Skripts.
Das beste wäre ein Cronjob, den ich aber nicht nutzen darf, da das der Betreiber der anderen Webseite verboten hat (wegen Serverlast)
Du darfst auf deiner Seite keinen Cronjob nutzen, weil es der Betreiber einer anderen Seite wegen seiner Serverlast verbietet? Wie unterscheidet sich der [setze hier Rhythmus ein] Lauf eines Skripts vom unregelmäßigeren, aber evtl. häufigeren Lauf des selben Skripts durch den Aufruf der das Skript startenden Seite?
Tschö, Auge
Du möchtest also den durch den Aufruf einer Seite erfolgenden Start eines anderen Skriptes realisieren. Dann starte dieses Skript mit der Voraussetzung, dass eine zu bestimmende Datei nicht ensistiert, lege diese als ersten Schritt an und lösche sie als letzten Schritt in der Abarbeitung des Skripts.
Ja, das war ja auch meine Ausgangsidee. Nur anstatt, dass das Script eine Datei voraussetzt, hätte ich es lieber, dass es einen speziellen Wert eine Variable voraussetzt. Ich bin grade dabei mit Umgebungsvariablen zu experimentieren. Wenn das allerdings nicht gibt, werde ich ja wohl mit Dateien arbeiten müssen.
Du darfst auf deiner Seite keinen Cronjob nutzen, weil es der Betreiber einer anderen Seite wegen seiner Serverlast verbietet? Wie unterscheidet sich der [setze hier Rhythmus ein] Lauf eines Skripts vom unregelmäßigeren, aber evtl. häufigeren Lauf des selben Skripts durch den Aufruf der das Skript startenden Seite?
Wenn das Script durch einen Benutzer aufgerufen wird, wird es definitiv seltener aufgerufen. Und selbst wenn es öfter aufgerufen würde, als durch einen Cronjob, wäre das nicht mein Problem. Das ist eine Auflage des Betreibers der anderen Seite, und damit muss ich leben. Ich rufe ja schließlich seine Seite mit einem Script auf.
Hallo
Du möchtest also den durch den Aufruf einer Seite erfolgenden Start eines anderen Skriptes realisieren. Dann starte dieses Skript mit der Voraussetzung, dass eine zu bestimmende Datei nicht ensistiert, lege diese als ersten Schritt an und lösche sie als letzten Schritt in der Abarbeitung des Skripts.
Ja, das war ja auch meine Ausgangsidee. Nur anstatt, dass das Script eine Datei voraussetzt, hätte ich es lieber, dass es einen speziellen Wert eine Variable voraussetzt. Ich bin grade dabei mit Umgebungsvariablen zu experimentieren. Wenn das allerdings nicht gibt, werde ich ja wohl mit Dateien arbeiten müssen.
Ich kann mir nicht vorstellen, dass du mit einem als „normaler“ Benutzer gestarteten Skript einen superglobalen serverseitigen Wert über den Skriptlauf hinweg ändern darfst. Bleibt also mit einer Datei oder einer DB-Tabelle zu arbeiten.
Du darfst auf deiner Seite keinen Cronjob nutzen, weil es der Betreiber einer anderen Seite wegen seiner Serverlast verbietet? …
… Das ist eine Auflage des Betreibers der anderen Seite, und damit muss ich leben. Ich rufe ja schließlich seine Seite mit einem Script auf.
So sei es. Die Logik erscheint mir immer noch nicht schlüssig, aber des Menschen Wille ist sein Himmelreich.
Tschö, Auge
Hallo und guten Morgen,
Wenn du einen Benutzernamen und eine Session-ID hast, hast du auch Daten, mit denen du eine Datenredundanz verhindern kannst.
Das Semaphor hat (fast) nix mit dem User zu tun, sondern mit der Ressource, die geschützt werden soll. Das ist Aufgabe des jeweiligen Ressource-Dienstes, also des Fileservers oder des Betriebssystems. Da gibt es hier im Selfraum einen Artikel von Christan Seiler...
Grüße TS
Moin!
Meine Frage dazu ist jetzt: Gibt es in PHP superglobale Variablen, auf die ich aus verschiedenen Scripts zugreifen kann und auch in verschiedenen Scripts den gleichen Inhalt haben? Ansonsten würde ich das über Dateien machen, die ich irgendwo abspeichern, oder über MySQL.
Ja. Eine Datei. Wenn die nach einem Server-Neustart weg sein darf oder soll, dann schreibe die ins Temp-Dir. (unter Unixoiden und Linux: /tmp
Oder kennt jemand von euch eine bessere Lösung für mein Problem?
Du sprichst selbst den Chron-Job an. Such Dir einen Anbieter wo das geht.
Nebenbei: Eine andere Möglichkeit wäre eine regelmäßige Ausführung des Scripts mit Cronjobs, aber ich darf das Script nicht vollautomatisch ausführen lassen, und ich kann sowieso keine Cronjobs konfigurieren.
gibt es die Datei X nicht oder ist der Zeitstempel zu alt {
Zeitstempel in Datei X setzen;
Daten aktualisieren;
} sonst {
nichts tun;
}
weiter mit dem ursprünglichen Skript;
Jörg Reinholz
Du sprichst selbst den Chron-Job an. Such Dir einen Anbieter wo das geht.
Wie gesagt, darf ich nicht. Und bei meinem Anbieter geht das, ich kann es nur in meinem Vertrag nicht nutzen.
- Du hast ein Skript, welches die aktualisierten Daten präsentieren soll. In den Skript ist, ganz am Anfang eine Funktion, welche Datei X untersucht, ob die existiert und was für ein Zeitstempel drin steht:
gibt es die Datei X nicht oder ist der Zeitstempel zu alt { Zeitstempel in Datei X setzen; Daten aktualisieren; } sonst { nichts tun; } weiter mit dem ursprünglichen Skript;
Ja, das wäre eine Möglichkeit. Nur suche ich eine möglichst eine Lösung ohne Dateien.
Moin!
Ja, das wäre eine Möglichkeit. Nur suche ich eine möglichst eine Lösung ohne Dateien.
Ja, Du kannst natürlich auch die Datenbank benutzen ... dann lege Dir eine Tabelle an:
table: locks
id, timestamp, status (aus: processing, ready, error), ...
---------------------------------------------------------------------
815, Do, 18. Jun 12:09:37, error , ...
...
und frage den darin befindlichen, zur ID passenden status und timestamp ab, setze ihn während der Laufzeit der Aktualisierung. Wie Du auf "processing" oder "error" reagierst hängt von Deinen Anforderungen ab, die ich nicht kenne.
BTW. Was spricht denn gegen eine Datei? Die Datenbank schreibt das Zeug auch in eine Datei... Die Datenbank würde ich nur nutzen, wenn es auf dem System mehrere, genauer: viele dieser Locks geben soll, was ich nicht für wahrscheinlich halte.
Jörg Reinholz
Das ist eine schöne Lösung, auf die ich noch gar nicht gekommen bin. Damit könnte dann sogar abspeichern, wann das Script aufgerufen wurde, wann es anfing zu arbeiten und wann es fertig geworden ist.
Moin!
Das ist eine schöne Lösung, auf die ich noch gar nicht gekommen bin. Damit könnte dann sogar abspeichern, wann das Script aufgerufen wurde, wann es anfing zu arbeiten und wann es fertig geworden ist.
Wozu?
Ich hätte eine noch bessere: Du speicherst nicht etwa die Daten, sondern gleich die ganze, daraus gebaute Webseite. Der Performancegewinn ist irre (Die verlinkte Seite verwendet das und hat deshalb eine DDoS-Attacke mit 200.000 Requests in 30 min (111/s) ohne Ausfall überstanden, diese in einer Abwandlung.)
Jörg Reinholz
Ich brauche ja nicht die ganze Webseite, sondern nur die Daten. Und da sich der Inhalt der Seite regelmäßig ändern, insbesondere wenn das Script durch den Benutzer gestartet wird, nützt es mir eigentlich gar nichts, wenn ich das Seite komplett abspeichere.
Nochmal dazu, warum ich keine Dateien benutzen will: Ich mag es nicht, in PHP Datei zu erstellen und zu editieren. Denn dazu müsste ich auf das jeweilige Verzeichnis unbegrenzte schreibrechte geben, da PHP da sonst nichts ändern kann. Und vor allem auf meinem Live-System mache ich das nur ungern.
Moin!
Denn dazu müsste ich auf das jeweilige Verzeichnis unbegrenzte schreibrechte geben, da PHP da sonst nichts ändern kann.
Dazu verwendet man stets (oder nach Möglichkeit ein Verzeichnis, dass nicht über den Webserver abgerufen werden kann.
Guter Weg:
/var/www/htdocs/ - Document-Root
/var/www/data/ - Datenverzeichnis
Oft geht nur diese Alternative, z.B. bei Strato: Verzeichnis "data" einrichten,
mkdir data
cd data
echo "deny from all" > .htaccess
chmod 000 .htaccess
Das war es dann: Bei jedem Zugriff auf http://example.org/data gibt es einen 500er Fehler, was zwar nicht ganz der Norm entspricht, aber etwas sicherer ist als nur den Zugriff zu verbieten. (Es sind dann 2 Fehler erforderlich um data zugänglich zu machen.)
Jörg Reinholz
Hallo
Nochmal dazu, warum ich keine Dateien benutzen will: Ich mag es nicht, in PHP Datei zu erstellen und zu editieren. Denn dazu müsste ich auf das jeweilige Verzeichnis unbegrenzte schreibrechte geben, da PHP da sonst nichts ändern kann. Und vor allem auf meinem Live-System mache ich das nur ungern.
Du musst (netto) nur dem Benutzer, unter dem PHP bzw. deine Skripte laufen, Schreibrechte geben. Es ist, außer bei völlig verkorksten Serverkonfigurationen, keineswegs nötig, globale Schreibrechte für alle zu gewähren.
Tschö, Auge
So, ich habe es jetzt mit MySQL gelöst. Jetzt kann ich es wenigstens direkt auf das Liresystem übertragen, ohne noch extra etwas konfigurieren zu müssen.
Hallo und guten Morgen,
So, ich habe es jetzt mit MySQL gelöst. Jetzt kann ich es wenigstens direkt auf das Liresystem übertragen, ohne noch extra etwas konfigurieren zu müssen.
geht das auch mit Euro?
Grüße
TS
So, ich habe es jetzt mit MySQL gelöst. Jetzt kann ich es wenigstens direkt auf das Liresystem übertragen, ohne noch extra etwas konfigurieren zu müssen.
geht das auch mit Euro?
Ja, das Livesystem arbeitet auch mit Euro :D (Blöde Autokorrektur).
Edit: Kann man hier einen Thread als "gelöst" markieren?
Hallo und guten Morgen,
So, ich habe es jetzt mit MySQL gelöst. Jetzt kann ich es wenigstens direkt auf das Liresystem übertragen, ohne noch extra etwas konfigurieren zu müssen.
geht das auch mit Euro?
Ja, das Livesystem arbeitet auch mit Euro :D (Blöde Autokorrektur).
Edit: Kann man hier einen Thread als "gelöst" markieren?
Jein.
Man kann als Thread Opener diverse Antworten akzeptiere. Linker Haken neben den Bewertungen. Dann erscheint das beim Aufruf des Threads. Leider wird der dadurch auch nicht grün in der Übersicht...
Grüße
TS