Witam,
Pisze wlasnie dosc rozlegla aplikacje i mam pytanie ktore podejscie jest bardziej przyszlosciowe, bardziej profesjonalne...pisanie skyptow poszczegolnych podstron w osobnych plikach czy raczej umieszczanie calej strony w jednym pliku index.php i wybieranie poszczegolnych polecen programu za pomoca GET'a? Mi to akurat obojetne, ale chcialbym stosowac nowoczesniejsza i bardziej polecana technike, wiec prosze o wypowiedzi.
Dzieki
Ps:
Przyklad ktory pokaze o co mi chodzi:
przechodzimy do rejestracji:
albo wchodzimy na strone rejestracja.php i tam caly skypt
albo za pomoca GET ustawiamy index.php?metoda=rejestracja
Pro -> php
Wg mnie jest to kwestia tylko i wylacznie inwidualnych upodoban.
Speedy
6.01.2006, 00:12:21
Zgadzam się z przedmówcą

. Poza tym możesz się zainteresować tzw. Nice URL-s, wokół których w ostatnim czasie było trochę szumu

.
sobstel
6.01.2006, 16:50:51
osoboscie uwazam, ze jesli chodzi o elastycznosc aplikacji, to wszystko w index.php jest najlepszym rozwiazaniem, ale to moje zdanie i jak zauwazyli przedmowcy kazdy moze miec inne. nie ma zlotej reguly na tworzenie aplikacji. najlepsza zasada to chyba to zeby programowac w ten sposob ktory nam najlatwiej (chyba ze akurat sie czegos uczymy). proste, ale jakze prawdziwe ;-)
btw. najlatwiej pisac jak i pozniej rozbudowywac oczywiscie
ActivePlayer
6.01.2006, 16:55:14
jesli nie piszesz obiektowo to zapewne jest tak:
albo masz index.php i w nim switch wg id i require odpowiedniego pliku.
albo masz kazdy plik z osobna i do tego jakis 'init.php' or sth.
i tu i tu tak czy siak trzymasz kod odpowiedzialny za odpowiednie akcje w osobnych plikach... no chyba ze chcesz schowac caly serwis do pliku index.php ale to troche

no hmm..
osobiscie wole robic podstrone na zasadzie modulow:
w indeksie lacze sie z baza danych, wczytuje konfuguracje, dolanczam klasy, tworze potrzebne obiekty (smarty, pdo ...) i includuje podstrone przeslana w tablicy $_get (index.php?mod=podstrona). jak juz stworze ten JEDEN plik to z RESZTA nie bede mial klopoty. wystarczy tylko zajac sie pisanie zawartosci podstrony
Tak jak reszta uważam że jest to osobiste upodobanie.
Ja z kolei wszystko "pcham" do jednego pliku typu index.php ale dlatego, że pisze na frameworku Mojavi, który jest tak zoranizowany. Niemniej jednak nie przeszkadza mi to w żaden sposób.
athabus
6.01.2006, 18:33:35
Ja nie jestem pro, ale też się wypowiem:-)
Do tej pory pisałem stylem "każda strona osobno", ale moim zdaniem to trochę uciążliwe jest.
Ostatnio właśnie w ramach treningu piszę sobie mały portalik i chciałem zobaczyć jak tą kwestię rozwiązują cms'y. Wybrałem mambo (wiem że to nie najlepszy wybór

) i "podpatrzyłem" u nich sposób z index?skrypt. Powiem tak - niby różnica mała, ale dla mnie to jest o wiele wygodniejsze - jakoś łatwiej można utrzymać porządek w aplikacji. Ale to tylko takie subiektywne odczucie.
Speedy
6.01.2006, 18:51:07
Obecnie jestem w trakcie pisania systemu dla pewnej strony i postanowiłem sobie tam wszystko zorganizować następująco:
w pliku index.php mam kolejno: uruchomienie ładowania klas, tworzenie odpowiednich obiektów (przez jedną z załadowanych klas), połączenie się z bazą danych, uruchomienie routera (nice urls), uruchomienie metody odpowiedzialnej za pobieranie danych, która jest uwarunkowana parametrami podanymi przez użytkownika w adresie, wyświetlenie szablonu (smarty).
i tak w większości wszystko sprowadza się do dodania wpisów typu:
$core->news->show_all($category);
a sam plik jest niewielki, bo nie ma sensu wszystkiego do niego pchać ;-).
ghostrider
8.01.2006, 11:35:15
a ja sadze ze to nie kwestia upodobań czy frameworka na którym pracujemy ale wymagań serwisu ktory tworzymy.
Chodzi dokladnie o obciazenia jakim bedzie poddawany serwis. Jesli mamy do czynienia z serwisem ktory ma wytrzymac 5 hitow na sekunde to puszczanie wszystkiego przez index.php przysporzy nie lada problemow. Wtedy dobrze jest rozłożyć nieco to obciaczenie, aby unikac waskiego gardla. Jesli serwis nie bedzie tak obciazony to nie ma problemu, wszystko na index.php i gra gitara
~ghostrider obciążenie i architektura skryptu (jeden czy wiele plików) mają się nijak do siebie.
ghostrider
8.01.2006, 16:48:17
rozwin temat,
jesli to ma byc dyskusja, a nie niczym niepoparte stwierdzenia.
Obciazenie serwisow to wazny aspekt projektowania skryptow.
Pewne rzeczy beda dzialy sie gdy naprzyklad uzytkownik odwiedzi glowna strone, ale juz inne kiedy przeglada listy uzytkownikow ( obydwie rzeczy beda mialy oczywiscie czesc wspolna)
Cytat
jesli mamy do czynienia z serwisem ktory ma wytrzymac 5 hitow na sekunde to puszczanie wszystkiego przez index.php przysporzy nie lada problemow.
Na jakiej podstawie tak twierdzisz

