Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Zasady pisania na forum Pro

Tematy na forum Pro mogą zakładać jedynie moderatorzy. W otwartych tematach może pisać każdy, kto ma coś fachowego do powiedzenia. Wszystkie posty nie wnoszące nic do tematu będą natychmiast usuwane, a ich autorzy dostaną ostrzeżenie.
Jeśli uważasz, że jakiś temat jest warty dyskusji na tym forum, zgłoś go w temacie Propozycje.

2 Stron V   1 2 >  
Reply to this topicStart new topic
> Routery i sposoby routingu, Czyli jak to zrobić wydajnie, a się nie narobić
kwiateusz
post 21.07.2008, 09:31:30
Post #1


Admin Techniczny


Grupa: Administratorzy
Postów: 2 071
Pomógł: 93
Dołączył: 5.07.2005
Skąd: Olsztyn




Zgłoszono zapotrzebowanie na taki temat więc tworzę smile.gif

Myśl przewodnia: "W jaki sposób tworzyć routery na potrzeby naszych aplikacji, jakie są wydajne a jakie nie. Jakich używać a jakich nie używać."
Go to the top of the page
+Quote Post
eai
post 21.07.2008, 10:04:26
Post #2





Grupa: Zarejestrowani
Postów: 367
Pomógł: 10
Dołączył: 20.05.2005

Ostrzeżenie: (0%)
-----


Przeglądając framework Zenda, system Rutowania oparty jest o jeden Router_Rewrite zawierający tablicę obiektów tras, na których poźniej wykonywana jest pętla foreach i każdemu z osobna jest wywoływana metoda $route->match($pathInfo).

Pomysł bardzo wygodny, bo możemy definiować sobie tyle tras różnego rodzaju ile chcemy, implementując oczywiście odpowiedni interfejs. Minusem jest jednak wydajność takiego rozwiązania.

Myśle że lepszym pomysłem byłoby rozdzielić Router_Rewrite na routery:
a) Rewrite (domyślny ostatni w kolejności do sprawdzania router)
- brak magazynowania tras, bo nie byłoby takiej potrzeby ponieważ router wyciąga parametry z tego co dostaje (/onas/kontakt)
B) Static (statyczny router):
- magazynuje tylko statyczne trasy i jej parametry
- brak dynamicznych parametrów
- przechowuje trasy w tablicy a indeksem tablicy jest szablon trasy (np. o-nas,kontakt.html)
- błyskawiczne znajdowanie trasy
c) Static Rewrite (statyczno-dynamiczny router):
- magazynuje tylko statyczne trasy i jej parametry
- możliwość dynamicznych parametrów (id/3)
- przechowuje trasy w tablicy a indeksem tablicy jest szablon(np. /pl/wydarzenia-o-biznesie) trasy (np. /pl/wydarzenia-o-biznesie/id/5 gdzie /pl/wydarzenia-o-biznesie to trasa statyczna a id/5 to dodatkowy parametr dynamiczny)
- dość szybkie znajdowanie tras

d) Regex (rutowanie za pomocą wyrażeń regularnych)
- magazynuje wszelkiego rodzaju trasy i ich parametry
- przechowuje trasy w tablicy a indeksem jest pattern wyrażenia regularnego
- niestety mało wydajne wyszukiwanie - konieczność użycia wyrażeń regularnych

W pierwszej kolejności nasz framework zacząłby od sprawdzania tras statycznych, następnie od statyczno - dynamicznych, potem wyrażenia regularne i na koniec rewrite który wyciąga z urla parametry jeśli nie znaleziono nic w powyższych routerach.

Po testach szybkości:
3 krotnie szybciej routing się wykonuje jeśli mamy 3 routery a trasy i parametry przechowywujemy na tablicach, niż używając jednego routera i przechowywując instancje obiektów tras w jednej tablicy.

Routing oparty o instancje obiektów tras:
Dodanie tras statycznych:0.00089502334594727
Dodanie tras regex:0.0009760856628418
Szukanie tras:0.00070309638977051
Czas całkowity:0.0026209354400635

Routing oparty o 3 routery i tablicę do przechowywania tras i parametrów:
Dodanie tras statycznych:0.00034093856811523
Dodanie tras regex:0.00036096572875977
Szukanie tras:0.00030183792114258
Czas całkowity:0.0010831356048584

