webForumDet fria alternativet

Upplägg och struktur i större webbprojekt

Webbutveckling

18 svar · 1 273 visningar · startad av learn

Medlem sedan jan. 20051 130 inlägg
Frågan#1

Håller på att starta upp ett "större" webbprojekt, typ ett community skulle man kunna säga. Sidan kommer i grunden bygga på PHP och MySQL.

Tänkte höra med er andra hur ni brukar lägga upp strukturen på projekt och då syftar jag främst på mapp- och filstrukturen.

Själv är jag inne på följande:

controls/
    config.php

graphic/
    button/
    icons/
    images/

GUI/
    body.php
    infosida.php
    kontaktsida.php
    startsida.php

inc/
    javascripts/
    php_classes/
    php_functions/

public_html/
    index.php

style/
    style.css

Kort sammanfattat:

controls/ innehåller PHP-filer som styr sajtens inställningar och vilka filer som ska inkluderas vart etc
graphics/ all grafik
GUI/ själva gränssnittet, allt som besökaren ser
inc/ allt det bakomliggande, klasser och funktioner etc
public_html/ Hit pekar domänen och här ligger endast index.php som sedan inkluderar resten av sajten
style/ Alla stylesheets

Jag har försökt tänka lite MVC.

Vad tycker ni om detta upplägg? Jag vet att sånt här kan vara lite individuellt men det kanske finns några allmänna riktlinjer i alla fall?

Sedan så undrar jag lite över det faktum att hela min sajt i detta fall ligger utanför sid-rooten. Smart säkerhetsmässigt tycker jag, ingen kommer ju då åt mina filer på annat sätt än att besöka sidan. Men detta ser man ju väldigt sällan, varför? Det måste ju finnas en anledning.

Medlem sedan juni 2002256 inlägg
#2

Du vill inte att någon ska komma åt dina bilder och stilmallar heller?

Medlem sedan dec. 19996 721 inlägg
#3

Allt som ska ut till klienten (css, bilder, html, javascript) måste ju ligga tillgängligt

Medlem sedan jan. 20051 130 inlägg
#4

emission skrev:

Allt som ska ut till klienten (css, bilder, html, javascript) måste ju ligga tillgängligt

Måste det? Kan man inte skriva t.ex. <img src="../graphics/images/bild.jpg" /> ?

Eller gäller det bara server side (PHP)?

Jag vill gärna se hur andra lägger upp det också, kom gärna med exempel. :)

Medlem sedan nov. 20041 740 inlägg
#5

learn skrev:

Måste det?

Ja.

Medlem sedan apr. 2006409 inlägg
#6

Men du, hur tänker du dig att någon ska kunna se något på din sida om inget är tillgängligt..? :OO

Medlem sedan dec. 2004736 inlägg
#7

När du inkluderar säg en bild på din sida kommer besökaren att fråga efter bildadressen. Om den då frågar din server och får svaret "Nej, bilden finns inte" kommer bilden inte visas. Det här svaret kommer besökaren att få, eftersom du gömt bilderna utanför sidan.

Medlem sedan okt. 2007446 inlägg
#8

jag skulle nog använt en liknande struktur,med skillnaden att jag skulle flyttat in allt i webroot.

Medlem sedan jan. 20051 130 inlägg
#9

Ok, stupid me, klart det är så! :r

rhdf skrev:

jag skulle nog använt en liknande struktur,med skillnaden att jag skulle flyttat in allt i webroot.

Allt? Räcker det inte att lägga bilder, css och js i rooten?

Medlem sedan juni 20014 421 inlägg
#10
application/
   controllers/ <- logik
   models/ <- datahämtning
   views/
      scripts/ <- templates
library/ <- framework
public/ <- index.php, js, css, bilder
Medlem sedan jan. 20051 130 inlägg
#11

Men om jag vill ha allt utanför rooten så kan man väl lösa det enligt följande:

// Hämta javascript
readfile("../lib/javascripts/function.js");

// Hämta CSS
readfile("../style/style.css");

// Visa bild
echo '<img src="../controls/img.php?image=bild.jpg" />';

Img.php ser ut så här:

header('Content-Type: image/jpeg');
imagejpeg($_GET["image"]);

Eller hur?

Medlem sedan juni 20014 421 inlägg
#12

Det känns som en onödig belastning på servern. Varför skulle du vilja göra något sådant?

Medlem sedan juni 20008 205 inlägg
#13

learn skrev:

