zeus
User
Offline
Posts: 5
|
 |
« on: May 13, 2009, 14:52:07 » |
|
Witam,
Od niedawna posługuję się OPT 2 w moim prywatnym projekcie. Jednak napotkałem na problem związany z połączeniem projektu OPT 2 z wewnętrznym mechanizmem sesji php, a ponieważ nie znalazłem, żadnej informacji na ten temat piszę tu.
W jaki sposób spiąć session_start(); z OPT 2. Generalnie OPT sam obsługuje wszystkie nagłówki i jakakolwiek próba wysyłania własnych kończy się błędem php. Jakaś sugestia dotycząca użycia standardowego systemu sesji z OPT?
|
|
|
|
|
Logged
|
|
|
|
|
Zyx
|
 |
« Reply #1 on: May 13, 2009, 15:54:41 » |
|
Musiałeś ładnie ten kod sobie zamotać, że Ci nie działa połączenie sesji z OPT :). OPT nie tyle sam obsługuje nagłówki, co po prostu może służyć za API do ich wysyłania. Obsługą zajmował się i zajmuje dalej PHP i w żaden sposób z mechanizmem sesji to nie koliduje. OPT parsuje wszystko pod koniec wykonywania skryptu, natomiast sesje powinno się uruchamiać na początku. Jeśli u Ciebie jest na odwrót, to ani OPT, ani żadne inne rozwiązanie niestety nie zadziała.
|
|
|
|
|
Logged
|
PozDrX, Zyx ---Invenzzia group---
|
|
|
|
eXtreme
|
 |
« Reply #2 on: May 13, 2009, 15:55:50 » |
|
Możesz podać więcej szczegółów? Może jaki konkretnie to błąd? I uproszczony kod testowy, który "reprodukuje" tę sytuację? Przetestowałem przed chwilą na jednym z devów opt20 i nie zachowywała się nadzwyczajnie i wszystko funkcjonowało.
|
|
|
|
|
Logged
|
|
|
|
zeus
User
Offline
Posts: 5
|
 |
