Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Autorski framework, czy udostępnić?
Forum PHP.pl > Inne > Hydepark
matrik
Witajcie
Chciałbym udostępnić autorski system framework, który teoretycznie (hmm, nawet praktycznie) kładzie inne systemy.
Wykonałem prosty test na surówkach dwóch frameworków. Konfig domyślny i bez połączenia z bazą danych.
Zwykłe wyświetlenie tekstu "Hello world!". Bez wykorzystania eAccelerator'a

CodeIgniter: [0.011924028396606] 1 mb
Yii: [0.050626039505005] 5 mb
Autorski: [0.005169153213501] 768 kb

System jest okrojony i pozbawiony śmieci takich jak generatory do tworzenia formularzy czy też tworzenie zapytań SQL.
Tworzony był dla szybkiego stawiania serwisów (wiele stron korzystało i korzysta z tego systemu), dlatego nie ma wzorca projektowego MVC, lecz autorski model CCV (Controller - Component - View) dzięki któremu osiąga takie wyniki (ale czepiając się innych frameworków zasada działania jest bardzo zbliżona).
Ładowarka klas Singleton i Router nieszablonowego wywoływania kontrolerów.

Yii czy CI nie powinien ładować bibliotek, których nie potrzebuje aktualnie więc co o tym sądzicie?
rad11
Tylko tyle? I ze niby ma kłaść narzędzia dla programistów i web developerów na kolana? Udostepnic zawsze mozesz, frontendowcom moze sie przydac, ale dla powaznych programistow raczej to nie pomoze.
Pyton_000
Cyferki to i Ja Ci mogę pokazać. Mogę Ci nawet powiedzieć że Moje rozwiązanie kładzie Twoje na łopatki.
Chcesz to udostępniaj i wtedy chwal się wynikami "benchmarków", jak nie to nie. Co mamy Ci powiedzieć? Rozwiązać dylemat typu: "Kanapka z chlebem czy bułką?"
aniolekx
Napisałeś jakieś testy do niego? (TDD, BDD), jeżeli tak to jakie masz pokrycie testami? Pytam bo to jest kolejny aspekt często pomijany przez amatorów wink.gif
pyro
Testowanie szybkości frameworka poprzez `echo "Hello world"`. Czasami zwyczajnie nie potrafię sobie wyobrazić rzeczy, które mogłyby mnie tak zaskoczyć wink.gif
matrik
Chodziło mi tylko o wyrażenie opinii na ten temat biggrin.gif

Cytat
Cyferki to i Ja Ci mogę pokazać. Mogę Ci nawet powiedzieć że Moje rozwiązanie kładzie Twoje na łopatki.
Chcesz to udostępniaj i wtedy chwal się wynikami "benchmarków", jak nie to nie. Co mamy Ci powiedzieć? Rozwiązać dylemat typu: "Kanapka z chlebem czy bułką?"

Jeśli masz problem z czytaniem ze zrozumieniem to współczuję, jak wyraźnie napisałem "prosty test", który już coś wnosi.
Co z tego, że może masz lepsze rozwiązanie? Skąd wiesz, że akurat do tego będzie pasować? A na siłę nie zmuszam żeby sobie robił bułkę z chlebem, to jego decyzja.

Cytat
dla powaznych programistow raczej to nie pomoze

masz jakieś ogólne zasady poważnych programistów?

Jak zwykle na tym forum chamstwo jakiego nie mało... Jeden przez drugiego chce pokazać tylko kto go bardziej zjedzie, lepiej? Ale cóż taki polak cebulak...
Może moim błędem było napisanie tego tematu dla niepoważnego społeczeństwa?
Forti
Cytat
Jak zwykle na tym forum chamstwo jakiego nie mało... Jeden przez drugiego chce pokazać tylko kto go bardziej zjedzie, lepiej? Ale cóż taki polak cebulak...
Może moim błędem było napisanie tego tematu dla niepoważnego społeczeństwa?


A może zamiast się obrażać to przyjmij krytyke i pokaż coś więcej. Masz testy do tego? Mówisz, że korzysta z czystym zapytań sql, podczas gdy ORM bardzo ułatwia pracę.

