Sumafu: Serverweite Variablen?

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.

akzeptierte Antworten

  1. 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

    --
    Es schimmerte ein Licht am Ende des Tunnels und es stammte von einem Flammenwerfer.
    Terry Pratchett, „Gevatter Tod“
    1. 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 :)

      1. 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

        --
        Es schimmerte ein Licht am Ende des Tunnels und es stammte von einem Flammenwerfer.
        Terry Pratchett, „Gevatter Tod“
        1. 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.

          1. 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

            --
            Es schimmerte ein Licht am Ende des Tunnels und es stammte von einem Flammenwerfer.
            Terry Pratchett, „Gevatter Tod“
    2. 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

  2. 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.

    • 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;
    

    Jörg Reinholz

    1. 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.

      1. 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.

        • "redy" setzt Du, wenn die Aktualisierung mit dem erwarteten Ergebnis abgeschlossen wurde
        • "error" wenn nicht, bzw. bei Start der Geschichte
        • "processing" beim Beginn der Aktualisierung

        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

        1. 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.

          1. 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

            1. 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.

              1. 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

              2. 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

                --
                Es schimmerte ein Licht am Ende des Tunnels und es stammte von einem Flammenwerfer.
                Terry Pratchett, „Gevatter Tod“
                1. 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.

                  1. 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

                    1. 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?

                      1. 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