Kilkukrotne przetworzenie index.php czy kilku innych plikow pojedynczo - co za roznica
ghostrider
8.01.2006, 17:21:53
otrzymanie żądanie >----- czas -------> otrzymanie odpowiedzi
w przypadku jednego pliku w ktorym skrypt musi przetworzyc duzo 'wszystkiego" wydluzy czas otrzymania odpowiedzi a to oznacza zwiekrzenie obciazenia serwera.
poprawcie mnie bo czlek omylne zwierze, ale tak to widze.
Testowalem tez troche uzywajac Web Stress Tool microsoftu i to potwierdzilo moje przypuszczenia
im szybciej serwer zwolni zaspoby tym szybciej upora sie z kolenymi zadanimi
Athlan
8.01.2006, 17:24:47
Moim zdaniem lepiej jest za pomocą $_GET, ponieważ nie ma tylu plików... masz tylko index.php z samym include() no i funkcje w jakimś osobnym pliku... do index.php wrzucasz jakieś HTML, metatagi itp. No jak chcesz takie coś jak rejestracja.php... no to syfisz server plikami, ja wole mieć poukładane pliki, ale to jest kwestia gustu...
PS. W $GET ładnie wygląda

Edit.
Oczywiście zgadzam się w 100% ze zdaniem
ghostrider.
ghostrider
8.01.2006, 17:44:16
tu nie chodzi o 'syfienie' plikami ale o tworzenie roznych 'puknktow wejscia" do naszej aplikacji, tak aby rozładować napięcie.
Decyzja o takim czy innym podejesciu jest podejmowana juz na poczatku. (jeszcze w fazie kartki i ołówka).
Tu nie chodzi o dwa obozy 'jednoplikowcy' i 'wieloplikowcy', ale o swiadome decyzje jakie programista musi podjac zanim napisze pierwsza linie kodu
yavaho
8.01.2006, 18:07:43
A jaka jest roznica w wydajnosci czy obciazeniu serwera w tych dwuch przykladach ponizej? Powiedzmny ze tak wyglada plik index.php tylko ze jest o wiele bardziej rozbudowany.
Czy jest roznica w ilosci lini kodu jaki praser musi przetrawic?
Czy jest roznica w ilosci zajetej pamieci operacyjnej na serwerze?
Bo napewno jest pewne opoznienie w drugim przykladzie spowodowane odszukaniem na dysku i załadowaniem do pamieci nastepnego pliku.
<?php
switch($_GET['id']){
case 0:
//kilkadziesiat lini kodu
break;
case 1:
//kilkadziesiat lini kodu
break;
}
?>
<?php
switch($_GET['id']){
case 0:
include('plik0.php');
break;
case 1:
include('plik1.php');
break;
}
?>
ghostrider
8.01.2006, 18:16:05
parser php jest dwu biegowy:
najpierw przeglada caly kod, potem go wykonuje
wiec zawsze "widzi" tyle samo lini kodu.
Pamiec przydzielana jest w miare potrzeb, dlatego tez jest max_execution_time i memory_limit aby nie zeżreć wszystkiego.
jesli includujemy pliki to liczy sie tez szybkosc dykow twardych
Athlan
8.01.2006, 18:18:17
Moim zdaniem w przypadku drugim jest większy problem, bo plik musi być odszukany i dołączony. Lepiej chyba robić bez include, ale stosuje się to dla czystrości kodu. Żeby poprostu nie było nawalone w kodzie... jak chcemy szybko coś zedytować (poprawić) to nie musimy szukać w jednym pliku... do czegoś zrobili to include