Ten twój prosty test nie wiele mówi wink.gif
matrik
Forti
Krytyka czasem jest taka, że czasem trzeba się bronić...
ORM może i ułatwia pracę, ale stawiam tylko na optymalizację a nie na ułatwienie pracy. Prostym przykładem może być zapytanie "SELECT * FROM t1 LEFT OUTER JOIN t2 ON(t1.p1=t2.p2)", zajmuje Ci to napisanie pare sekund.
Facebook korzysta z ORM? Google korzysta z innych tego typu rzeczy, które spowaniają pracę całego serwisu?
Przy dużym ruchu te milisekundy robią różnicę a chcąc ograniczać koszty związane z administracją serwerami (loadbalancer, cały cluster a może nawet i chmura) lepiej się zastanowić nad lepszymi rozwiązaniami a nie stawiać na tą wygodę pracy, która po dłuższym użytkowaniu serwisu staję się wolniejszy dodając czynnik wzrostu bazy danych gdzie nawet relacje i partycjonowanie nie pomaga.
Janusz1200
Za mnie framework ma robić 3 rzeczy:
1. bezpieczeństwo
2. obsługa bazy (zamiast rzeźbić w sql niech to będzie chociaż select składany jak w Zend czy fluent ORM jak w Laravel)
3. obsługa frontendu (całe te walidacje, formatowanie, przerzucanie z formularza do bazy i z powrotem, NUDA)

Ponieważ Twój nie robi 2 i 3, dla mnie - nieprzydatny.

Testy wydajnościowe obchodzą mnie coraz mniej - najwyżej się dorzuci jeszcze jeden procesor, to nie to co 20 lat temu.
Pyton_000
@matrik trochę więcej samokrytycyzmu. Co z tego że mówisz że masz superzajebisteochahhehhrozwiązanienaframweork które pokazuje debilny ihmo test "hello World" (ten sam test na Phalconie wykoona się dużo szybciej niż twoje rozwiązania więc jakie tu porównania). Takie testy nie pokazują zupełnie żadnej wiedzy nt. wydajności frameworka. Ot ile pamięci zajmuje czysty system. Koniec wiedzy.

W benchmarku FW trzeba by było postawić coś bardziej skomplikowanego, coś do da lepszy obraz niż głupie wyświetlenie tekstu. Wiadomo że jedne zrobią tak, inne tak.

Co do Twojego autorskiego rozwiązania... Hmm.. dopóki nie pokażesz jakiegoś kodu i super rozwiązań śmiem twierdzić że nie nada się to do niczego bo:
- jest/może być dziurawe jak ser
- wydajność jest super ale tylko na poziomie Hello World
- brakuje testów jesdnostkowych
- stworzenie czegoś bardziej skomplikowanego będzie wymagało 20x większego nakładu pracy, sił
- itd. itd. itd.

To są tylko moje spekulacje i domysłu bo tylko tyle można wywnioskować na podstawie Twojego "ogłoszenia"
by_ikar
Wydajność może być super, bez żadnych libów, nakładek etc ta wydajność też będzie super. Ale wtedy dochodzi kwestia jak szybko za pomocą takiego "frameworka" stworze coś. Jeżeli powiedzmy za pomocą laravela wygeneruje jakiegoś prostego cruda w 2 minuty, a z twoim rozwiązaniem to będzie ponad godzina. To pracodawca wówczas woli dołożyć ramu, czy procka, niż opóźniać prace nad projektem.

Taki slim czy jemu podobne micro frameworki, też osiągają mega wydajność, co z tego skoro w niewielu rzeczach mi pomagają? Modele musisz tworzyć samemu od podstaw, walidacje tak samo. Można powiedzieć że do twojego FW można dołożyć jakieś modele, jakieś walidatory, tyle że wtedy ta wydajność będzie zbliżona do innych już istniejących FW, które będą bardziej popularne niż twoje rozwiązanie, będą miały pokrycie testami, będą miały aktywnie pracującą nad tym społeczność etc.

To jest jak z kernelem linuxa. Nie jest on idealny, bo można go tu i ówdzie zoptymalizować pod konkretne rozwiązanie. Tyle że czas jaki się przekłada na taką optymalizacje jest dużo bardziej kosztowny, niż te 500kb pamięci ram, czy 10 cykli procesora.

