"[...]Zbywanie mnie formułkami o konieczności milczenia odbieram jako krętactwo władzy, a to każe mi żywić obawę, że nigdy nie poznam przyczyn katastrofy. A nawet jak je już poznam, to być może nie uwierzę, bo wcześniej moje pragnienie prawdy zostanie zgwałcone tysiącem domysłów, niedopowiedzeń, wersji, zastrzeżeń i uników.[...]"
Z. Górniak - całość
No cóż - lepiej bym tego nie ujął.
wtorek, 25 maja 2010
poniedziałek, 19 października 2009
Mam cię!
Już któryś tydzień z rzędu obsługiwana przeze mnie baza danych i cluster apache-y dławił się z niewiadomego powodu. Problem był w tym że działo się to "od czasu do czasu" i nie potrafiłem odtworzyć błędu.
Jedyne co wiedziałem to to że w mysqladmin processlist opluwał mnie procesami czekającymi na połączenie. Kilka mniejszych zmian w konfiguracji mysql czy apache nie dawały skutku (lub po prostu z powodu braku odpowiedniej częstotliwości błędu nie potrafiłem stwierdzić czy moje działanie pomogło).
No ale dzisiaj problem powtarzał się cały czas dzięki czemu mogłem dokładniej się temu przyjrzeć i przetestować kilka rozwiązań.
Rezultat
jedna opcja w my.cnf skip-name-resolv
a wszystko przez rozwiązywanie nazw DNS,
więcej na http://dev.mysql.com/doc/refman/5.0/en/dns.html
na forum mysql: http://forums.mysql.com/read.php?30,27073,27073#msg-27073
Jedyne co wiedziałem to to że w mysqladmin processlist opluwał mnie procesami czekającymi na połączenie. Kilka mniejszych zmian w konfiguracji mysql czy apache nie dawały skutku (lub po prostu z powodu braku odpowiedniej częstotliwości błędu nie potrafiłem stwierdzić czy moje działanie pomogło).
No ale dzisiaj problem powtarzał się cały czas dzięki czemu mogłem dokładniej się temu przyjrzeć i przetestować kilka rozwiązań.
Rezultat
jedna opcja w my.cnf skip-name-resolv
a wszystko przez rozwiązywanie nazw DNS,
więcej na http://dev.mysql.com/doc/refman/5.0/en/dns.html
na forum mysql: http://forums.mysql.com/read.php?30,27073,27073#msg-27073
środa, 16 września 2009
nfs - dlaczego nie działa?
Niby wszystko ładnie pięknie a tu ... nie wstaje po restarcie maszyny.
Tak samo jak apache z wirtualną domeną podpiętą pod zasób udostępniany przez nfs.
Chwila googlowania i jest powód oraz rozwiązanie sytuacji.
Zasób montowany poprzez fstab nie może zostać przypięty ponieważ podczas przetwarzania fstab-a nie działa jeszcze sieć. Z pomocą przychodzi pakiet autofs.
Do pliku /etc/auto.master dodałem
oraz stworzyłem plik /etc/auto.nfs w którym podaje opcje do montowania zasobu:
... i tak na pozostałych maszynach.
Tak samo jak apache z wirtualną domeną podpiętą pod zasób udostępniany przez nfs.
Chwila googlowania i jest powód oraz rozwiązanie sytuacji.
Zasób montowany poprzez fstab nie może zostać przypięty ponieważ podczas przetwarzania fstab-a nie działa jeszcze sieć. Z pomocą przychodzi pakiet autofs.
Do pliku /etc/auto.master dodałem
/home/cos_tam /etc/auto.nfs --timeout=3600 --ghost
oraz stworzyłem plik /etc/auto.nfs w którym podaje opcje do montowania zasobu:
katalog -fstype=nfs,soft,intr,rsize=8192,wsize=8192 adres_ip:/home/katalog_zdalny
... i tak na pozostałych maszynach.
czwartek, 1 stycznia 2009
Eh dawno mnie tu nie było
No to trzeba nadrabiać zaległości. Zacznijmy od początku... a może to właściwie koniec. Wszystko jedno sylwester. A ten był spędzony we Wrocławiu ze zgrają mafijnych koleszków.

To zdjęcie najlepiej oddaje charakter zabawy, wielkie dzięki wszystkim uczestnikom.