No ale nie przesadzajmy z include 10 razy...
A i zamiast include możnaby było użyć require_once(); szybciej łazi

(testowałem na microtime)
ghostrider
8.01.2006, 18:21:58
wreszcie jakies konstruktywne wypowiedzi!
brawo Athlan: nie przypuszczaj - ZMIERZ!
dla zainteresowanych:
http://www.amazon.com/gp/product/013147149...=books&v=glanceswietna pozycja, od developerow php
mozna sie z niej dowiedziec co sie tak na[rawde dzieje
@ghostrider:
Cytat
jesli mamy do czynienia z serwisem ktory ma wytrzymac 5 hitow na sekunde to puszczanie wszystkiego przez index.php przysporzy nie lada problemow.
Nawet jeśli by tak było, to przecież w tych osobnych plikach i tak będzie prawodpodobnie include'owany/require'owany jakiś inny plik, wspólny dla wszystkich "podstron", nie?
Tak więc będziemy np. mieć
plik_odpowiedzialny_za_rejestracje.php
jakis_tam_inny.php
..to i tak każdy plik z osobna będzie wywoływał np. 'header.php', więc ten 'header.php' też będzie miał 5 hitów/sek.
Poza tym w takich sytuacjach powinno się pomyśleć o jakimś cache'owaniu (i przy okazji: przy cacheowaniu nie jest problemem, że index.php jest wywoływany tak często..)
yavaho
8.01.2006, 18:55:43
Cytat(ghostrider @ 2006-01-08 19:16:05)
parser php jest dwu biegowy:
najpierw przeglada caly kod, potem go wykonuje
A więc includuje i otwiera te pliki z ktorych kod nawet nie zostanie przetworzony?
Chce wiedziec (na przykładzie mojego kodu powyzej) jezeli $_GET['id']=0 to czy praser zaladuje do pamieci plik: "plik1.php" i inne pozostałe includowane pliki, z ktorych kod nie bedzie przetwarzany w momenie wywolania tej strony?
sobstel
8.01.2006, 19:39:19
Cytat(yavaho @ 2006-01-08 18:55:43)
Cytat(ghostrider @ 2006-01-08 19:16:05)
parser php jest dwu biegowy:
najpierw przeglada caly kod, potem go wykonuje
A więc includuje i otwiera te pliki z ktorych kod nawet nie zostanie przetworzony?
Chce wiedziec (na przykładzie mojego kodu powyzej) jezeli $_GET['id']=0 to czy praser zaladuje do pamieci plik: "plik1.php" i inne pozostałe includowane pliki, z ktorych kod nie bedzie przetwarzany w momenie wywolania tej strony?
mozesz to prosto sprawdzic samemu wywolujac na koncu
get_included_files" title="Zobacz w manualu php" target="_manual
yavaho
8.01.2006, 20:57:40
Trudno od Was wyciagnac konkretne informacje

Wiec sam sobie sprawdzilem.
<?php
switch($_GET['id']){
case 0:
//kilkadziesiat lini kodu
break;
case 1:
//kilkadziesiat lini kodu
break;
}
?>
W tym przypadku parser analizuje caly kod bez wzgledu na to czy kod zostanie wykoany czy nie. A wiec laduje do pamieci powiedzmy 100 razy wiecej kodu niz naprawde jest potrzebne do wygenerowania danej strony www.
<?php
switch($_GET['id']){
case 0:
include('plik0.php');
break;
case 1:
include('plik1.php');
break;
}
?>
A w przypadku includowanych plikow nie bierze pod uwage kodu, z tych plikow, z ktorych kod nie bedzie potrzebny do przetworzenia.
Sprawdzilem to poleceniem, ktore mi posunal @sopel jak i rowiez po przez umyslne wprowadziene blednego kodu do tych czesci kodu, ktory nie bedzie przetwarzany w danej chwili i sprawdzenie czy parser wywali bledy.
A wiec na razie mam taki z tego wniosek, ze nie nalezy trzymac duza ilosc kodu w jednym pliku w przypadkach kiedy tylko mala czesc z tego kodu bedzie wykonana do wygenerowania strony.
halfik
8.01.2006, 21:05:47
wszystko w osobnych plikach i includowanie.
rozbijanie kodu na wzglednie duza ilosc plikow zwieksza czytelnosc tego kodu.
modularyzacja oparta na duzych plikach przysparza pewnych problemow - jesli projekt jest duzy i tych plikow robia sie setki - ale to i tak lepsze niz przegladania 20 stron kodu jednego pliku.
jesli masz projekt, wyszczegolniach jego jednostki i dobrze jest kazda z nich miec w osobnym pliku, niezalenznie od tego czy to pojedyncza funkcja, klasa czy cokolwiek innego.
pozniej latwo to znalezc, a jak sie modyfikuje kod i cos po modyfikacji sie sypnie od razu wiadomo gdzie sie zrobilo blad i nie trzeba przegladac ton kodu.
zalet jest wiecej, ale to zauwazysz w praktyce
bigu
12.01.2006, 21:04:00
Heja!
Posluchalem waszej rady i robie na include, jednak napotakalem pewien problem. Otoz w swojej apliakcji mam 3 rodzajow userow: niezalogowany, zwykly i admin. Poszczegolne menu wywoluje w ten sposob ze mam index.php?req=1 i to jest na przyklad logowanie. Tyczy sie ono wszystkich i kazdy moze wywlac ten skrypt (ktory jest w pliku include)
<?php
switch($req)
{
case 1:
include('logowanie.php');
break;
case 2:
include('rejestracja.php');
break;
....
}
?>
Jednak jezeli nie jestem adminem to nie powinienem moc wykonywac rejestracji. Nie ma tego w menu usera zwyklego ani niezalogowanego, jednak mozna wpisac recznie w pasek ?req=2 i wtedy skypt mozna wywolac...Wiem ze moge dac w skrpycie zabezpieczenie ze jak ktos napisze ?req=2 i nie jest adminem to go wywala.
np:
<?php
if ($usertype=='a')
{
....kod rejestracji
}
else
{
echo "Nie tu twoje miejsce"; header("Location: http://".$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF'])."index.php"); }
?>
Rozwazam takze druga opcje. Ze stworze najpierw switcha z wyborem usera a pozniej odpowidniego z wyborem opcji, czyli:
<?php
switch($usertype)
{
case 'u':
include('user.php');
break;
case 'a':
include('admin.php');
break;
case 'un':
include('nizalogowany.php');
}
?>
i dopiero wtedy w pliku np. user.php wywalac odpowiedni req
plik user.php:
<?php
switch($req)
{
case 1:
include('logowanie.php');
break;
case 2:
include('costamcostam.php');
break;
....
}
?>
Ktore rozwiazanie jest lepsze wg. Was? i czy w ogole dobrze mysle, a moze jakos inaczej to zastosowac? Moze jest jakies trzezcie wyjscie.
Podzielcie sie uwagami i dzieki!
bigZbig
13.01.2006, 09:18:49
Panowie widze ze odeszliscie od pierwotnego problemu ktory nie brzmial czy wywolywac strone zawsze poprzez pojedynczy plik np. index.php czy tez dla poszczegolnych stron tworzyc osobne pliki.
Wasza dotychczasowa dyskusja przypomina powrot do dziecinstwa. Kto rozsadny trzyma cala tresc strony w jednym pliku. Wiadomo ze includowania sie nie uniknie (no chyba ze przy bardzo malej witrynie), problem polega jednak na tym czy chcac sie dostac do dwoch roznych artykulow wpisze w przegladarce za kazdym razem index.php z odpowiednimi parametrami czy tez za pierwszym razem art1.php a za drugim art2.php?
Moim zdaniem trzeba te metody troszke polaczyc. Wyswietlajac newsy nie bede dla kazdego tworzyl osobnej podstrony, ale przechodzac np. do forum zmieniam plik wywolywany. Oczywiscie w ramach forum znow odwoluje sie do tego samego adresu (nie liczac roznych parametrow).
Cytat(athabus @ 2006-01-06 19:33:35)
Ja nie jestem pro, ale też się wypowiem:-)
Do tej pory pisałem stylem "każda strona osobno", ale moim zdaniem to trochę uciążliwe jest.
Ostatnio właśnie w ramach treningu piszę sobie mały portalik i chciałem zobaczyć jak tą kwestię rozwiązują cms'y. Wybrałem mambo (wiem że to nie najlepszy wybór

) i "podpatrzyłem" u nich sposób z index?skrypt. Powiem tak - niby różnica mała, ale dla mnie to jest o wiele wygodniejsze - jakoś łatwiej można utrzymać porządek w aplikacji. Ale to tylko takie subiektywne odczucie.
Kolego "kazda strona osobno" to naprawde nie problem. Chodzi tylko o to aby czesc kodu wspolna dla wszystkich podstron includowac a nie powielac w kazdym pliku.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę
kliknij tutaj.