Kiedyś miałem zapały na swojego FW, wydawało mi się że mogę pewne rzeczy zrobić lepiej, koniec końców, dość szybko wycofałem się z tego zdania i teraz raczej wolę coś tworzyć z gotowych, dobrze udokumentowanych frameworków, niż na siłę skupiać się nad swoim rozwiązaniem..

Tak czy inaczej, pokaż swój kod, wrzuć go gdzieś na githuba, czy innego bitbucketa.

PS. źle odebrałeś słowa krytyki, zamiast zapytać się skąd taka krytyka, od razu strzeliłeś focha. Przyzwyczaj się do tego że ktoś kto już powtarzał 10 osobą przed tobą, z takim samym podejściem (napisze fw lepiej niż wszyscy inni!) może nie mieć już cierpliwości do kolejnego narwańca. Ale z drugiej strony masz rację, że mimo wszystko trzeba jakąś kulturę osobistą zachować. Bo bez tego jesteśmy zwykłymi małpami stukającymi w guziki.
fizzlebubble
Yet another PHP framework... Jeśli dla Twoich zastosowań robi robotę to chwała, ale lepiej po prostu zachowaj go dla siebie, bo juniorowi nie wytłumaczysz dlaczego ORM jest zły, po prostu nie wytłumaczysz... smile.gif
matrik
Jeśli chodzi o "Hello World!" to specjalnie tak zrobiłem, żeby przedstawić ile na starcie wszystkiego się wykonuje.
Co do dziur to przez 4 lata nie miałem żadnej takiej akcji, wystarczy nie korzystać ze zmiennych get/post/request bezposrednio tylko przez filtr i nie ma sera
Skomplikowane rzeczy są różne, wszystko zależy od sposobu ich wykonania i dobrego zorganizowania by uzyskać pożądany rezultat. Dla jednych logowanie to udręka a dla innych to codzienność.
pyro
@matrik, jeżeli tak bardzo Ci zależy na milisekundach pomijając zupełnie użytecznośc, wygodę, czytelność, zużycie procesora i tysiąc innych rzeczy to proponuję zacząć pisać strony w Assembly
!*!
14 postów w temacie, a Wy rozmawiacie o czymś co istnieje tylko w głowie jego twórcy... Już wiem, czemu tak rzadko zaglądam na to forum...
Pyton_000
Ojj tam @!*! Trzeba jakoś dzień odreagować wink.gif Na piwo za wcześnie, na seks nie ma czasu to chociaż trzeba sobie pomagać haha.gif
b4rt3kk
Cytat(!*! @ 9.02.2015, 13:19:40 ) *
14 postów w temacie, a Wy rozmawiacie o czymś co istnieje tylko w głowie jego twórcy... Już wiem, czemu tak rzadko zaglądam na to forum...


Nie no, chyba coś tam jednak istnieje, bo jakieś testy jednostkowe były.

Wracając do tematu - udostępnij jakiś fragment kodu, pokaż jakieś unikalne rozwiązanie z którego jesteś szczególnie dumny.
matrik
Nie wiem co z tym... Wrzuciłem:
smarty (wiem, że ostry hejt na to leci ale spełnia swoja rolę biggrin.gif ),
autoryzację,
+ pobieranie danych z 4 baz SQLite,
brak cache
Wynik: [0.03563404083252]1835008b. W sumie prawie wszędzie mam tyle. Wiem, że Smarty spowalnia.
Akurat tworzę coś w stylu OpenID z REST API i działa zadowalająco.

Znowu inny serwis, budowany pod społeczność, tablica, znajomi i pełno relacji pomiędzy komponentami ma znowu: [0.19151997566223]2.5 mb:
- przyciski al'a "lubie to"
- komentarze
- sqlite jako podstrony komentarzy,
- powiadomienia i inne bzdety które ma fb
A takie demo bloga Yii? Jest ktoś w stanie zrobić taki test, żebym nie tylko ja miał takie dane?
W wolnej chwili postawie xdebug i sprawdzę co się dzieje ale to by było bliżej początku udostępniania tego systemu bo tak jak @fizzlebubble wspomniał, że nie wytłumaczysz niektórych rzeczy.

Cytat(b4rt3kk @ 9.02.2015, 13:27:17 ) *
Nie no, chyba coś tam jednak istnieje, bo jakieś testy jednostkowe były.

Wracając do tematu - udostępnij jakiś fragment kodu, pokaż jakieś unikalne rozwiązanie z którego jesteś szczególnie dumny.

