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.

> Włączanie plików + autoloader, chętnie bym posłuchał ciekawych pomysłów
hawk
post 10.02.2005, 17:23:52
Post #101





Grupa: Zarejestrowani
Postów: 521
Pomógł: 0
Dołączył: 3.11.2003
Skąd: 3city

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


Problem stary jak świat: system wymaga włączenia sporej liczby plików i zarządzanie tym jest upierdliwe. Do tego nie należy włączać więcej kodu niż potrzeba, a najlepiej zrobić jakieś lazy load.

Oczywiście, technik jest wiele:

1) require_once rozsiane po plikach, najlepiej poprzedzone jakąś stałą, np. require_once ROOT_DIR . '/foo/Foo.class.php';

2) Prado: deklarujemy namespacy - np. za pomocą funkcji using(), co dodaje nam ścieżki do include_path, a potem niech php znajdzie klasę.

3) Autoloader + mapa (nazwa klasy => ścieżka do pliku); autoloader wczytuje mapę i na jej podstawie jest w stanie znaleźć każdą klasę

Są jeszcze jakieś inteligentne sposoby? Dobry mechanizm powinien być odporny na "przemeblowanie" struktury plików (np. chcemy połączyć kilka klas w jeden plik).

BTW, włączanie plików bez klas (tylko funkcje i kod) jest gorsze, bo nie ma tego czegoś, czego można szukać po plikach... kolejna zaleta OOP? winksmiley.jpg
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Zyx
post 16.07.2011, 12:20:44
Post #102





Grupa: Zarejestrowani
Postów: 952
Pomógł: 154
Dołączył: 20.01.2007
Skąd: /dev/oracle

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


Wykorzystanie gniazd uniksowych niewiele Ci da. Tracisz wtedy główną zaletę Memcached, a zyskujesz? W zasadzie nic, ponieważ zapytanie i odpowiedź wciąż musi przejść przez jądro systemu operacyjnego, gdzie są kilka razy kopiowane z jednego bufora do drugiego. Samo przełączanie się w tryb jądra również jest kosztowne. Żadne gniazda, żadne inne mechanizmy komunikacji międzyprocesowej nie są w stanie dorównać pamięci dzielonej.

Domyślnie w PHP każde żądanie traktowane jest jako zupełnie niezależny byt. Pojedynczy proces FastCGI lub moduł Apache'a może jednak przetwarzać wiele żądań jako osobne wątki. APC zezwala jedynie na wymianę informacji między tymi wątkami (kod bajtowy + dane), nie przekracza natomiast granicy procesu. Z tego powodu:
* W trybie modułu Apache'a dane są współdzielone jedynie między wątkami tego samego procesu Apache'a,
* W trybie FastCGI dane są współdzielone między wątkami tego samego procesu FastCGI.

Przy czym w FastCGI najczęściej uruchomionych jest równolegle kilka/kilkanaście procesów, które na dodatek mogą być co X żądań restartowane w celu eliminacji potencjalnych wycieków pamięci. APC nie pozwala ani na współdzielenie danych między tymi procesami (każdy proces jest odizolowany od drugiego), ani na manipulację nimi np. z poziomu skryptu konsolowego, ponieważ to jest jeszcze jeden proces. Podobnie, z tego co wiem, działa XCache. Z tego powodu jedynym 100%-pewnym sposobem wyczyszczenia cache jest tutaj restart Apache'a lub wszystkich procesów FastCGI.

Pamięć współdzielona to mechanizm pozwalający na zmapowanie pewnego fragmentu pamięci na przestrzeń adresową więcej niż jednego procesu. Oba te procesy widzą ten fragment jako "swój" i mają do niego pełne prawa odczytu oraz zapisu. Najczęściej współdzielony fragment reprezentuje się jako plik na dysku, który działa trochę jak pamięć wymiany - w momencie pierwszego użycia poszczególne jego bloki są importowane do pamięci i odpowiednio oznaczane. Gdy blok znajdzie się w pamięci, zasadniczo nie ma różnic wydajnościowych między dostępem do prywatnej pamięci procesu, a pamięcią współdzieloną. Wszystko wygląda fajnie, ale jest tutaj jeden problem, który tłumaczy dlaczego typowe akceleratory go nie wykorzystują: programista musi samodzielnie zaimplementować całe i w dodatku współbieżne zarządzanie takim obszarem pamięci, co nie jest zadaniem trywialnym. Jedynym znanym mi rozszerzeniem PHP, które wykorzystuje systemowy mechanizm pamięci dzielonej, jest wspomniany już chdb, który radzi sobie z powyższym problemem bardzo prosto: pamięć jest tylko do odczytu -> nie potrzeba żadnej synchronizacji -> nie trzeba implementować zarządzania taką pamięcią. Zawartość takiego cache można przebudować jedynie hurtem.