Ten post edytował eai 21.07.2008, 10:59:55
Go to the top of the page
+Quote Post
Cysiaczek
post 21.07.2008, 15:46:24
Post #3





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




Mam prośbę: czy mógłbyś wykonać miarodajne testy np. w pętli? Bo obecne mogą być wynikiem działania winampa, albo chwilowego wzrostu obciążenie procka, czy zatkania się danych na FSB ;]

Pozdrawiam.


--------------------
To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness;
chaotic, confused, vulnerability, to inform yourself.
Think for yourself. Question authority.
Go to the top of the page
+Quote Post
eai
post 21.07.2008, 15:49:12
Post #4





Grupa: Zarejestrowani
Postów: 367
Pomógł: 10
Dołączył: 20.05.2005

Ostrzeżenie: (0%)
-----


To były testy w pętli for i <= 100, robiłem testy dla 1000 i dla 1 000 000, dla 1 000 000 tablice ukończyły test w 16 sekund, a instancje obiektow w tablicy nie ukonczyly testu z powodu braku pamięci.
Go to the top of the page
+Quote Post
Sedziwoj
post 23.07.2008, 09:58:10
Post #5





Grupa: Zarejestrowani
Postów: 793
Pomógł: 32
Dołączył: 23.11.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Cytat(eai @ 21.07.2008, 16:49:12 ) *
To były testy w pętli for i <= 100, robiłem testy dla 1000 i dla 1 000 000, dla 1 000 000 tablice ukończyły test w 16 sekund, a instancje obiektów w tablicy nie ukończyły testu z powodu braku pamięci.


To zadbaj o ten wyciek pamięci, bo każdy obrót pętli powinien być na "świeżo", ponieważ w normalnym użytkowaniu Router jest tylko raz wywoływany.
Ja bym szybciej rozdzielił rodzaje tras, może nawet na takie co wymieniłaś, i odpowiednio je kolejkował.

Mnie jeszcze zastanawia wielopoziomowe przekierowanie, czyli wykorzystanie tylko części informacji, a dalsze dobieranie akcji już odbywa się na poziomi niżej. (nie jestem pewien ale coś jak urls w Django)


--------------------
Algorytmy w PHP, czy ktoś o tym słyszał?
Dlaczego tak mało kobiet programuje? ponieważ nie zajmują się głupotami.
Go to the top of the page
+Quote Post
SHiP
post 31.07.2008, 10:41:15
Post #6





Grupa: Zarejestrowani
Postów: 697
Pomógł: 47
Dołączył: 19.12.2003
Skąd: Lublin

Ostrzeżenie: (0%)
-----


Ja swój router oparłem o dynamiczne dobieranie typów. Pierwsze 2 parametry adresu tj. /klasa/metoda to nic innego jak odwolania do konkretnego controllera i jego metody. Pozostałe dane z adresu dobiera juz sobie indywidualnie controller podajac tablice typow np.

Kod
id => integer
title => string
mydate => date


Dzieki temu aplikacja moze dzialac w kilku różnych trybach np.

/klasa/metoda/1/tytul/2008-07-31
/klasa/metoda/2008-07-31/tytul/1
/klasa/metoda/2008-07-31/1/tytul
itd.

Oczywiście mam tez system linków, dzięki którym router sam dobiera wszystkie lub tylko część parametrów adresu.
Tak więc u mnie jest to uklad statyczno-dynamiczny(linki) a nastepnie dynamiczny.

Przemielanie ogromnej tablicy w poszukiwaniu odpowiedniego wzorca adresu to imho pomyłka. Tak routera tworzyc się nie powinno. Zmniejsza to elastyczność(tworząc controller trzeba edytować konfiguracje routera) i działa duużo wolniej.

Tworzenie routera obslugującego tylko skladnię opartą o rewrite również jest dziwne(żechyba robi się aplikacje na własny użytek) Dobrze jest zrobić 2 tryby adres.pl/zmienne oraz adres.pl/index.php?/zmienne

Ten post edytował SHiP 31.07.2008, 10:42:50


--------------------
Warsztat: Kubuntu, PhpStorm, Opera
Go to the top of the page
+Quote Post
Sedziwoj
post 31.07.2008, 14:06:06
Post #7