To zresztą też :)

A to radosna twórczość Mateusza - super

To zdjęcie najlepiej oddaje charakter zabawy, wielkie dzięki wszystkim uczestnikom.

To zresztą też :)

A to radosna twórczość Mateusza - super
czwartek, 11 września 2008
Symfony krok 5
W pliku /apps/frontend/config/routing.yml można ustawić która strona zostaje wyświetlona jako "index" naszej aplikacji:
homepage:
url: /
param: { module: question, action: list }
wtorek, 9 września 2008
Symfony user managmet and sessions
Sesje użytkowników są przechowywane w symfony w obiekcie User. Możemy pobrać ten obiekt w dowolnym miejscu za pomocą metody getUser();
Oczywiście w tym obiekcie możemy przechowywać obiekty (niezalecane) i zmienne które będą dostępne pomiędzy wywołaniami stron.
Zmienne możemy ustawiać, pobierać i czyścić
Do sesji użytkownika możemy dobrać się także z szablonów
Jeśli potrzebujemy przechować informację tylko do kolejnego wywołania, np potwierdzenie zapisania/usunięcia/edycji danych możemy skorzystać z metody setFlash i getFlash. Dane zapisane za pomocą tych metod zostaną usunięte przy kolejnym wywołaniu.
np.
Ciasteczka
W symfony możemy decydować gdzie zapisane są ciasteczka. Określamy to w pliku apps/myapp/config/factories.yml
Po stronie aplikacji sesje są przechowywane domyślnie w plikach. Możemy to zmienić w pliku apps/myapp/config/factories.yml
Czas przechowywania sesji można ustawić w pliku apps/myapp/config/settings.yml
class mymoduleActions extends sfActions
{
public function executeFirstPage()
{
$nickname = $this->getRequestParameter('nickname');
// Store data in the user session
$this->getUser()->setAttribute('nickname', $nickname);
}
public function executeSecondPage()
{
// Retrieve data from the user session with a default value
$nickname = $this->getUser()->getAttribute('nickname', 'Anonymous Coward');
}
}
Oczywiście w tym obiekcie możemy przechowywać obiekty (niezalecane) i zmienne które będą dostępne pomiędzy wywołaniami stron.
Zmienne możemy ustawiać, pobierać i czyścić
class mymoduleActions extends sfActions
{
public function executeRemoveNickname()
{
$this->getUser()->getAttributeHolder()->remove('nickname');
}
public function executeCleanup()
{
$this->getUser()->getAttributeHolder()->clear();
}
}
Do sesji użytkownika możemy dobrać się także z szablonów
Hello, getAttribute('nickname') ?>
Jeśli potrzebujemy przechować informację tylko do kolejnego wywołania, np potwierdzenie zapisania/usunięcia/edycji danych możemy skorzystać z metody setFlash i getFlash. Dane zapisane za pomocą tych metod zostaną usunięte przy kolejnym wywołaniu.
np.
$this->setFlash('attrib', $value);
$value = $this->getFlash('attrib');
// i w szablonach
has('attrib')): ?>
get('attrib') ?>
Ciasteczka
W symfony możemy decydować gdzie zapisane są ciasteczka. Określamy to w pliku apps/myapp/config/factories.yml
all:
storage:
class: sfSessionStorage
param:
session_name: my_cookie_name
Po stronie aplikacji sesje są przechowywane domyślnie w plikach. Możemy to zmienić w pliku apps/myapp/config/factories.yml
all:
storage:
class: sfMySQLSessionStorage
param:
db_table: SESSION_TABLE_NAME # Name of the table storing the sessions
database: DATABASE_CONNECTION # Name of the database connection to use
Czas przechowywania sesji można ustawić w pliku apps/myapp/config/settings.yml
default:
.settings:
timeout: 1800 # Session lifetime in seconds
Symfony krok 4
W niektórych przypadkach potrzebujemy tylko wysłać nagłówek:
lub wybrać szablon o dowolnej nazwie
Przydatnymi metodami są także forward, redirect i forward404 (nie można znaleźć strony. Dzięki nim możemy przejść do innej akcji w innym module lub załadować dowolną stronę.
Jeśli mamy czynność którą musimy powtórzyć przed / po wykonaniu każdej akcji możemy utworzyć metody preExecute() i postExecute()
Funkcje pomocne przy wykonywaniu akcji:
Przykłady wykorzystania:
pobieranie parametrów:
upload plików:
public function executeRefresh()
{
$output = '<"title","My basic letter"],["name","Mr Brown">';
$this->getResponse()->setHttpHeader("X-JSON", '('.$output.')');
return sfView::HEADER_ONLY;
}
lub wybrać szablon o dowolnej nazwie
$this->setTemplate('myCustomTemplate');
Przydatnymi metodami są także forward, redirect i forward404 (nie można znaleźć strony. Dzięki nim możemy przejść do innej akcji w innym module lub załadować dowolną stronę.
$this->forward('otherModule', 'index');
$this->redirect('otherModule/index');
$this->redirect('http://www.google.com/');
/**
* szablon do strony 404 znajduje się w $sf_symfony_data_dir/modules/default/
* możemy także nadpisać akcje error404 w dowolnym module, oraz dołączyć do modułu
*/
forward404();
/**
* istnieje tez kilka funkcji pomocniczych które ułatwią nam pracę
*/
forwardIf();
forwardUnless();
forward404If();
forward404Unless();
redirectIf();
redirectUnless();
$this->forward404If(!$article);
Jeśli mamy czynność którą musimy powtórzyć przed / po wykonaniu każdej akcji możemy utworzyć metody preExecute() i postExecute()
public function preExecute()
{
// The code inserted here is executed at the beginning of each action call
...
}
public function executeIndex()
{
...
}
public function executeList()
{
...
$this->myCustomMethod(); // Methods of the action class are accessible
}
public function postExecute()
{
// The code inserted here is executed at the end of each action call
...
}
Funkcje pomocne przy wykonywaniu akcji:
Name Function Sample Output
Request Information
getMethod() Request method Returns sfRequest::GET or sfRequest::POST constants
getMethodName() Request method name 'POST'
getHttpHeader('Server') Value of a given HTTP header 'Apache/2.0.59 (Unix) DAV/2 PHP/5.1.6'
getCookie('foo') Value of a named cookie 'bar'
isXmlHttpRequest()* Is it an Ajax request? true
isSecure() Is it an SSL request? true
Request Parameters
hasParameter('foo') Is a parameter present in the request? true
getParameter('foo') Value of a named parameter 'bar'
getParameterHolder()->getAll() Array of all request parameters
URI-Related Information
getUri() Full URI 'http://localhost/myapp_dev.php/mymodule/myaction'
getPathInfo() Path info '/mymodule/myaction'
getReferer()** Referrer 'http://localhost/myapp_dev.php/'
getHost() Host name 'localhost'
getScriptName() Front controller path and name 'myapp_dev.php'
Client Browser Information
getLanguages() Array of accepted languages Array( [0] => fr [1] => fr_FR [2] => en_US [3] => en )
getCharsets() Array of accepted charsets Array( [0] => ISO-8859-1 [1] => UTF-8 [2] => * )
getAcceptableContentTypes() Array of accepted content types Array( [0] => text/xml [1] => text/html
Przykłady wykorzystania:
pobieranie parametrów:
class mymoduleActions extends sfActions
{
public function executeIndex()
{
$hasFoo = $this->getRequest()->hasParameter('foo');
$hasFoo = $this->hasRequestParameter('foo'); // Shorter version
$foo = $this->getRequest()->getParameter('foo');
$foo = $this->getRequestParameter('foo'); // Shorter version
}
}
upload plików:
class mymoduleActions extends sfActions
{
public function executeUpload()
{
if ($this->getRequest()->hasFiles())
{
foreach ($this->getRequest()->getFileNames() as $uploadedFile)
{
$fileName = $this->getRequest()->getFileName($uploadedFile);
$fileSize = $this->getRequest()->getFileSize($uploadedFile);
$fileType = $this->getRequest()->getFileType($uploadedFile);
$fileError = $this->getRequest()->hasFileError($uploadedFile);
$uploadDir = sfConfig::get('sf_upload_dir');
$this->getRequest()->moveFile($uploadedFile, $uploadDir.'/'.$fileName);
}
}
}
}
Subskrybuj:
Posty (Atom)