Invenzzia »

Pages: [1]   Go Down
  Print  
Author Topic: OPT 2 - problem z nagłowkami http / sesje  (Read 2329 times)
Description: Jak przesłać nagłówki http?
0 Members and 2 Guests are viewing this topic.
zeus
User

Offline Offline

Posts: 5


View Profile
« 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
Your programmer
Administrator
User
*****
Offline Offline

Posts: 291



View Profile WWW
« 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
Invenzzia
Administrator
User
*****
Offline Offline

Posts: 129

Jacek Jędrzejewski


View Profile WWW
« 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 Offline

Posts: 5


View Profile
« Reply #3 on: May 13, 2009, 17:39:40 »

Cały kod jest prosty - przygotowany na podstawie man.

Poniżej zamieszczam swój kod:
Code:
<?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:

Code:
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
Your programmer
Administrator
User
*****
Offline Offline

Posts: 291



View Profile WWW
« 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 Offline

Posts: 5


View Profile
« 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:
Code:
ini_set('session.use_trans_sid', '0');
ini_set('zlib.output_compression', 0);

Do kodu php dorzuciłem:
Code:
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();
Quote
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
Quote
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:
Quote
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
Your programmer
Administrator
User
*****
Offline Offline

Posts: 291



View Profile WWW
« 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 Offline

Posts: 5


View Profile
« 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
Your programmer
Administrator
User
*****
Offline Offline

Posts: 291



View Profile WWW
« 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:

Quote
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 Offline

Posts: 5


View Profile
« 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:

Quote
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
Your programmer
Administrator
User
*****
Offline Offline

Posts: 291



View Profile WWW
« 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 Offline

Posts: 16

Zbanowany


View Profile
« 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
Pages: [1]   Go Up
  Print  
 
Jump to:  

Subject Started by Replies Views Last post
OPTv2: OPT 2.0.0 « 1 2 3 » Zyx 42 8401 Last post March 25, 2009, 21:31:09
by Zyx
OPTv2: Renderowanie drzewka kategorii Agares 1 1153 Last post August 02, 2008, 13:08:01
by Zyx
OPTv2-dev7 - inicjowanie tablicą megaweb 10 3061 Last post August 23, 2008, 14:35:02
by Zyx
OPTv2: Problem z iteracją tommy567 3 387 Last post August 30, 2010, 15:49:34
by eXtreme
New website announcement Zyx 0 808 Last post January 24, 2011, 13:45:11
by Zyx