Grupa: Zarejestrowani
Postów: 793
Pomógł: 32
Dołączył: 23.11.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


@SHiP
Wiesz, można mieć tak że jest obiekt który tłumaczy dane wejściowe (czy to z URL, konsola czy jakkolwiek) i dopiero potem przekazuję te informacje obiektowi który uruchamia odpowiednią akcję. Takie rozdzielenie pozwala zmieniać, skąd dane pochodzą, niezależnie od tego jak są wykorzystywane przy uruchamianiu odpowiednich akcji.


--------------------
Algorytmy w PHP, czy ktoś o tym słyszał?
Dlaczego tak mało kobiet programuje? ponieważ nie zajmują się głupotami.
Go to the top of the page
+Quote Post
splatch
post 9.09.2008, 08:02:23
Post #8





Grupa: Zarejestrowani
Postów: 487
Pomógł: 7
Dołączył: 7.01.2004
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Bardzo dobry routing posiada Agavi, opis w dokumentacji i manualu.

Ten post edytował splatch 9.09.2008, 08:17:45


--------------------
Łukasz Dywicki
Independent Java and open source software consultant.
Blog - Java, OSGi, integracja oprogramowania..
Go to the top of the page
+Quote Post
jarek_bolo
post 9.09.2008, 15:26:44
Post #9





Grupa: Zarejestrowani
Postów: 149
Pomógł: 12
Dołączył: 3.03.2008
Skąd: łódzkie

Ostrzeżenie: (0%)
-----


W Kohanie integrują Routing oparty na tym: http://dev.horde.org/routes/
Całkiem rozbudowany system routingu.


--------------------
"Jeden człowiek nie zmieni świata, ale jeden człowiek może przekazać informację która zmieni świat." - David Icke
| PAMIĘTAJ, JESTEŚ POLAKIEM !!! |
Jam jest Polska, Ojczyzna Twoja, ziemia Ojców, z której wzrosłeś. Wszystko, czym jesteś, po Bogu - mnie zawdzięczasz!!
Go to the top of the page
+Quote Post
bigZbig
post 21.10.2008, 18:33:01
Post #10





Grupa: Zarejestrowani
Postów: 740
Pomógł: 15
Dołączył: 23.08.2004
Skąd: Poznań

Ostrzeżenie: (0%)
-----


Cytat(SHiP @ 31.07.2008, 11:41:15 ) *
...Dzieki temu aplikacja moze dzialac w kilku różnych trybach np.

/klasa/metoda/1/tytul/2008-07-31
/klasa/metoda/2008-07-31/tytul/1
/klasa/metoda/2008-07-31/1/tytul
itd.


Jeśli cię dobrze zrozumiałem do jednego zasobu możesz dzięki temu stworzyć 3 różne linki, które pokarzą to samo. Osobiście proponowałbym zaimplementowanie mechanizmu, który do danego zasobu umożliwi stworzenie tylko jednego linka. Każda zmiana w linku powinna prowadzić do innego zasobu albo też zwracać kod 404. Jest to niezwykle istotne z punktu widzenia pozycjonowania stron.


--------------------
bigZbig (Zbigniew Heintze) | blog.heintze.pl
Go to the top of the page
+Quote Post
Sedziwoj
post 21.10.2008, 22:51:19
Post #11





Grupa: Zarejestrowani
Postów: 793
Pomógł: 32
Dołączył: 23.11.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


@bigZbig
Nie chodzi o to aby wykorzystywać wiele różnych linków w aplikacji, ale aby router umożliwiał użycie takich jakie mamy ochotę i zmianę, jeśli jest taka potrzeba.
Po zmianie stare linki też powinny funkcjonować, więc nie powinno się ich po prostu pozbywać.

Ten post edytował Sedziwoj 21.10.2008, 22:51:50


--------------------
Algorytmy w PHP, czy ktoś o tym słyszał?
Dlaczego tak mało kobiet programuje? ponieważ nie zajmują się głupotami.
Go to the top of the page
+Quote Post
Sh4dow
post 22.10.2008, 10:04:23
Post #12





Grupa: Zarejestrowani
Postów: 569
Pomógł: 0
Dołączył: 17.08.2003
Skąd: Dąbrowa Górnicza