Sedan så undrar jag lite över det faktum att hela min sajt i detta fall ligger utanför sid-rooten. Smart säkerhetsmässigt tycker jag, ingen kommer ju då åt mina filer på annat sätt än att besöka sidan. Men detta ser man ju väldigt sällan, varför? Det måste ju finnas en anledning.

Jag förstår hur du tänker, men det är ingen vidare idé att göra på det viset. För CSS- och JS-filer kommer dina användare få längre laddningstider och du kommer utnyttja mer trafik (iom att användarna inte kan cacha de här filerna).

Bilderna kan cachas av webbläsaren, men det är fortfarande en ganska sådär idé att skicka över dem själv om du inte har någon väldigt, väldigt specifik anledning, eftersom webbservern kan ha en intern cache och således inte behöva läsa filerna från disk varje gång.

Sen är faktiskt din lösning klart sämre ur säkerhetssynpunkt än att ha bildfilerna under webbroten, på grund av en bugg i img.php - du kollar inte indatan. Anropar man img.php?image=../controls/config.php kommer din konfigfil (komplett med lösenord till databas etc, antar jag) skickas genom till besökaren. Har för mig att Adobe blev av med sina privata SSL-nycklar någon gång genom ett liknande hack. Såna här buggar är fantastiskt lätta att producera när man sitter och kodar, så i allmänhet gäller att mindre kod = färre buggar = säkrare kod.

Medlem sedan jan. 20051 130 inlägg
#14

colione skrev:

Det känns som en onödig belastning på servern. Varför skulle du vilja göra något sådant?

Mest för att gå en snygg struktur :) Jag tycker alla javascript hör till "biblioteket" (lib) likväl som php-funktioner och klasser.

Kanske jag ska lägga allt i webbrooten ändå? Eller andra förslag/tips?

spango skrev:

Jag förstår hur du tänker, men det är ingen vidare idé att göra på det viset. För CSS- och JS-filer kommer dina användare få längre laddningstider och du kommer utnyttja mer trafik (iom att användarna inte kan cacha de här filerna).

Bilderna kan cachas av webbläsaren, men det är fortfarande en ganska sådär idé att skicka över dem själv om du inte har någon väldigt, väldigt specifik anledning, eftersom webbservern kan ha en intern cache och således inte behöva läsa filerna från disk varje gång.

Sen är faktiskt din lösning klart sämre ur säkerhetssynpunkt än att ha bildfilerna under webbroten, på grund av en bugg i img.php - du kollar inte indatan. Anropar man img.php?image=../controls/config.php kommer din konfigfil (komplett med lösenord till databas etc, antar jag) skickas genom till besökaren. Har för mig att Adobe blev av med sina privata SSL-nycklar någon gång genom ett liknande hack. Såna här buggar är fantastiskt lätta att producera när man sitter och kodar, så i allmänhet gäller att mindre kod = färre buggar = säkrare kod.

Hmm, ok. Angående säkerheten så visade jag självklart inte en färdig img.php. Kontrollerna fanns inte med. :)

Fler får gärna komma med exempel på strukturer.

BTW: colione, vad lägger du i din mapp "controllers"? Vad exakt menar du med "logik"? Ge gärna exempel.

R: Det finns ju en anledning till att jag vill ha vissa filer utanför webbrooten. Man ska inte kunna komma åt dem via t.ex. https://www.sidan.se/GUI/users.php

Medlem sedan juni 20008 205 inlägg
#15

learn skrev:

Mest för att gå en snygg struktur :) Jag tycker alla javascript hör till "biblioteket" (lib) likväl som php-funktioner och klasser.

Nja, håller inte riktigt med där. Javascript är ju en resurs som använda av användargränssnittet, precis som bildfiler, och ska inte blandas med kod som utför applikationslogik eller snackar med databasen.

learn skrev:

Kanske jag ska lägga allt i webbrooten ändå? Eller andra förslag/tips?

Det är en bra tanke från början, men om en fil ska kommas åt direkt av en klient (=webbläsare) kan den lika gärna ligga under webbroten. Includefiler kan förstås ligga utanför, det är en rätt bra praxis.

learn skrev:

Hmm, ok. Angående säkerheten så visade jag självklart inte en färdig img.php. Kontrollerna fanns inte med. :)

Nänä, men faktum kvarstår att mer kod = fler buggar = osäkrare kod. När den dessutom gör allting segare finns det ingen anledning att sätta sig ner och skriva den ;)

Medlem sedan jan. 20051 130 inlägg
#16

Tack spango, jag håller med och lägger nu bilder, css och javascripts i webbrooten.

När vi ändå pratar om seghet och laddningstid:

Kan jag eller bör jag inte inkludera alla min php-klasser, php-funktioner, javascripts och stylesheets på alla sidor trots att de kanske inte används just på aktuell sida?


echo "<html>\n";
echo "<head>\n";

// All the classes
include "../lib/php_classes/class1.php";
include "../lib/php_classes/class2.php";
include "../lib/php_classes/class3.php";
...

// All the functions
include "../lib/php_functions/function1.php";
include "../lib/php_functions/function2.php";
include "../lib/php_functions/function3.php";
...

// All the javascripts
echo "<script type=\"text/javascript\" src=\"js/javascript1.js\"></script>";
echo "<script type=\"text/javascript\" src=\"js/javascript2.js\"></script>";
echo "<script type=\"text/javascript\" src=\"js/javascript3.js\"></script>";
...

// All the stylesheets
echo "<link rel=\"stylesheet\" href=\"styles/style1.css\" type=\"text/css\" />";
echo "<link rel=\"stylesheet\" href=\"styles/style2.css\" type=\"text/css\" />";
echo "<link rel=\"stylesheet\" href=\"styles/style3.css\" type=\"text/css\" />";
...

echo "</head>\n";
echo "<body>\n";

echo "En fin sida som kanske inte använder allt som inkluderats. Går det långsamt då eller?\n"

echo "</body>\n";
echo "</html>\n";

Påverkar det prestandan nämnvärt? Är det värt mödan att hålla på och kontrollera alla sidor? Hur brukar ni göra?

Medlem sedan juni 20008 205 inlägg
#17

Script- och CSS-filer cachas i webbläsaren och behöver alltså bara laddas första gången man besöker en sida. Om sidans användarmönster innebär att besökarna kommer in från t.ex. en sökmotor, kollar på en sida, och sen inte fortsätter någon vart, är det kanske inte helt optimalt att inkludera allt, eftersom det gör att sidan laddar segare = irriterade användare = mindre sannolikt att de återkommer. Det finns dock ingen nackdel med att bara inkludera det du behöver.

Vad gäller PHP-includes är det lite annorlunda. De måste inkluderas varje gång någon laddar en sida. Disk-I/O är alltid långsamt, och det kommer dra något mer minne, men den främsta anledningen till varför du vill undvika det är för att det blir lättare att få överblick över vad en fil gör om den bara inkluderar det den behöver. Som regel kan man väl säga att en fil ska inkludera exakt det som behöver inkluderas, varken mer eller mindre.

Medlem sedan juni 20003 076 inlägg
#18

Jag kan inge php men i .net så kan man göra en usercontrol som visar ex. ett formulär.
I denna UC kan man sedan i loaden inkludera stylesheetet. Det innebär att stylesheetet bara visas på de sidor som använder UC:n. Det går säker att göra i php med! :)

Sen ang. mappstruktur så gillar jag ordet "Media" som huvudmapp för bilder, dokument, filmer osv.

Medlem sedan jan. 20051 130 inlägg
#19

Ok, då lägger jag en fil include.php i controlls-mappen. Den filen får sedan hålla koll på vad som behövs på vardera sida, typ så här:

// include.php

echo "<link rel=\"stylesheet\" href=\"styles/general.css\" type=\"text/css\" />"; 

if ( $page == 'startsida' )
{
    echo "<link rel=\"stylesheet\" href=\"styles/style1.css\" type=\"text/css\" />"; 
    echo "<script type=\"text/javascript\" src=\"javascripts/javascript1.js\"></script>";
    include "../inc/php_classes/class.enklass.php";
}

elseif ( $page == "kontakta" )
{
    echo "<link rel=\"stylesheet\" href=\"styles/style2.css\" type=\"text/css\" />"; 
    echo "<script type=\"text/javascript\" src=\"javascripts/javascript2.js\"></script>";
    include "../inc/php_classes/class.enannanklass.php";
}

else
{
    ...

Högst upp inkluderar jag sådant som är generellt och behövs på alla sidor.

Nu tycker jag det börjar likna något (exempel):


controls/
    config.php
    include.php

GUI/
    body/
        body.php
        footer.php
        header.php
    pages/
        infosida.php
        kontaktsida.php
        startsida.php

inc/
    php_classes/
        class.user.php
    php_functions/
        function.array.php

public_html/
    graphic/
        logo.jpg
    javascripts/
        showHideObj.js
    styles/
        general.css
        body.css
    index.php

Invändningar?

Fortsätt gärna ge mig fler exempel på hur ni lägger upp det. Det ger bra inspiration!

256 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
116 ms — deklarationer (db)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)
123 ms — ändringar (db)