Uwaga:w tym rozwiązaniu chodzi bardziej o wydajność niż o szybką naprawę i w końcu skończyłem
Zakładam, że skoro używasz memcache, otrzymujesz zawartość z bazy danych MySQL, a następnie analizujesz ją w PHP, zapisujesz w pamięci podręcznej i wyświetlasz.
Każda wersja miałaby inną domenę. iPhone/Android (i inne smartfony) będą używać m.domain.com
domena, tablety (iPad, galaxy itp.) będą używać t.domain.com
, wszyscy inni będą używać o.domain.com
a domyślnie użyje www.domain.com
lub domain.com
.
Wszystkie te subdomeny mogą wskazywać na ten sam folder (/var/www/
- domyślny). To, co załatwi sprawę, to jak to nazwiesz.
Dodaj swoją konfigurację .htaccess lub Apache:
SetEnvIf Host ^www\. page=www
SetEnvIf Host ^o\. page=others
SetEnvIf Host ^m\. page=mobile
SetEnvIf Host ^t\. page=tablets
rewriterule ^.*$ index.php?subdomain=%{ENV:page} [QSA,L]
Więc w swoim pliku PHP możesz użyć $_GET['subdomain']
i zdecyduj, co musisz zrobić, aby wygenerować swoją stronę. W ten sposób jest bardzo łatwy w utrzymaniu, masz 1 punkt wejścia i możesz ustawić reguły w PHP, aby uzyskać informacje o tym, co chcesz wyświetlić (treść będzie taka sama, zmieni się tylko układ).
Jedno, co polecam, to optymalizacja plików. Mobilna wersja Twojej strony powinna być w jakikolwiek sposób lżejsza (CSS, Grafika, JS). Nie chcesz, aby Twój użytkownik ładował duże CSS, JS i obrazy z urządzenia mobilnego z wolną siecią. Chcesz zoptymalizować jak najwięcej dla wolniejszego urządzenia sieciowego. Innymi słowy, nie chcesz wyświetlać logo 300x200 na telefonie z klapką 176x220. Jednym ze sposobów będzie nazwanie pliku na podstawie domeny, w której się znajduje. Na przykład:
- file.css (4k) V.S. plik-m.css (0.4k)
- logo.jpg (300px * 300px 15k) V.S. logo-m.jpg (100px * 40px 2k)
A w swoim kodzie PHP możesz mieć logikę dynamicznego ładowania plików JS, obrazów i CSS. Pamiętaj, że im szybciej ładujesz swoją witrynę mobilną, tym jest ona lepsza. Utrzymanie jest ważne, ale Twoi użytkownicy też. Jeśli masz powolną witrynę mobilną, będą mieli tendencję do nie odwiedzania Twojej witryny i przechodzenia w inne miejsce. Nie każdy korzysta z sieci 3G/4G lub Wi-Fi na swoim telefonie. Zalecam również użycie kompresji wyjściowej (takiej jak deflate ), gdy chcesz uzyskać dostęp do swoich plików.
Skróci to czas ładowania, szczególnie na urządzeniach mobilnych. Teraz, jeśli używasz tego samego plik, powiedzmy plik Javascript do przesyłania listów z wiadomościami, nie chcesz go duplikować ani kopiować z nazwą. Zamiast tworzyć dodatkową logikę w PHP, możesz utworzyć dowiązanie symboliczne w następujący sposób:
ln -s /var/www/js/file.js /var/www/js/file-m.js
Dzięki temu rozwiązaniu będziesz musiał przekierować do odpowiedniej witryny w zależności od typu urządzenia, z którego korzystają. Nie chcesz, aby telefon z klapką wyświetlał wersję Twojej witryny na iPhone'a. Oto kilka sztuczek, które możesz zrobić, aby to osiągnąć:
// PHP version - also make sure the current domain is checked otherwise you will be in an infinite loop!
if(strpos($_SERVER['HTTP_USER_AGENT'],'iPhone') !== FALSE || strpos($_SERVER['HTTP_USER_AGENT'],'Android') !== FALSE)
{
header('Location: http://m.domain.com/');
exit();
}
LUB w konfiguracji .htaccess/apache w domyślnej witrynie:
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} "iphone|android" [NC]
RewriteCond %{HTTP_HOST} !^mobile.domain.com
RewriteRule ^(.*)$ http://m.domain.com/ [L,R=301] # or 302 if you want temporary
# etc...
Polecam zajrzeć na http://detectmobilebrowsers.com/ aby dowiedzieć się, czego możesz używać na urządzeniach mobilnych, sprawdź http://validator.w3.org /mobile/ aby upewnić się, że wszystko wygląda dobrze na Twoim urządzeniu mobilnym.
Jeśli chodzi o popularne pliki PHP, polecam używać miejsca scentralizowanego, konkretnej ścieżki, której możesz użyć, a świat zewnętrzny nie. Możesz umieścić cały ten kod we wspólnym folderze, w którym wszystkie witryny mają dostęp do tych plików. Przykład:
/web/lib/
W ten sposób nikt poza Tobą nie ma bezpośredniego dostępu do Twoich plików. W swoim kodzie PHP zrobisz coś takiego (na przykład skrypt logowania):
<?php
define('BASE_PATH', '/web/lib/');
require(BASE_PATH . 'filex.php');
// etc...