« Reply #3 on: May 13, 2009, 17:39:40 » |
|
Cały kod jest prosty - przygotowany na podstawie man. Poniżej zamieszczam swój kod: <?php session_start(); //echo $_SERVER['SCRIPT_URI']; // OTP require('./%libs/Opl/Base.php'); Opl_Loader::setDirectory('./%libs/'); spl_autoload_register(array('Opl_Loader', 'autoload'));
// USTAWIENIA define('CFG_DIR','%cfg/'); Potem następuje definiowanie moich klas. Kończę tym kodem: try { $tpl = new Opt_Class; $tpl->sourceDir = './%tpl/tpl/'; $tpl->compileDir = './%tpl/tpl_c/'; $tpl -> stripWhitespaces = false; $tpl -> printComments = true; //$tpl->contentType = Opt_Class::XHTML; $tpl->charset = 'utf-8'; $tpl->setup();
$modulNaglowek = new Opt_View('naglowek.tpl'); $modulTresc->date = date('d.m.Y'); $modulTresc = new Opt_View(SZABLON); $modulTresc->galeria = $galeria; $modulTresc->paginacja = $paginacja; $modulTresc->tablica_info = $tablica_info;
$modulMenu = new Opt_View('menu.tpl'); $modulMenu->menu_lista = $menu_lista; $modulStopka = new Opt_View('stopka.tpl'); $modulStopka->menu_lista = $menu_lista;
$modulLogowanie = new Opt_View('login.tpl');
$layoutView = new Opt_View('layout.tpl'); $layoutView->title = $cfg -> get('page_title'); $layoutView->keywords = $cfg -> get('page_keywords'); $layoutView->description = $cfg -> get('page_description');
$layoutView->contentType = 'text/html; charset=UTF-8'; $layoutView->naglowek = array(0 => array('view' => $modulNaglowek), //array('view' => $module2View) ); $layoutView->tresc = array(0 => array('view' => $modulTresc), //array('view' => $module2View) ); $layoutView->menu = array(0 => array('view' => $modulMenu), //array('view' => $module2View) ); $layoutView->stopka = array(0 => array('view' => $modulStopka), //array('view' => $module2View) ); $layoutView->login = array(0 => array('view' => $modulLogowanie), //array('view' => $module2View) ); $out = new Opt_Output_Http; $out->setContentType(Opt_Output_Http::XHTML, 'utf-8'); $out->render($layoutView); }
catch(Opt_Exception $exception) { Opt_Error_Handler($exception); } Dopóty nie załaduję OPT wszystko śmiga tak jak należy. Załadowanie OPT równoznaczne jest z błędem informującym o uprzednim wysłaniu nagłówków. Dla jasności dodam, że mój pozostały kod nie wysyła żadnego nagłówka, ani żadnej pustej linii. Użycie ob_start("ob_gzhandler"); nie pomaga, - wywołuje błąd ponieważ OPT również używa buforowania. Z góry dziękuję za pomoc.
|
|
|
|
|
Logged
|
|
|
|
|
Zyx
|
 |
« Reply #4 on: May 13, 2009, 19:41:37 » |
|
OK, już wiem, o co chodzi. W ustawieniach sesji masz włączone trans-sid. Funkcja session_start() rejestruje wtedy własną obsługę buforowania wyjścia. Jednocześnie, kompresję wyjścia robisz po stronie skryptu, a nie interpretera. OPT potrafi to samodzielnie wykryć i dopiero, gdy może, załącza odpowiedni moduł kompresji. Tu właśnie leży problem: kompresja musi być włączana przed startem sesji, inaczej to nie zadziała.
Masz trzy wyjścia: - Wyłączysz opcję trans-sid w PHP (na dobrą sprawę jest ona przydatna tylko wtedy, gdy dopuszczasz przekazywanie ID sesji przez URL). - Wyłączysz w OPT kompresję gZip: $tpl->gzipCompression = false - Włączysz kompresję, ale w konfiguracji PHP. Równocześnie możesz wyłączyć wykonywanie kompresji przez OPT.
|
|
|
|
|
Logged
|
PozDrX, Zyx ---Invenzzia group---
|
|
|
zeus
User
Offline
Posts: 5
|
 |
« Reply #5 on: May 13, 2009, 21:13:34 » |
|
Masz trzy wyjścia: - Wyłączysz opcję trans-sid w PHP (na dobrą sprawę jest ona przydatna tylko wtedy, gdy dopuszczasz przekazywanie ID sesji przez URL). - Wyłączysz w OPT kompresję gZip: $tpl->gzipCompression = false - Włączysz kompresję, ale w konfiguracji PHP. Równocześnie możesz wyłączyć wykonywanie kompresji przez OPT.
Generalnie sprawdziłem te wszystkie warunki, ale efekt zawsze jest ten sam - php wyrzuca mi worning, ze nagłówki zostały już wysłane. Do php dorzuciłem ini set: ini_set('session.use_trans_sid', '0'); ini_set('zlib.output_compression', 0); Do kodu php dorzuciłem: try { $tpl = new Opt_Class; $tpl -> sourceDir = './%tpl/tpl/'; $tpl -> compileDir = './%tpl/tpl_c/'; $tpl -> gzipCompression = false; $tpl -> stripWhitespaces = false; $tpl -> printComments = true; (...) $out = new Opt_Output_Http; //$out->setContentType(Opt_Output_Http::XHTML, 'utf-8'); // tutaj profilaktycznie również zaremowałem $out->render($layoutView); } Sprawdziłem przez phpinfo(); Directive Local Value Master Value session.auto_start Off Off session.bug_compat_42 On On session.bug_compat_warn On On session.cache_expire 180 180 session.cache_limiter nocache nocache session.cookie_domain no value no value session.cookie_httponly Off Off session.cookie_lifetime 0 0 session.cookie_path / / session.cookie_secure Off Off session.entropy_file no value no value session.entropy_length 0 0 session.gc_divisor 100 100 session.gc_maxlifetime 1440 1440 session.gc_probability 1 1 session.hash_bits_per_character 4 4 session.hash_function 0 0 session.name PHPSESSID PHPSESSID session.referer_check no value no value session.save_handler files files session.save_path /tmp /tmp session.serialize_handler php php session.use_cookies On On session.use_only_cookies Off Off session.use_trans_sid 0 0 oraz Directive Local Value Master Value zlib.output_compression Off Off zlib.output_compression_level -1 -1 zlib.output_handler no value no value i nadal otrzymuje warning: Warning: session_start() [function.session-start]: open(/tmp/sess_522cdb3742928f5fccb986daedfc3881, O_RDWR) failed: No such file or directory (2) in /index.php on line 5
Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /index.php:5) in /index.php on line 5
Warning: Cannot modify header information - headers already sent by (output started at /index.php:5) in /%libs/Opt/Output/Http.php on line 71
|
|
|
|
|
Logged
|
|
|
|
|
Zyx
|
 |
« Reply #6 on: May 13, 2009, 21:54:55 » |
|
A że tak zapytam... jaki masz system operacyjny?
|
|
|
|
|
Logged
|
PozDrX, Zyx ---Invenzzia group---
|
|
|
zeus
User
Offline
Posts: 5
|
 |
« Reply #7 on: May 13, 2009, 22:26:26 » |
|
A że tak zapytam... jaki masz system operacyjny?
Całość chodzi u dostawcy hostingu na FreBSD.
|
|
|
|
|
Logged
|
|
|
|
|
Zyx
|
 |
« Reply #8 on: May 14, 2009, 07:05:32 » |
|
Problem musi leżeć gdzieś w konfiguracji sesji u dostawcy, a konkretniej w konfiguracji katalogu, gdzie sesje są zapisywane. Widać, że kod wywala się jeszcze zanim w ogóle OPT zostanie załadowany, a to, że on też się później wykrzacza, jest konsekwencją pojawienia się pierwszego ostrzeżenia: Warning: session_start() [function.session-start]: open(/tmp/sess_522cdb3742928f5fccb986daedfc3881, O_RDWR) failed: No such file or directory (2) in /index.php on line 5 Z naszych testów wynika, że OPT i sesje nie kolidują ze sobą, poza tym jednym przypadkiem, o którym wspomniałem wyżej. Ba - nawet sam z nich korzystam w jednym projekcie, gdzie jest też OPT. Spróbuj skontaktować się z administratorem i przekaż mu ten komunikat błędu.
|
|
|
|
|
Logged
|
PozDrX, Zyx ---Invenzzia group---
|
|
|
zeus
User
Offline
Posts: 5
|
 |
« Reply #9 on: May 14, 2009, 09:01:24 » |
|
Problem musi leżeć gdzieś w konfiguracji sesji u dostawcy, a konkretniej w konfiguracji katalogu, gdzie sesje są zapisywane. Widać, że kod wywala się jeszcze zanim w ogóle OPT zostanie załadowany, a to, że on też się później wykrzacza, jest konsekwencją pojawienia się pierwszego ostrzeżenia: Warning: session_start() [function.session-start]: open(/tmp/sess_522cdb3742928f5fccb986daedfc3881, O_RDWR) failed: No such file or directory (2) in /index.php on line 5 Z naszych testów wynika, że OPT i sesje nie kolidują ze sobą, poza tym jednym przypadkiem, o którym wspomniałem wyżej. Ba - nawet sam z nich korzystam w jednym projekcie, gdzie jest też OPT. Spróbuj skontaktować się z administratorem i przekaż mu ten komunikat błędu. Do podobnych konkluzji sam doszedłem. Problem w tym, że ten dostawca to home.pl - jeden z większych na runku. On konfiguracji nie zmieni. A problem może dotyczyć wielu serwisów, które ktoś będzie chciał odpalać na home.pl. Co więcej po dokładnym sprawdzeniu okazuje się, że mimo warning'ów sesja jest ustawiana, ciasteczko trafia do przeglądarki, a sama sesja jest dostępna dla php... obecnie po prostu wyłączyłem raportowanie blędów i teoretycznie działa... ale czy tak to powinno działać. Co więcej dodam, że jeśli zestawiam sesję bez OPT wszystko na home.pl śmiga wspaniale.
|
|
|
|
|
Logged
|
|
|
|
|
Zyx
|
 |
« Reply #10 on: May 14, 2009, 09:08:13 » |
|
Musiałbym to sam przetestować i zobaczyć. Mimo to wciąż uważam, że błąd występuje bez względu na to, czy jest OPT czy nie (przecież interpreter nie wybiega w przyszłość i nie robi złośliwie "o, za 10 linijek będziemy ładowali OPT, więc się wypieprzamy" :)), biblioteka jedynie sprawia, że komunikat pokazuje się na stronie. Zawsze możesz zrezygnować z Opt_Output_Http, użyć Opt_Output_Return i ręcznie bawić się w wysyłanie wyniku do przeglądarki.
Jeśli problem leży po stronie home.pl, to ja nic nie poradzę. Nie będę przerabiać na oślep biblioteki z powodu tego, że admin nie potrafi sobie czegoś skonfigurować, nawet jeśli jest to jedna z większych firm na rynku. W sumie nie zdziwiłbym się, gdyby tak właśnie było, bo swego czasu też robiłem stronę, która miała być tam umieszczona i z kolei sypała się jedna ze standardowych metod PDO, która wszędzie indziej działała. I też nie wiedzieli, jak to naprawić i dlaczego tak się dzieje, a ja musiałem pół kodu poprawiać, by ominąć feralną metodę.
|
|
|
|
|
Logged
|
PozDrX, Zyx ---Invenzzia group---
|
|
|
Agares
User
Offline
Posts: 16
Zbanowany
|
 |
« Reply #11 on: May 20, 2009, 19:04:35 » |
|
Ja miałem podobny problem na home(akurat OPTa tam nie było, ale nvm). Stwórz w folderze ze stroną folder tmp i nadaj mu prawa do zapisu - będzie ok.
|
|
|
|
|
Logged
|
|
|
|
|