Datei Lock mit file_put_contens und file_get_contents?

FBIagent

Erfahrenes Mitglied
Guten Tag,

wie im Betreff gesagt geht es um file_put_contents und file_get_contents.
Mehrere scripte haben gleichzeitig Zugriff auf eine Datei. Nun gebe ich zum
schreiben in die datei bei file_put_contents LOCK_EX bei den flags an.
Aber macht das das ganze dann auch bei file_get_contents sicher? Da gibt
es nähmlich keine flags die man angeben kann aller LOCK_EX. Das mit dem
semaphore funktioniert laut php.net nur auf Linux nicht aber auf Windows und
gab mir auch einen Fehler "undefined function".

PHP:
    public function CallCache( $PhpFile, $Url ) {
//        $fp = sem_get( fileinode( $PhpFile ), 1 );
//        sem_acquire( $fp );

        if ( file_exists( $this->_CacheDir . '/' . $PhpFile . '.html' ) === true ) {
            if ( filemtime( $this->_CacheDir . '/' . $PhpFile . '.html' ) + $this->_CacheTimeout < time() ) {
                $Contents = file_get_contents( $Url . '/' . $PhpFile );
                file_put_contents( $this->_CacheDir . '/' . $PhpFile . '.html', $Contents, LOCK_EX );
                echo $Contents;
            } else {
                echo file_get_contents( $this->_CacheDir . '/' . $PhpFile . '.html' );
            }
        } else {
            $Contents = file_get_contents( $Url . '/' . $PhpFile );
            file_put_contents( $this->_CacheDir . '/' . $PhpFile . '.html', $Contents, LOCK_EX );
            echo $Contents;
        }

//        sem_release( $fp );
    }

Best wishes
FBIagent
 
Soweit ich weiß, erstellt eine lesende Anwendung immer einen nicht-exklusiven Lock auf die Datei. D. h. es können andere Prozesse ebenfalls darauf zugreifen und lesen.

Inwiefern möchtest du denn dort einen exklusiven Lock?
Im Notfall gibt es ja noch [phpf]flock[/phpf]. Dann müsstest du allerdings wieder mit [phpf]fopen[/phpf] arbeiten.


Übrigens:

PHP:
<?php

public function CallCache( $PhpFile, $Url ) {
//        $fp = sem_get( fileinode( $PhpFile ), 1 );
//        sem_acquire( $fp );

		$cFile = $this->_CacheDir . '/' . $PhpFile . '.html';

        if ( file_exists( $cFile ) === true ) {
            if ( filemtime( $cFile ) + $this->_CacheTimeout < time() ) {
                $Contents = file_get_contents( $Url . '/' . $PhpFile );
                file_put_contents( $cFile, $Contents, LOCK_EX );
                echo $Contents;
            } else {
                echo file_get_contents( $cFile );
            }
        } else {
            $Contents = file_get_contents( $Url . '/' . $PhpFile );
            file_put_contents( $cFile, $Contents, LOCK_EX );
            echo $Contents;
        }

//        sem_release( $fp );
    }

?>

Durch die Auslagerung von $this->_CacheDir . '/' . $PhpFile . '.html' in eine eigene Variable sieht die Funktion viel übersichtlicher aus ;)
 
Am besten wäre es, wenn ich einen globalen LOCK hätte der diese gesammte Methode
synchronisiert. Denn das ganze möchte ich auch nochmal mit shared memory(shmop)
umsetzen. Gibt es da dann noch eine andere möglichkeit als mit flock() zu arbeiten?

Durch die Auslagerung von $this->_CacheDir . '/' . $PhpFile . '.html' in eine eigene Variable sieht die Funktion viel übersichtlicher aus ;)

Joa da muss ich dir recht geben :)

Best wishes
FBIagent
 
Zurück