OK, ale chyba tyle na temat mechanizmów cache, ponieważ trochę zboczyliśmy z tematu. Mam nadzieję jednak, że rozwiałem tym wpisem wszelkie wątpliwości, dlaczego:
* nie powinno się stosować Memcached do obsługi map klas,
* dlaczego APC działa tak, jak działa.

Ten post edytował Zyx 16.07.2011, 12:21:44


--------------------
Specjalista ds. głupich i beznadziejnych, Zyx
Nowości wydawnicze: Open Power Collector 3.0.1.0 | Open Power Autoloader 3.0.3.0
Go to the top of the page
+Quote Post

Posty w temacie
- hawk   Włączanie plików + autoloader   10.02.2005, 17:23:52
- - hawk   @serafin: Trochę konsekwencji. Bardzo się starasz,...   17.06.2005, 08:44:59
- - matid   Korzystam z debug_backtrace" title="Zobacz w manua...   17.06.2005, 10:31:38
- - Imperior   Cytat(matid @ 2005-06-17 06:42:50)Chyba jedna...   17.06.2005, 15:12:25
- - matid   [PHP] pobierz, plaintext <?php class Test1 exte...   17.06.2005, 15:41:10
- - bela_666   Fajna bajeczka : http://groups.google.pl/groups?q=...   17.06.2005, 20:35:56
- - Imperior   Cytat(matid @ 2005-06-17 14:41:10)Jak wczytuj...   17.06.2005, 23:03:25
- - squid   Jeszcze nie przeczytalem calego tematu wiec sory j...   8.08.2005, 12:56:24
- - hawk   Tak naprawdę to wszystkie interfejsy powinno się w...   8.08.2005, 21:39:27
- - Vengeance   Wywalić interfejsy? A niby z jakiej racji? Przecie...   8.08.2005, 22:56:24
- - NuLL   @Hawk - napisać parser plików który będzie usuwał ...   8.08.2005, 23:02:05
- - matid   Jeśli kod jest wydany na zasadach OpenSource to mi...   9.08.2005, 07:36:32
- - hawk   Ale ja mówię o dwóch wersjach kodu: debug i releas...   9.08.2005, 14:25:03
- - chmolu   No jakoś mi się nie widzi usuwanie w kodzie ...   9.08.2005, 14:59:17
- - squid   Cytat(chmolu @ 2005-08-09 15:59:17)No jakoś m...   9.08.2005, 15:12:26
- - NuLL   Macie może jakiś pomysł co zrobić z autoloaderem k...   17.01.2006, 11:49:38
- - bigZbig   Mozna zastosowac cos w rodzaju przestrzeni nazw. W...   17.01.2006, 12:18:57
- - NuLL   Ja cos takiego robie tzn mam ezcCacheStorageFileAr...   17.01.2006, 12:23:08
- - bela_666   A po co rozbijac? Ja mam kilkaset linijek i smiga....   17.01.2006, 12:57:03
- - squid   co nazywacie mapa? Czy jest to skojarzona z klasa ...   17.01.2006, 13:12:04
- - NuLL   CytatA po co rozbijac? Ja mam kilkaset linijek i s...   17.01.2006, 13:18:13
- - Ociu   Cytat(squid @ 2006-01-17 14:12:04)co nazywaci...   17.01.2006, 14:28:28
- - bela_666   NuLL, pytanie moje brzmi, czy każdy komponent może...   17.01.2006, 19:16:03
- - NuLL   bela_666 - moze, nie wszystkiego bo czesc jest zal...   17.01.2006, 20:06:44
- - hawk   @NULL: IMHO rozwiązaniem problemu ze zbyt dużą lic...   24.01.2006, 08:54:37
- - squid   Cytat(hawk @ 2006-01-24 09:54:37)@NULL: IMHO ...   14.02.2006, 13:34:38
- - eMartio   Cytat(DeyV @ 2005-02-10 20:46:51) CytatTakie...   31.03.2006, 19:40:31
- - matid   Cytat(eMartio @ 2006-03-31 19:40:31)Co oznacz...   31.03.2006, 20:25:42
- - bela_666   Cytat(eMartio @ 2006-03-31 20:40:31)CytatTaki...   31.03.2006, 20:51:29
- - NuLL   Czy ktos moze wykonywal testy po jakims ciezkim ob...   27.05.2006, 16:52:38
- - Ludvik   Ja osobiście wszystko mam przygotowane pod autoloa...   27.05.2006, 21:44:26
- - squid   przy dobrym projekcie autoloadera mozna ominac f-c...   27.05.2006, 22:19:50
- - NuLL   @Ludvik - dzieki za wiesci - o cos takiego mi chod...   28.05.2006, 15:16:33
- - Vengeance   To ciekawe co mówicie, bo w mojej aplikacji autolo...   10.06.2006, 17:38:21
|- - squid   Cytat(Vengeance @ 10.06.2006, 18:38 ) To ...   10.06.2006, 19:07:47
- - bigZbig   Ja tez uzywam autoloadera, ale nie tworze jednej g...   12.06.2006, 08:04:11
- - Vengeance   Jakie argumenty by tu nie padały, i tak nic nie zm...   12.06.2006, 13:46:28
- - bigZbig   Argument o czytelności kodu do mnie nie przemawia ...   13.06.2006, 06:52:15
- - NuLL   CytatŻe już nie wspomne o np. umiejetnośći podpowi...   13.06.2006, 16:36:42
- - orson   witam eclipse przechowuje informacje o wszystkich...   13.06.2006, 17:37:21
- - eai   Ja generuje sobie mapę przy instalacji aplika...   5.08.2006, 16:28:49
- - squid   "bigZbig dla kaydego pakietu musisy kopiowac ...   5.08.2006, 16:44:16
- - mtod   Przepraszam, ale nie doczytałem tego wątku od desk...   8.08.2006, 16:21:45
- - lukir   Mógłby ktoś z was podsumować wszystkie te rozważan...   8.08.2006, 23:27:40
- - mtod   @lukir: nie rozumiem, jak to: "nowych"?   9.08.2006, 11:57:53
- - lukir   @mtod: na podanej przez Ciebie stronce jest napisa...   12.08.2006, 10:24:01
- - Ludvik   Wtedy ten autoloader straci na wydajności. Każdora...   12.08.2006, 10:30:55
- - squid   wracajac do wydajnosci __autoload() to wspomniane ...   12.08.2006, 11:09:43
- - Denver   Ja, wykorzystując ujednolicone nazewnictwo klas, k...   18.08.2006, 22:52:45
- - LBO   Bardzo przydatne przy pisaniu autoloadera mogą być...   16.01.2007, 20:23:45
- - dr_bonzo   CytatSkoro autoloader w zamierzeniu istnieje dla ł...   16.01.2007, 21:57:56
- - LBO   Ten exit() to tylko przykład, nie mający...   16.01.2007, 22:06:02
- - NuLL   CytatChodzi o sam fakt, że model obiektowy php dop...   17.01.2007, 15:13:32
- - athabus   Ja napisałem sobie prosty autoloader - szczerze mó...   17.01.2007, 16:08:59
- - bigZbig   Problem z mapą obrazków jest tylko taki, że za każ...   17.01.2007, 16:52:03
- - athabus   W zf jest to bardzo fajnie rozwiązane - tu się zgo...   17.01.2007, 17:18:00
- - J4r0d   Przeczytałem cały wątek (trochę czasu to zajęło) i...   18.01.2007, 00:50:57
- - dr_bonzo   CytatCzy warto jeszcze kodować jakimś algorytmem z...   18.01.2007, 01:06:33
|- - J4r0d   Cytat(dr_bonzo @ 18.01.2007, 01:06:33...   18.01.2007, 01:16:20
- - dr_bonzo   CytatDalej zastanawiam się czy nie lepiej ładować ...   18.01.2007, 09:09:06
- - cadavre   Ja nazywam klasy nazwa_klasy.class.php - to chyba ...   18.01.2007, 16:52:08
- - DjKermit   Witam. Ja wykombinowałem coś takiego: Klasa: [PHP]...   22.01.2007, 12:26:38
- - hwao   Bardzo ładna klasa, mi się podoba - jakbym stosowa...   23.01.2007, 18:14:47
- - DjKermit   Dzięki bardzo. Cytat(hwao @ 23.01.2007, 18...   23.01.2007, 18:28:59
- - Turgon   Hmm... Klasa ciekawa i sporo wyjaśnia Dzi...   23.01.2007, 18:32:35
- - bigZbig   Ja nazywam swoje klasy zgodnie z konwencją przyjęt...   24.01.2007, 16:19:57
|- - DjKermit   Cytat(bigZbig @ 24.01.2007, 16:19:57 ...   25.01.2007, 17:52:44
- - Turgon   bigZbig: Podobno szybsze jest Ale zastanowię się ...   25.01.2007, 15:51:37
- - bigZbig   Jak init może być szybsze od tablicy skoro parsują...   25.01.2007, 19:34:40
- - LBO   hmmm, parsowanie to parsowanie... i "na oko...   25.01.2007, 19:49:48
- - Turgon   Ja zapisuje zserializowaną tablicę i działa sprawn...   25.01.2007, 20:23:36
- - Strzałek   O autoloadzie oraz przykładowa klasa generująca ma...   20.02.2007, 09:29:17
- - Sh4dow   Mnie zastanawia ile samo odwolanie sie do funkcji ...   1.03.2007, 12:58:38
|- - J4r0d   Cytat(Sh4dow @ 1.03.2007, 12:58:38 ) ...   1.03.2007, 13:05:04
- - athabus   Wydaje mi się, że troszeczkę dochodzimy do granic ...   1.03.2007, 13:34:02
- - grzegorzr   uuu, temat trochę się zakurzył post...   14.07.2007, 06:10:01
- - Ludvik   Chce Ci się pisać te mapy w YAML? Bo nie widzę sen...   14.07.2007, 09:29:16
- - deirathe   [PHP] pobierz, plaintext <?phpfunction __autolo...   19.07.2007, 18:32:24
- - athabus   Ta funkcja wymaga aby wszystkie klasy były w jedny...   20.07.2007, 11:52:43
- - Turgon   athabus: W takim przypadku mapy się wydają być jed...   20.07.2007, 22:11:45
- - athabus   wiem i sam właśnie map używam   20.07.2007, 22:31:07
- - kaniagandzowski   W klasie ClassLoader autora DjKermit brakuje warun...   27.08.2007, 18:05:25
- - Sagnitor   Być może uznacie mnie za archeologa, ale temat był...   5.07.2011, 12:53:10
- - by_ikar   CytatOba sposoby posiadają zalety i wady. Pierwszy...   5.07.2011, 13:29:25
- - Sagnitor   Nie zaznaczyłem tego w swojej wypowiedzi, ale właś...   5.07.2011, 13:39:31
- - Crozin   Zacznijmy od tego, że w niewielkich projektach wyd...   5.07.2011, 13:51:01
- - by_ikar   W tym temacie jeden z użytkowników zamieścił właśn...   5.07.2011, 14:38:53
- - Sagnitor   @Crozin Twój sposób numer dwa byłby bardzo dobry ...   6.07.2011, 10:52:46
- - Crozin   @Sagnitor: Nie widzę większych problemów:[PHP] pob...   6.07.2011, 11:17:27
- - Sagnitor   Problem jest kiedy niektórzy piszą w ten sposób: ...   6.07.2011, 11:26:29
- - Zyx   Sagnitor -> mapa nie wyklucza stosowania konwen...   13.07.2011, 10:14:52
- - wookieb   A to nie wystarczy już http://pl2.php.net/manual/p...   13.07.2011, 10:36:11
- - Zyx   Jak najbardziej wystarczy, tylko trzeba pamiętać o...   13.07.2011, 11:12:50
- - Hellz   Dlaczego nie trzymać mapy autoloadera w memcached,...   13.07.2011, 18:01:10
- - Zyx   Bo jest kilka razy wolniejszy od APC*, a sama mapa...   14.07.2011, 18:47:00
- - Hellz   Cytatco nie powinno dziwić, jeśli weźmiemy pod uwa...   14.07.2011, 23:38:34
- - Zyx   Wykorzystanie gniazd uniksowych niewiele Ci da. Tr...   16.07.2011, 12:20:44
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: 18.05.2024 - 09:44