Ostrzeżenie: (0%)
-----


Nie wiem ale czasami takiego sposobu rozwiązywania routerów nie pojmuje. Może jest to pro ale jak dla mnie czasami mało elastyczne. Nie chce się spierać czy robię lepiej czy nie, po prostu przedstawię to co ja kiedyś zrobiłem i używam do dziś.
Każdy URL jaki przychodzi do aplikacji leci przez 'index.php', nie wliczając URL'i które są fizycznie istniejącymi plikami lub katalogami. układ URL'a to '/nazwaKlasyAkcji/dowolna/ilosc/parametrow'.
Każda klasa akcji ma swój własny (ja sobie to tak nazywam) miniRouter który na podstawie dowolnych parametrów wywołuje określoną metodę, która wykonuje resztę działań.
Wady to to ze miniRouter należało by definiować dla każdej klasy. Zalety to możliwość tworzenia miniRouterów dla kazdej z klasy i nie działanie na sztywnych schematach co czasami nie jest wygodne.
Pewnie to kiedyś sie rozwinie i może dojdą jakieś gotowe schematy ale na chwile obecna działa i to mnie cieszy smile.gif


--------------------
Warsztat: Linux: PHP, MySQL, Apache, NetBeans, C++, Qt-Creator
Użytkownik, słowo którego specjaliści IT używają, gdy chcą powiedzieć idiota
Zarządzaj swoim budżetem domowym
Go to the top of the page
+Quote Post
bigZbig
post 24.10.2008, 14:46:52
Post #13





Grupa: Zarejestrowani
Postów: 740
Pomógł: 15
Dołączył: 23.08.2004
Skąd: Poznań

Ostrzeżenie: (0%)
-----


Cytat(Sedziwoj @ 21.10.2008, 23:51:19 ) *
Po zmianie stare linki też powinny funkcjonować, więc nie powinno się ich po prostu pozbywać.

Po zmianie stary link powinien zwracać nagłówek 301 Moved Permanently (Zasób trwale przeniesiony) i wskazać nowy link do zasobu

Ten post edytował bigZbig 24.10.2008, 14:47:41


--------------------
bigZbig (Zbigniew Heintze) | blog.heintze.pl
Go to the top of the page
+Quote Post
Sedziwoj
post 27.10.2008, 10:38:42
Post #14





Grupa: Zarejestrowani
Postów: 793
Pomógł: 32
Dołączył: 23.11.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Cytat(bigZbig @ 24.10.2008, 15:46:52 ) *
Po zmianie stary link powinien zwracać nagłówek 301 Moved Permanently (Zasób trwale przeniesiony) i wskazać nowy link do zasobu


Czyli mówisz to co ja, powinien nadal działać.


--------------------
Algorytmy w PHP, czy ktoś o tym słyszał?
Dlaczego tak mało kobiet programuje? ponieważ nie zajmują się głupotami.
Go to the top of the page
+Quote Post
Moli
post 29.12.2008, 21:39:15
Post #15





Grupa: Zarejestrowani
Postów: 662
Pomógł: 45
Dołączył: 26.03.2007
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


W temacie ostatnio nikt nie pisze, więc opiszę w jaki sposób ja robie router smile.gif U mnie wszystko opiera się na wyrażeniach regularnych, jeśli jest to domena główna to pobiera tablicę z pliku:
Cytat
config/router.php

jeśli subdomena (np. xxx.nazwa.pl) to:
Cytat
config/router/xxx.php

jeśli adres to nazwa.pl/admin/.... to:
Cytat
config/router/admin.php


Tablica z routerem wygląda tak:

  1. <?php
  2.  
  3. $router = array(
  4. 'wyrazenie' => array(kontroler,metoda,[opcjonalna tablica ze stalymi elementami]),
  5. );
  6.  
  7. ?>


jeśli w adresie mamy jakieś parametry zmienne pobrane z wyrażenia regularnego to przekazujemy je do danej metody w danym kontrolerze, elementy stale sa tak samo przekazywane. Elementy stałe wydają się mało potrzebne, ale chodzi o to że mam np. metodę wyświetlająca jakieś wiadomości i chce zrobić na tym samym kontrolerze wyświetlanie elementow z archiwum, wtedy daje jako parametr stały
  1. <?php
  2. array('isdelete'=>true),
  3. ?>

