Obs:den här lösningen handlar mer om prestanda än om snabbfix och jag är äntligen klar
Jag antar att eftersom du använder memcache får du ditt innehåll från en MySQL-databas, tolkar det sedan i PHP och sparar det i cachen och visar det.
Varje version skulle ha en annan domän. iPhone/Android (och annan smartphone) kommer att använda m.domain.com
domän, surfplattor (iPad, galaxy etc...) kommer att använda t.domain.com
, kommer alla andra att använda o.domain.com
och standarden kommer att använda www.domain.com
eller domain.com
.
Alla dessa underdomäner kan peka på samma mapp (/var/www/
- standard). Det som kommer att göra susen är hur du kallar det.
Lägg till din .htaccess- eller apache-konfiguration:
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]
Så i din PHP-fil kan du använda $_GET['subdomain']
och bestäm vad du behöver göra för att skapa din sida. På så sätt är det väldigt enkelt att underhålla, du har 1 ingångspunkt och du kan ställa in regler i PHP för att hämta information om vad du behöver visa (innehållet blir detsamma, bara layouten ändras).
En sak jag rekommenderar är att optimera dina filer. Den mobila versionen av din webbplats bör vara lättare på något sätt (CSS, bilder, JS). Du vill inte att din användare ska ladda stora CSS, JS och bilder från en mobil enhet med ett långsamt nätverk. Du vill optimera så mycket som möjligt för långsammare nätverksenheter. Med andra ord, du vill inte visa en 300x200-logotyp på en 176x220 flip-telefonenhet. Ett sätt är att namnge din fil baserat på den domän den finns i. Till exempel:
- file.css (4k) V.S. file-m.css (0,4k)
- logo.jpg (300px * 300px 15k) V.S. logo-m.jpg (100px * 40px 2k)
Och i din PHP-kod kan du ha en logik för att dynamiskt ladda JS, bilder och CSS-filer. Kom ihåg att ju snabbare du laddar din mobilsajt, desto bättre är den. Underhåll är viktigt men dina användare är det också. Om du har en långsam mobilsajt kommer de att trenda att inte gå till din sida och gå någon annanstans. Alla använder inte 3G/4G-nätverk eller WiFi på sin telefon. Jag rekommenderar också att du använder utdatakomprimering (som deflate ) när du vill komma åt dina filer.
Detta kommer att förbättra din laddningstid, speciellt för de mobila enheterna. Nu, om du använder samma fil, låt oss säga en Javascript-fil för att skicka ett nyhetsbrev, du vill inte duplicera den eller kopiera den med namnet. Istället för att skapa en extra logik i ditt PHP, kan du skapa en symbolisk länk så här:
ln -s /var/www/js/file.js /var/www/js/file-m.js
Med den här lösningen måste du omdirigera till lämplig plats beroende på vilken typ av enhet de använder. Du vill inte ha en flip-telefon se en iPhone-version av din webbplats. Här är ett par knep du kan göra för att uppnå detta:
// 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();
}
ELLER i .htaccess/apache-konfigurationen under standardwebbplatsen:
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...
Jag rekommenderar att du tittar på http://detectmobilebrowsers.com/ för att ta reda på vad du kan använda för de mobila enheterna och du kan kolla http://validator.w3.org /mobil/ för att se till att allt ser bra ut för din mobila enhet.
Som för de vanliga PHP-filerna kommer jag att rekommendera att använda en centraliserad plats, en specifik sökväg du kan använda och omvärlden kan inte. Du kan lägga all denna kod i en gemensam mapp där alla webbplatser kan komma åt dessa filer. Exempel:
/web/lib/
På så sätt kan ingen, förutom du, komma åt dina filer direkt. I din PHP-kod kommer du att göra något som (till exempel inloggningsskriptet):
<?php
define('BASE_PATH', '/web/lib/');
require(BASE_PATH . 'filex.php');
// etc...