Może nie tyle co unikalne, zwykły singleton, ładowarka klas i główna klasa odpalenia skryptu (widać w metodzie run) biggrin.gif
Swoje zadanie spełnia, mało kodu i to się liczy, nie ma co kombinować i wymyślać a póżniej z igły robią się widły jak to się mowi biggrin.gif
http://pastebin.com/7Rg8eCYF

CCV byłby widoczny przy rozbudowanym kontrolerze i komponencie.
Forti
Dawno nie widziałem takiego "nested if/else" ;]
matrik
Cytat(Forti @ 9.02.2015, 13:58:22 ) *
Dawno nie widziałem takiego "nested if/else" ;]

Stare ale jare biggrin.gif
!*!
Cytat(matrik @ 9.02.2015, 11:21:08 ) *
dlatego nie ma wzorca projektowego MVC, lecz autorski model CCV (Controller - Component - View) więc co o tym sądzicie?


Jak coś nie ma MVC(lub pochodnych), to jest do dupy. I co to jest to CCV i czym to się różni od MVP czy MVA?
by_ikar
Wszystko co jest za throw nie zostanie wykonane, tak samo jak wszystko co jest za exit, die, return i podobnymi, więc ten return false tam jest zbędny. is_file zwraca tylko czy plik istnieje, a plik może istnieć ale możesz nie mieć do niego uprawnień. Warunek:

Kod
if(self::$baseClass[$strtolower])
{
    // some code
}


będzie wyświetlać notice jeżeli włączysz raportowanie błędów na E_ALL. require_once jest zbędny (i wolniejszy) jeżeli wcześniej i tak sprawdzasz czy klasa już istnieje.

Kiepsko trochę, sporo błędów logicznych. Nie zrozum mnie źle, ale śmieszne trochę jest kiedy mówisz o super optymalizacji, jednocześnie używając wyrażenia regularnego do wyszukiwania "stałego" ciągu. O czym nawet jest napisane w dokumentacji preg_match, że jak masz go użyć do wyszukania ciągu w podciągu, użyj strpos lub strstr. Niby to nie jest jakaś kolosalna różnica, ale to już widać na pierwszy rzut oka że nie bardzo wiesz jak dane funkcje/elementy języka działają. Tak samo mnie zastanawia, bo napisałeś że jest bezpieczny jak ktoś nie korzysta bezpośrednio z post, get etc. Czyli co, ty te dane traktujesz htmlspecialchar w jakiejś pętli, czy jak?

Konkluzja jest taka, że twój "framework" jest szybszy od innych, bo nie ma wielu innych ficzerów. Jakbyś miał z użyciem 2 frameworków napisać 2 takie same aplikacje, i użył byś swojego fw, jak i powiedzmy laravela; to jest wysokie prawdopodobieństwo że w obu przypadkach te prędkości czy użycie danych będą bardzo zbliżone.
Pyton_000
@up Ba, ten kod który został pokazany można by było spokojnie odchudzić do ok 35 linijek i to nie dla tego że wszystko w jednej, ale wywalając część i zamieniając bardziej odpowiednimi elementami.

Poza tym te 2 metody autoloadu są podobne. Zmienia się w sumie na dobrą sprawę sprawdzenie czy klasa jest smarty i zmiana ścieżki.
Razi mnie też użycie referencji. Blee. Nie lubimy tego bo potem kwiatki wychodzą.

  1. $object =& $class->newInstance();
  2. self::$baseClass[$strtolower] =& $object;
  3. return $object;