i w metodzie jednym ifem zmieniam pobieranie danych z modelu czy przekazanie do dbgrida smile.gif

Jest to jedno z fajniejszych (jak dla mnie) rozwiązań, zawszę mogę zmienić format danego adresu bez większych zmian w kontrolerach czy metodach smile.gif
Go to the top of the page
+Quote Post
wlamywacz
post 30.12.2008, 15:01:24
Post #16





Grupa: Zarejestrowani
Postów: 535
Pomógł: 27
Dołączył: 3.05.2005

Ostrzeżenie: (20%)
X----


No i może ja swój router opiszę. Zasada jego działania opiera się na zwykłym explode" title="Zobacz w manualu PHP" target="_manual. Czyli:
Cytat
www.domena.pl/admin-users/create/
lub
Cytat
www.domena.pl/admin/index/

Pierwsza zmienna (admin-users lub admin) to nazwa obiektu kontrolera który ma zostać utworzony. Jeśli jest to tablica, następuje znowu użycie funkcji explode" title="Zobacz w manualu PHP" target="_manual i wychodzi na to że nasz kontroler znajduje się aplication/controllers/adminControllers/usersController.php. Chodziło dokładnie mi o to że mogę tworzyć coś w rodzaju modułów do poszczególnych kontrolerów. Następna zmienna (create lub index) to nazwa funkcji którą ma zostać wywoła, w przypadku jej braku odpala defaultFunction. Następne zmienne są przekazywane jako parametry odpowiednią funkcją i to na tyle smile.gif
Go to the top of the page
+Quote Post
bim2
post 13.01.2009, 23:25:59
Post #17





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 152
Dołączył: 9.04.2006
Skąd: Berlin

Ostrzeżenie: (0%)
-----


To może ja zapodam już gotowy Router. Pewnie jest do zrobienia parę zmian/dodatków ale swoją podstawową funkcję spełnia. smile.gif

http://hernass.pl/download/entry-b9e3dca91...0719b6ae3a2.htm

Pewnie niektórzy mają sprawniejsze pomysły, ale na razie udało mi się napisać coś takiego. smile.gif

Ten post edytował bim2 13.02.2009, 16:50:38


--------------------
Go to the top of the page
+Quote Post
bigZbig
post 13.02.2009, 15:09:52
Post #18





Grupa: Zarejestrowani
Postów: 740
Pomógł: 15
Dołączył: 23.08.2004
Skąd: Poznań

Ostrzeżenie: (0%)
-----


@bim2 Widze, że coś podobnego do rootera w Zend Frameworku wykombinowałeś. Ja próbuję zrobić rooter który działa na podobnej zasadzie co Twój tylko, żeby nie trzeba było nazw zmiennych w url-u podawać. Poszczególne zmienne są rozpoznawane na podstawie ich położenia w ścieżce.


--------------------
bigZbig (Zbigniew Heintze) | blog.heintze.pl
Go to the top of the page
+Quote Post
bim2
post 13.02.2009, 15:53:11
Post #19





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 152
Dołączył: 9.04.2006
Skąd: Berlin

Ostrzeżenie: (0%)
-----


W sumie można dopisać do tych confingu które położenie jak nazywa się zmienna smile.gif Albo w skrypcie podawać po kolejnosci zmiennej, tylko to tyle roboty co dodanie kolejnych sposobów routingu smile.gif


--------------------
Go to the top of the page
+Quote Post
Helid
post 10.02.2010, 19:01:33
Post #20





Grupa: Zarejestrowani
Postów: 280
Pomógł: 20
Dołączył: 12.12.2007
Skąd: 127.0.0.1

Ostrzeżenie: (0%)
-----


Najpraktyczniejszym rozwiązaniem jest już powyżej wspominane "sprawdzanie etapowe":
- strony statyczne (/rejestracja.html na moduł register, akcje home)
- wyrażenie regularne (/([a-z]).html na page, akcje view z parametrem $1)
- wszystkie pozostałe na moduł home, 404 itd
Wszystko pięknie działa, a możliwości konfiguracji praktycznie nieograniczone


--------------------
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.03.2024 - 05:59