Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Jak lepie pisac? Skypty osobno czy index.php?skypt
Forum PHP.pl > Forum > PHP
bigu
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
NuLL
Pro -> php

Wg mnie jest to kwestia tylko i wylacznie inwidualnych upodoban.
Speedy
Zgadzam się z przedmówcą snitch.gif. Poza tym możesz się zainteresować tzw. Nice URL-s, wokół których w ostatnim czasie było trochę szumu winksmiley.jpg.
sobstel
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
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 smile.gif no hmm.. smile.gif
dtb
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
mike
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
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 biggrin.gif ) 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
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
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
mike
~ghostrider obciążenie i architektura skryptu (jeden czy wiele plików) mają się nijak do siebie.
ghostrider
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)
NuLL
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 questionmark.gif Kilkukrotne przetworzenie index.php czy kilku innych plikow pojedynczo - co za roznica questionmark.gif
ghostrider
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
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 tongue.gif

Edit.

Oczywiście zgadzam się w 100% ze zdaniem ghostrider.
ghostrider
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
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.
  1. <?php
  2. switch($_GET['id']){
  3.  case 0:
  4.   //kilkadziesiat lini kodu
  5.  break;
  6.  case 1:
  7.   //kilkadziesiat lini kodu
  8.  break;
  9. }
  10. ?>
  1. <?php
  2.  
  3. switch($_GET['id']){
  4.  case 0:
  5.   include('plik0.php');
  6.  break;
  7.  case 1:
  8.   include('plik1.php');
  9.  break;
  10. }
  11. ?>
ghostrider
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
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 smile.gif

No ale nie przesadzajmy z include 10 razy...

A i zamiast include możnaby było użyć require_once(); szybciej łazi smile.gif (testowałem na microtime)
ghostrider
wreszcie jakies konstruktywne wypowiedzi!

brawo Athlan: nie przypuszczaj - ZMIERZ!

dla zainteresowanych:
http://www.amazon.com/gp/product/013147149...=books&v=glance
swietna pozycja, od developerow php
mozna sie z niej dowiedziec co sie tak na[rawde dzieje
qbuz
@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
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
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
Trudno od Was wyciagnac konkretne informacje smile.gif Wiec sam sobie sprawdzilem.
  1. <?php
  2. switch($_GET['id']){
  3.  case 0:
  4.   //kilkadziesiat lini kodu
  5.  break;
  6.  case 1:
  7.   //kilkadziesiat lini kodu
  8.  break;
  9. }
  10. ?>
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.
  1. <?php
  2. switch($_GET['id']){
  3.  case 0:
  4.   include('plik0.php');
  5.  break;
  6.  case 1:
  7.   include('plik1.php');
  8.  break;
  9. }
  10. ?>
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
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 smile.gif
bigu
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)

  1. <?php
  2.  
  3.  switch($req)
  4.  {
  5.  case 1:
  6. include('logowanie.php');
  7. break;
  8.  case 2:
  9. include('rejestracja.php');
  10. break;
  11. ....
  12. }
  13.  
  14. ?>


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:

  1. <?php
  2.  
  3. if ($usertype=='a')
  4. {
  5. ....kod rejestracji
  6. }
  7. else
  8. {
  9.  echo "Nie tu twoje miejsce";
  10.  header("Location: http://".$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF'])."index.php");
  11. }
  12.  
  13. ?>


Rozwazam takze druga opcje. Ze stworze najpierw switcha z wyborem usera a pozniej odpowidniego z wyborem opcji, czyli:

  1. <?php
  2.  
  3.  switch($usertype)
  4.  {
  5.  case 'u':
  6. include('user.php');
  7. break;
  8.  case 'a':
  9. include('admin.php');
  10. break;
  11.  case 'un':
  12. include('nizalogowany.php');
  13. }
  14.  
  15. ?>


i dopiero wtedy w pliku np. user.php wywalac odpowiedni req

plik user.php:


  1. <?php
  2.  
  3.  switch($req)
  4.  {
  5.  case 1:
  6. include('logowanie.php');
  7. break;
  8.  case 2:
  9. include('costamcostam.php');
  10. break;
  11. ....
  12. }
  13.  
  14. ?>


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
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 biggrin.gif ) 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.
Invision Power Board © 2001-2025 Invision Power Services, Inc.