Zbigniew ‘zibi’ Jarosik Ecie-pecie o wszechświecie
  • PHP prosta replikacja obrazków

    Znów potrzeba okazała się matką wynalazku. Jest sobie site o dość dużym obciążeniu. Padło hasło – robimy klaster. Wszystko pięknie, ładnie, baza się replikuje, ale problem z obrazkami. Jak zrobić replikację plików ze zdjęciami bez mocnego ingerowania w kod panelu administracyjnego?

    Rozwiązanie jest proste, nie wymaga w ogóle dotykania się do kodu aplikacji, wystarcza mała łatka na .htaccess + jeden dodatkowy plik w PHP.

    .htaccess:

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /mirror.php [L]

    mirror.php:

     
    $site='http://tu_adres_serwera_master.tld';
    $file=$_SERVER['REQUEST_URI'];
    $content = @file_get_contents($site.$file);
    if($content===false)
    {
    die('File missing!');
    }
    $localfile=preg_replace('/\.{2,}/','.','.'.$file);
    @mkdir(dirname($localfile),0700,true);
    file_put_contents('.'.$file, $content);
    header('Location: http://'.$_SERVER['HTTP_HOST'].$_SERVER['REDIRECT_URL']);
    ?>

    Zmiany te wprowadzamy na slave-hostach. Panel administracyjny pozostaje tylko na master-hoście.
    Jeśli na slave plik nie zostanie znaleziony, mod_rewrite przekieruje wywołanie na mirror.php który pobierze plik, wrzuci w odpowiednie miejsce i przekieruje przeglądarkę na już gotowy, poprawny adres.
    Do tego raz na dobę pełna replikacja rsync-em i śmiga.

    No Comments