mathefritz: php Fremdzugriffe

Die url
http://www.wirbler.ch/CHINA3/BeratertätigkeitWirblerMirbler/BeratertätigkeitWirblerMirbler.html
existiert,
wird vom Browser angezeigt. wirbler.ch wird auf eine world4you.com Seite weitergeleitet. Das in url
http://flh.lima-city.de/Zentrale/KomandoZentrale/BesucherZaehler.php
enthaltene
php-Script, Auszug

<?php
$zlrfile = "http://www.wirbler.ch/CHINA3/BeratertätigkeitWirblerMirbler/BeratertätigkeitWirblerMirbler.html";

if ( FALSE === file_exists($zlrfile) ) exit("wohl world4you oder sogar ftp nötig<br>")
;
?>

meint aber, sie existiere nicht. Liegt es an der Weiterleitung?

allow_url_fopen ist bei lima-city on, bei world4you ist es mir z.Z. unbekannt

    1. Danke; und warum produziert dann file_get_contents weder FALSE noch den Inhalt sondern einfach den Parameter?

      1. Tach!

        Danke; und warum produziert dann file_get_contents weder FALSE noch den Inhalt sondern einfach den Parameter?

        Ich verstehe die Frage nicht. Aber ich kann dir versicheren, dass die Funktion so arbeitet wie im Handbuch beschrieben. Jedenfalls unterstützt der Protocol Wrapper für http(s) das nötige "Allows Reading".

        dedlfix.

        1. Damke und sorry, hatte nach file_get_contents nicht dessen Ergebis geechod;
          OFF TOPIC:
          sind eigentlich Probleme zu erwarten wenn man auf eine bereits geöffnete Datei,
          auf die mit flock Exclusivzugriff erhalten wurde,
          file_put_contents anwendet ?

          1. Tach!

            sind eigentlich Probleme zu erwarten wenn man auf eine bereits geöffnete Datei, auf die mit flock Exclusivzugriff erhalten wurde, file_put_contents anwendet ?

            Das ist eine Frage, die sich mit einem einfachen Test beantworten lässt. Ich weiß die Antwort jedenfalls nicht.

            Außerdem riecht das ein nach einem Fall für eine Datenbank, und sei es nur SQLite. Es ist jedenfalls einfacher, ein DBMS zu verwenden, das sich selbst um den konkurrierenden Zugriff kümmert, als solch eine Datenhaltung zu Fuß im Dateisystem tun zu wollen.

            dedlfix.

          2. sind eigentlich Probleme zu erwarten wenn man auf eine bereits geöffnete Datei,
            auf die mit flock Exclusivzugriff erhalten wurde,
            file_put_contents anwendet ?

            Nein. Das Locken von Dateien ist unabhängig davon, was ein Prozess beabsichtigt, egal also ob der schreiben oder lesen will. Ist ein Lock gesetzt, gibt das OS die Datei erst wieder frei wenn der entsprechende Prozess beendet wurde oder dieser selbst den Lock aufhebt. Gleichermaßen kümmert sich das OS darum, daß weitere Prozesse solange angehalten werden bis ein Lock aufgehoben wird.

            Schönen Sonntag.

            1. Tach!

              sind eigentlich Probleme zu erwarten wenn man auf eine bereits geöffnete Datei,
              auf die mit flock Exclusivzugriff erhalten wurde,
              file_put_contents anwendet ?

              Nein.

              Es gibt aber zwei Möglichkeiten, auf einen Lock zu reagieren. Die eine ist, zu warten bis er wieder weg ist, was zu Verzögerungen im Ablauf führt. Die andere ist, mit einer Fehlermeldung abzubrechen, dass die Datei gesperrt ist und nicht zugegriffen werden kann. Das sind beides Dinge, die zu Problemen führen können. Welches Verhalten in file_put_contents() eingebaut ist, erzählt die Handbuchseite nicht.

              dedlfix.

            2. Hello lieber Rolf,

              Nein. Das Locken von Dateien ist unabhängig davon, was ein Prozess beabsichtigt, egal also ob der schreiben oder lesen will. Ist ein Lock gesetzt, gibt das OS die Datei erst wieder frei wenn der entsprechende Prozess beendet wurde oder dieser selbst den Lock aufhebt. Gleichermaßen kümmert sich das OS darum, daß weitere Prozesse solange angehalten werden bis ein Lock aufgehoben wird.

              so einfach ist die Betrachtung nicht. Wir reden bei PHP und flock() über ein advisory Locking. Je nach OS/Filesystem darunter wird das auch nur als Advisory ausgeführt, muss also nicht beachtet werden. Bei Windows wird es vermutlich noch mandatory sein, ist also nicht zu umgehen.

              Auf Linux gibt es auch Mandatory Locking. Dafür muss das betroffene Volume aber entsprechend gemounted sein (mand). Außerdem benutzt PHP für gezieltes Mandatory Locling andere Funktionen, die soweit ich weiß, auch bei PHP 7 noch nicht mit dem "normalen" flock() abgestimmt sind - was aber ginge!

              Liebe Grüße
              Tom S.

              --
              Es gibt nichts Gutes, außer man tut es!
              Das Leben selbst ist der Sinn.
              1. Hello lieber Rolf,

                Nein. Das Locken von Dateien ist unabhängig davon, was ein Prozess beabsichtigt, egal also ob der schreiben oder lesen will. Ist ein Lock gesetzt, gibt das OS die Datei erst wieder frei wenn der entsprechende Prozess beendet wurde oder dieser selbst den Lock aufhebt. Gleichermaßen kümmert sich das OS darum, daß weitere Prozesse solange angehalten werden bis ein Lock aufgehoben wird.

                so einfach ist die Betrachtung nicht. Wir reden bei PHP und flock() über ein advisory Locking. Je nach OS/Filesystem darunter wird das auch nur als Advisory ausgeführt, muss also nicht beachtet werden. Bei Windows wird es vermutlich noch mandatory sein, ist also nicht zu umgehen.

                Nun, ich bin von LOCK_EX ausgegangen, wie geschrieben: exclusive Lock. Wenn ein Prozess auf eine gelockte Datei nicht zugreifen kann, ist das ja kein Fehler. Aber ich würde immer und auf jeden Fall prüfen, ob das Setzen eines LOCK_EX erfolgreich war, d.h., ob das von jeweiligen OS auch unterstützt wird.

                Schönen Sonntag.

                1. Nachgereicht:

                  Nun, ich bin von LOCK_EX ausgegangen, wie geschrieben: exclusive Lock. Wenn ein Prozess auf eine gelockte Datei nicht zugreifen kann, ist das ja kein Fehler. Aber ich würde immer und auf jeden Fall prüfen, ob das Setzen eines LOCK_EX erfolgreich war, d.h., ob das von jeweiligen OS auch unterstützt wird.

                  In PHP würde hier die Fehlerbehandlung ansetzen. Beispiel siehe php.net, d.h., der Programmierer muss sich bei einem advisory file locking tatsächlich selbst darum kümmern ob ein Prozess den Lock bekommen hat oder nicht und was dann zu tun ist.

                  MfG

                  1. Hello,

                    In PHP würde hier die Fehlerbehandlung ansetzen. Beispiel siehe php.net, d.h., der Programmierer muss sich bei einem advisory file locking tatsächlich selbst darum kümmern ob ein Prozess den Lock bekommen hat oder nicht und was dann zu tun ist.

                    Viel wichtiger:
                    Er muss sich bei allen Prozessen seines Systems darum kümmern, dass diese sich an das advisory Locing halten. Beim mandatory Locking übernimmt das auf die Finger Klopfen das Betriebs/Filesystem.

                    Liebe Grüße
                    Tom S.

                    --
                    Es gibt nichts Gutes, außer man tut es!
                    Das Leben selbst ist der Sinn.
                    1. hi,

                      Er muss sich bei allen Prozessen seines Systems darum kümmern, dass diese sich an das advisory Locing halten. Beim mandatory Locking übernimmt das auf die Finger Klopfen das Betriebs/Filesystem.

                      Letzeres ist ja in Perl die Regel. Also Danke für Deine Hinweise, PHP betreffend.

                      Schönen Sonntag 😉

                      PS: Ist tatsächlich n schöner Tag geworden heute.

                      1. Hello,

                        Er muss sich bei allen Prozessen seines Systems darum kümmern, dass diese sich an das advisory Locking halten. Beim mandatory Locking übernimmt das auf die Finger Klopfen das Betriebs/Filesystem.

                        Letzeres ist ja in Perl die Regel. Also Danke für Deine Hinweise, PHP betreffend.

                        Perl arbeitet mit mandatory Locking? Auf Linux doch aber nur, wenn man das Volume auch mandatory gemountet hat. Das ist aber nicht der Default.

                        Liebe Grüße
                        Tom S.

                        --
                        Es gibt nichts Gutes, außer man tut es!
                        Das Leben selbst ist der Sinn.
                        1. Moin,

                          Perl arbeitet mit mandatory Locking? Auf Linux doch aber nur, wenn man das Volume auch mandatory gemountet hat. Das ist aber nicht der Default.

                          Deswegen ja: Immer prüfen ob ein Lock gesetzt werden konnte, das gilt auch für Perl. MfG

                          1. Hello,

                            Perl arbeitet mit mandatory Locking? Auf Linux doch aber nur, wenn man das Volume auch mandatory gemountet hat. Das ist aber nicht der Default.

                            Deswegen ja: Immer prüfen ob ein Lock gesetzt werden konnte, das gilt auch für Perl.

                            Das war jetzt aber keine Antwort auf meine Rückfrage!

                            Liebe Grüße
                            Tom S.

                            --
                            Es gibt nichts Gutes, außer man tut es!
                            Das Leben selbst ist der Sinn.
                            1. Das war jetzt aber keine Antwort auf meine Rückfrage!

                              Aber ja doch gerne.

                              Dein Horst Knallfred 😉

                              --
                              Schau den Harz voll Poesie -- und glich hingerm Horze läht das Eichsfeld dichte bi.. (Otto Reutter)
          3. Hello,

            sind eigentlich Probleme zu erwarten wenn man auf eine bereits geöffnete Datei,
            auf die mit flock Exclusivzugriff erhalten wurde,
            file_put_contents anwendet?

            Probleme auf jeden Fall.

            • Wer hat die Datei im Zugriff (und gesperrt)?
            • Welches OS aka Filesystem liegt drunter?

            Soweit mit für PHP < 7.x bekannt ist, prüft ein einfaches file_put_contents() das advisory Locking nicht. Es würde also einfach reinschreiben in den anderen Vorgang und damit die Probleme verursachen.

            Nun kommt Teil 2 der Antwort:

            Über die Flags der Funktion kann man ein LOCK_EX anfordern. Damit müsste ein Schreiben mittels file_put_contents() dann also mit einem false quittiert werden, also nicht geschrieben werden. Und wenn man dann error_get_last() abfragt, könnte darin eventuell die Ursache stehen. Das weiß ich aber nicht, weil ich keine verbastelten namensbasierten Funktionen für Dateizugriffe verwende, wenn es doch sauber organisierte handlebasierte gibt.

            Liebe Grüße
            Tom S.

            --
            Es gibt nichts Gutes, außer man tut es!
            Das Leben selbst ist der Sinn.
  1. Hello,

    für die Abfrage, ob hinter der URL auch eine Ressource steckt, gibt es den HEAD-Request. Wenn der Webserver will, antwortet er darauf mit den Metadaten zur Ressource.

    Beispiel:

    function head_request($url, $status_only=false, $parsed=true)
    {
        ### checks, if an url exists. 
        ### if no scheme is provided, 'http://' will be assumed
        ### if not "$parsed", raw headers shell be returned, 
        ###     otherwise an array shell be produced
        ###
        ### Used own Constants: TIMEOUT_SOCK_OPEN, TIMEOUT_STREAM_READ
        
        $url = trim($url);
        $_url_parts = parse_url($url);
    
        if (!isset($_url_parts['scheme'])) $url = 'http://' . $url;
    
        $_url_parts = parse_url($url);
        
    #    * scheme - e.g. http
    #    * host
    #    * port
    #    * user
    #    * pass
    #    * path
    #    * query - after the question mark ?
    #    * fragment - after the hashmark #
    
        if (!isset($_url_parts['host'])) return false;
    
        $fp = @fsockopen($_url_parts['host'], 80, $errno, $errstr, TIMEOUT_SOCK_OPEN);
    
        if (!$fp) return false;
    
        stream_set_timeout($fp, TIMEOUT_STREAM_READ);
    	
       	$path = '/';
    	if (isset($_url_parts['path'])) {$path = $_url_parts['path'];}
    	
        $out = "HEAD $path HTTP/1.1\r\n";
        $out .= "Host: " . $_url_parts['host'] . "\r\n";
        $out .= "Connection: Close\r\n\r\n";
        fwrite($fp, $out);
        
        $res = '';
        
        while (!feof($fp)) 
        {
            $res .= fgets($fp, 128);
        }
        
        $_info = stream_get_meta_data($fp);
        fclose($fp);
    
        if ($_info['timed_out']) return false;
        
        $res = str_replace(array('   ', '  '), ' ', $res);
        $_lines = explode("\r\n", $res);
    
    #       return $_lines;
        
        foreach ($_lines as $key => $value)
        {
            if (strlen($value) == 0) 
            {
                unset($_lines[$key]);
                continue;
            }
            
            $_help[$key] = explode(': ', $value);
    
            if (!isset($_help[$key][1]))
            {
                $_out['status'] = explode(' ', trim($_help[$key][0]));
            }
            else
            {
                $_out[strtolower($_help[$key][0])] = explode(' ', trim($_help[$key][1]));
            }   
        }
    
        if (!isset($_out['status'][1])) return false;
        if ($status_only) return $_out['status'][1];
        if (!$parsed) return $res;
        
        return $_out;   
    }
    
    

    Der muss dann ggf. zirkulär durchgeführt werden, solange bis keine Weiterleitungen mehr als Antwort kommen.

    Liebe Grüße
    Tom S.

    --
    Es gibt nichts Gutes, außer man tut es!
    Das Leben selbst ist der Sinn.
  2. Danke allen für die rege Diskussion; inzwischen probiert: file_get_contents klappt.

    1. Hello,

      inzwischen probiert: file_get_contents klappt.

      Mit LOCK_EX-Flag oder ohne?

      Uns würde ja interessieren, ob das ein Wait-Lock (Blocking) oder ein Try-Lock (Non-Blocking) ist. Leider habe ich jetzt keine Zeit, das auszuprobieren.

      Liebe Grüße
      Tom S.

      --
      Es gibt nichts Gutes, außer man tut es!
      Das Leben selbst ist der Sinn.
      1. ganz ohne lock; im betroffenem Script sind keine Schreibvorgänge