2010-12-12 11 views
10
http://static.ak.fbcdn.net/rsrc.php/117600/css/base.css 

http://static.ak.fbcdn.net/rsrc.php/z4HBM/hash/3krgnmig.swf 

http://b.static.ak.fbcdn.net/rsrc.php/z23ZQ/hash/3ls2fki5.xml 

http://static.ak.fbcdn.net/rsrc.php/z7O0P/hash/4hw14aet.png 

Co naprawdę robi program rsrc.php? Wiem, że rsrc oznacza resource i rsrc.php/z [random]/hash lub css/file.extenstion ładuje plik od kogoś.Co w świecie facebook to rsrc.php?

Założenie/hash/lub/css/to folder, który przechowuje pliki takie jak .xml .png .swf, ale co z rzeczą z [losową] i dlaczego chce załadować plik z php? Czy jest to coś takiego jak kontrola wersji dla pliku lub co? Jeśli tak, to jak to zrobić (w prostszy sposób)?

+0

moje przypuszczenie jest dla CDN celu – ajreal

+0

ale kiedy zmienić link z http : //static.ak.fbcdn.net/rsrc.php/z7O0P/hash/4hw14aet.png na http://static.ak.fbcdn.net/rsrc.php/z23ZQ/hash/4hw14aet.png jego nie działa i zwraca/* bcs */jeśli jest to plik cdn, wszystkie pliki powinny być dostępne na wszystkich serwerach – kornesh

Odpowiedz

7

To proste, te pliki są przechowywane w bazie danych. Cokolwiek po SELF (nazwa skryptu, w tym przypadku skrypt to rsrc.php) jest przekazywane do skryptu jako parametr dla bazy danych. Używam siebie na plikach graficznych, bazuję na 64 obrazie, przechowuję go w bazie danych i zwykle z odrobiną magii mod_rewrite, którą może uzyskać URL obrazu youtsite.com/images/fish-with-wings, gdy jest naprawdę robiąc to: yoursite.com/some-script.php/fish-with-wings, które tak naprawdę mówi bazy danych, aby wyglądać poszukaj obrazu z bazy danych, gdzie title = fish-with-wings, i wypluwa base64 dla tego pliku.

Zaletą posiadania wszystkiego w bazie danych jest to, że dla twórców treści łatwiej jest odwoływać się do pliku i można go usunąć lub wyczyścić, a nawet zmodyfikować za pomocą fajnego AJAX-a, a także warto zatrzymać hotlinkowanie, którego facebook nie zrobione tutaj, ale można powiedzieć, że jeśli URL jest pełną ścieżką, przekierowanie do ostrzeżenia hotlinka.

1

Nie myśl, że jest to związane z celami CDN, nie miałoby sensu przeprowadzać go przez "statyczną" usługę dostarczania dynamicznie generowanych treści.

Sądzę jednak, że może to być używane do utrzymywania otwartego połączenia i przesyłania danych do aktualizacji facebooka (to tam xml miałoby sens dla mnie).

+1

Gdzie jest relacja między "Siecią dystrybucji treści" a "dynamem" ic generowane treści "? – KingCrunch

+0

Prosta, dynamicznie generowana zawartość jest czasami buforowana, a następnie przesyłana do sieci dystrybucji treści (rozpowszechniamy zawartość, nie jest to magiczne pudełko). –

+0

Nie sądzę, że jest to związane z treścią dynamiczną. Pamięć podręczna tylko na Facebooku Zapytania MySQL za pomocą Memcached, ale nie dotyczy to typów plików statycznych. – kornesh

3

rsrc.php jest używany przez Facebook do kontroli wersji wszystkich plików statycznych, w szczególności obrazów, javascript i arkuszy stylów. Dzięki temu Facebook może wprowadzać zmiany w głównym stosie aplikacji, w tym zmiany w statycznych plikach treści bez łamania funkcjonalności dla użytkowników, którzy korzystają ze starej wersji z pamięci podręcznej. Jest wbudowany w architekturę Facebooka jako część systemu Haste.

  1. Reference To Code Function Identification By Original Developer
  2. Recommended Process For Managing Static Resources (phabricator.com)
0

Wszystkie skryptu/css z Facebook są przechowywane w bazie danych i Facebook wykorzystuje rsrc.php do nich dostać.

kod rsrc.php może wyglądać następująco:

$request = basename($_SERVER["REQUEST_URI"]) 
if($request != " ") { 

$sql = "SELECT * FROM scripts"; 
$result = mysqli_query($conn, $sql); 

if (mysqli_num_rows($result) > 0) { 
    while($row = mysqli_fetch_assoc($result)) { 
     header('Content-type: '.$row["type"]); 
     echo $row["script"]; 
    } 
} 

} 
+0

To całkiem niezły kod :) –

0

Jest moja wersja rsrc.php

$request = basename($_SERVER[REQUEST_URI]); 
$dotIndex = strrpos($request, "."); 
$extension = substr($request, $dotIndex+1); 
switch ($extension): 
    case 'js': $content_type="application/javascript"; break; 
    default: $content_type="text/css"; break; 
endswitch; 
$file = Gdecode($request); 
$script_file = dirname(__FILE__)."/".$extension."/".$file.".".$extension; 
$fp = @fopen($script_file, "r"); 
if($fp): 
    fclose($fp); 
    header('Content-type: '.$content_type); 
    echo file_get_contents($script_file); 
endif; 
+1

Podczas udzielania odpowiedzi lepiej jest podać [wyjaśnienie, DLACZEGO twoja odpowiedź] (http://stackoverflow.com/help/how-to-answer) jest tą. –