Na prawdę nie uważasz że to jest bez sensu?
vokiel
Ok, skoro jest kod do review, to zrobię pobieżny (uwagi w komentarzach)
  1. <? // krótka notacja tagów otwierających może przysporzyć problemów na serwerach bez ustawionej flagi short_open_tag w php.ini
  2. class woBase{
  3. static public $baseClass = array();
  4.  
  5. function run(){ // brak określenia widoczności metody
  6. return self::getClass('Application')->start();
  7. }
  8.  
  9. static function getClass($name,$run=true){ // po co te $run?
  10. $strtolower = strtolower($name); // nazywanie zmiennych nazwami funkcji to nie jest dobra praktyka
  11. //echo WOPATCH.'core/'.$name.'.php<br />';
  12. if(self::$baseClass[$strtolower]){ // NOTICE przy braku elementu w tablicy, tablica jest public, to co jeśli ktoś podmieni obiekt klasy $name na inny?
  13. //echo '- '.$name.'<br />';
  14. return self::$baseClass[$strtolower];
  15. }else{
  16. //echo '+ '.$name.'<br />';
  17. if(!class_exists($strtolower,false)){
  18. if(is_file(WOPATCH.'core/'.$name.'.php')){
  19. require WOPATCH.'core/'.$name.'.php';
  20. }else{
  21. throw new ErrorHandler('getClass - Nie odnaleziono pliku klasy o nazwie '.$name); // ErrorHandler - chyba raczej Exception lub WoException, handler byłby tym co przechwyci wyjątek
  22. return false; // zbędne, nie wykona się
  23. }
  24. }
  25. $class = new ReflectionClass($strtolower); // jaki zysk z zastosowania Reflection? Czemu nie łapiesz wyjątku ReflectionException?
  26. $object =& $class->newInstance(); // a co jeśli nowa klasa wymaga przekazania parametrów do konstruktora? po co referencja @Pyton_000
  27. self::$baseClass[$strtolower] =& $object; // po co znów referencja @Pyton_000
  28. return $object;
  29. // skoro nie korzystasz z przekazywania zmiennych do konstruktora, z ReflectionException, to wystarczy takie rozwiązanie
  30. return self::$baseClass[$strtolower] = new $strtolower();
  31. }
  32. }
  33.  
  34.  
  35. // w zasadzie autoload od getClass różni się tylko dwiema kwestiami: sprawdzaniem czy jest to smarty oraz tym, że getClass tworzy nową instancję obiektu, duża duplikacja kodu jak na działanie w kierunku optymalizacji. Może jednak pójdź w stronę $run=true i połącz zduplikowany kod.
  36. public static function autoload($name){
  37. $strtolower = strtolower($name);
  38. $dir = WOPATCH.'core/'.$name.'.php'; // $dir to raczej $file, mocno mylące
  39. if(preg_match('/smarty_/',$strtolower)){ // strpos lub strstr @by_ikar
  40. $dir = WOPATCH.'core/Smarty/sysplugins/'.$strtolower.'.php'; // znów $dir wskazujący na plik
  41. }
  42. if(!class_exists($name,false)){
  43. if(is_file($dir)){ // c.d. nieścisłości, wiem, że to tylko nazwa zmiennej, jednak za jakiś czas takie nieścisłości mogą spowodować, że głupiego błędu będziesz szukał dużo dłużej
  44. require_once $dir;
  45. return true;
  46. }else{
  47. throw new ErrorHandler(get_class($this).' - Not found class '.$name); // Exception nie ErrorHandler
  48. return false; // nie wykona się
  49. }
  50. }
  51. }
  52. }
  53. spl_autoload_register(array('woBase','autoload'));
solificati
Cytat(matrik @ 9.02.2015, 11:21:08 ) *
Witajcie
Chciałbym udostępnić autorski system framework, który teoretycznie (hmm, nawet praktycznie) kładzie inne systemy.

Minimum benchmarków: https://github.com/TechEmpower/FrameworkBenchmarks
Możesz zrobić pull requesta ze swoim frameworkiem.
Neymar11
Cytat(matrik @ 9.02.2015, 11:21:08 ) *
CodeIgniter: [0.011924028396606] 1 mb
Yii: [0.050626039505005] 5 mb
Autorski: [0.005169153213501] 768 kb


Ja też tak mogę mówić:

O a ja robiłem testy na surówkach dwóch frameworków bez połączenia z bazą danych na "Hello world":

CodeIgniter: [0.011924028396606] 1 mb
Yii: [0.050626039505005] 5 mb
Autorski matrika: [0.005169153213501] 768 kb
Autorski Neymara11: [0.000000000000001] 1 b

No bo ja mam najlepsiejszy framework i nie mam tam zbędnych pierdouff co by tylko spowalniały ... [bla bla] [bla bla]
Daj dowód, udostępnij frameworka no i już. Każdy sobie oblooka skrytykuje i wszyscy będą "happy" smile.gif
peter13135
Skoro kładziesz na lekkość, to po co w Twoim FW smarty ? PHP sam w sobie jest systemem szablonów.
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.