WP-Cache – rozwiązania problemów z semget i działaniem

WP-Cache to bardzo przydatny plugin do Word Press’a. Plugin ten zapisuje każdą wygenerowaną stronę w postaci statycznego pliku HTML na serwerze przez co znacznie zmniejsza obciążenie serwera i bazy danych. Długość cache, jak i reguły opisujące pliki/strony, które mają być cache’owane można ustawić z poziomu panelu WP.

Ostatnio zetknąłem się z dwoma problemami w użytkowaniu tego plugina, poniżej rozwiązania:

Problem 1:
Za każdym razem, gdy strona generowana jest po raz pierwszy pojawia się komunikat w górze strony:

Warning: semget() failed for key 0x152b: Permission denied in /XXX/wp-content/plugins/wp-cache/wp-cache-phase2.php on line 98

Rozwiązanie:
Trzeba zedytować plik: wp-content/plugins/wp-cache/wp-cache-phase2.php w linii 98:
zamienić:

$mutex = sem_get($sem_id, 1, 0644 | IPC_CREAT, 1);

na

$mutex = @sem_get($sem_id, 1, 0644 | IPC_CREAT, 1);

Znak @ przed funkcją php blokuje komunikaty o błędach, spowodowanych daną funkcją.

Alternatywą tego rozwiązania jest dopisanie

ini_set( 'display_errors', 0 );

w pliku wp-config.php W tym wypadku zablokujemy wyświetlania się komunikatów o błędach globalnie w całym Word Press’ie.

Problem 2:
WP-Cache jest poprawnie zainstalowane, włączone, jednak strony się nie cache’ują.

Sprawdz czy w katalogu wp-content znajduje się plik

!advanced-cache.php

Jeżeli tak to oznacza, że WP-Cache ma źle podlinkowany plik wp-cache-phase1.php

Rozwiązanie:
Najpierw należy skasować plik !advanced-cache.php.

Następnie przypadku gdy mamy dostęp ssh trzeba z poziomu katalogu wp-content wykonać polecenie unix’owe, które stworzy link symboliczny do tego pliku wykorzystywany przez skrypty WP:

ln -s   plugins/wp-cache/wp-cache-phase1.php advanced-cache.php

Gdy nie mamy ssh musimy zainstalować wtyczkę jeszcze raz (zdeaktywować i aktywować).

Przyjemna komunikacja php – flash czyli AMFPHP

Z pewnością każdy programista php, który w swoim projekcie musiał komunikować się z flash’em na własnej skórze doświadczył, że nie jest to zadanie ani przyjemne ani przyjazne w implementacji.

Aby przekazać dane flash’owi, skrypty muszą generować XML’e, które następnie zasysa flash i przetwarza Action Script’em. Bolączek tego rozwiązania jest wiele, poczynając od dodatkowego czasu potrzebnego na implementacje, wygenerowania XML i późniejszego jego zdekodowania a skończywszy na generowaniu sztucznego transferu, ograniczeniach w wielkości plików XML i trudności w debugowaniu.

Znamy zatem bolączki standardowej komunikacji php-flash, zatem trzeba zadać sobie pytanie czy możemy ich uniknąć? Oczywiście!

AMFPHP czyli przyjazna komunikacja na lini php – flash

AMFPHP to open source’owa implementacja Action Message Format (AMF). Bibliteka ta poprzez RPC (Remote Procedure Call) pośredniczy w komunikacji skryptów Action Script ze skryptami serwerowymi, przesyłane dane są serializowane do postaci binarnej. Wymiana danych następuje poprzez plik gateway.php. AMFPHP zachowuje typu danych: obiekt, tablica, wartości typu int, null, bool będą w tej samej postaci dostępne w Action Script w php.

Powyższy opis może nieco odstraszać egzotycznymi nazwami, to tylko teoria w praktyce nie ma się czego obawiać, zaraz na przykładzie pokaże, że instalacja jak i konfiguracja jest banalna.

1. Ściągamy najnowszą wersję AMFPHP, aktualnie jest to wersja 1.9 beta 2. Znaczkiem beta nie ma się co zanadto przejmować, gdyż wersja ta jest stabilna i dobrze przetestowana.
2. Rozpakowywujemy archiwum powyżej document_root gdyż katalog browser i plik gateway.php muszą być dostępne przez HTTP. Resztę plików można by schować poniżej document_root, jednak na potrzeby tej prezentacji nie będę się w takie szczgóły zagłębiać.
3. W katalogu services tworzymy usługi, które maja postac klas PHP. Kod przykładowej usługi:

<?php
require_once( '/my_application/library/core_classes/game.php' );

class FlashGame {

	private $game;
	
	public function __construct() {
		$this->game = new Game();
	}
	
	/**
	 * Metoda zwraca informacje o grze i uzytkowniku
	 *
	 * @param integer - id gry
	 * @param integer - id usera
	 * @return array
	 */
	public function getResults( $gameID, $userID ) {
		$response['info'] = $this->game->getGameInfo( $gameID );
		$response['user'] = $this->game->getUserInfo( $userID );

		return $response;
	}

	/**
	 * Metoda usua uzytkownika
	 *
	 * @param integer - id usera
	 * @return bool
	 */
	public function remove( $userID ) {
		return (bool)$this->game->remove( $userID );
	}
	
	/**
	 * Metoda zwraca obiekt gry
	 *
	 * @return Object
	 */
	public function getGameObject() {
		return $this->game->getGameObject();
	}
}
?>

Klasy usług powinny być maksymalnie proste i jedynie odwoływać się do klas logiki biznesowej aplikacji. Taka konstrukcja zapewnia jasny i przejrzysty kod aplikacji i jest zgodna z kanonami programowania.

Jeżeli poprawnie wykonaliśmy powyższe operacje to będziemy mogli odpalić browsera i z jego poziomu przetestować działanie. Odpalamy browsera (tutaj przykład), przy pierwszym odpaleniu pyta się nas o ścieżkę do gateway i prezentacje wyników, wybierzmy 'tree view’, i klikamy OK.

Po lewej stronie widzimy dostępne usługi, po dwukrotnym kliknięciu na nazwę usługi pojawiają nam się dostępne metody. Domyślnie widoczne są wszystkie metody, można to zmienić pisząc znak podkreślenia na początku jej nazwy. Każda metoda opisana jest komentarzem wyciągniętym z klasy oraz zawiera pola na wprowadzenie testowych danych. Pola te odpowiadają parametrom przyjmowanym przez tą metodę.

Z poziomu browsera możemy przetestować działanie metod poprzez kliknięcie na przycisk call, wyniki prezentowane są w oknie poniżej. Prezentowany wynik jest identyczny z tym co dostaje Flash. Po publikacji aplikacji należy pamiętać o skasowaniu lub zabezpieczeniu hasłem dostępu katalog browsera.

Zatem podsumujmy co daje nam AMFPHP:

  • oszczędność w implementacji
  • łatwe testowanie i debugowanie aplikacji
  • mniejszy transfer serwera
  • większa szybkość działania aplikacji
  • przejrzystość i skalowalność
  • bezpieczeństwo (dane przesyłane binarnie a XML w postaci jawnej)
  • proste wdrożenie do aplikacji

Tutaj do ściągnięcia jest cała paczka AMFPHP wraz z przykładowymi serwisami.

Startup PoSasiedzku.pl – witaj w sąsiedztwie!

Ostatnio miałem przyjemność przyjrzeć się bliżej jednemu z wrocławskich startupów – PoSasiedzku.pl.

Serwis, jak sama nazwa mówi, służy do nawiązywania 'sąsiedzkich relacji’. Główną ideą serwisu jest budowanie społeczności poprzez łączenie ludzi z okolicy – sąsiadów. Słowo sąsiad nie jest nigdzie zdefiniowane, może to być sąsiad z bloku obok a może być i sąsiad internetowy. Sąsiedzi grupują się w społeczności. Społecznością może być wszystko – osiedle, miasto, ulica a nawet hotel czy most. Bardzo trafionym pomysłem było mocne zintegrowanie serwisu z Google Maps dzięki czemu relacje sąsiedzkie są dodatkowo podkreślone.
Każdy użytkownik ma wgląd do aktualnych wydarzeń w społecznościach, do których należy bądź do których ma niedaleko. Oczywiście serwis posiada wszystkie funkcjonalności społecznościowe, użytkownicy mogą się komunikować, upiększać swój profil zdjęciami, pisać blogi etc.

Osobiście jestem dosyć sceptycznie nastawiony do powstających portali społecznościowych, tak jest i w tym przypadku, tym bardziej gdy serwis nie ma pewnej konkretnej tematyki, która mogła by scalić użytkowników. Aktualnie miejscem, które skupia Polaków, jest nasza-klasa.pl i trzeba wymyślić coś więcej ponad motyw społeczności/znajomości, aby móc osiągnąć sukces.

Nie jestem pewien, czy sama chęć poznania sąsiadów będzie wystarczającą motywacją do korzystania z serwisu. Osobiście szanse serwisu upatruje nie tyle w ideologii sąsiedzkiej co informacyjnej. Jeżeli społeczności miejskie w poSąsiedzku.pl będą chciały informować się na wzajem o tym, co się wokół nich dzieje, to dla każdego miasta może powstać coś na kształt wrocek.pl. Jednak do tego daleka droga.

Niestety nie będzie to droga łatwa gdyż, mentalność polskich użytkowników internetu jest dosyć samolubna i z zasady nie chcą dzielić się 'za darmo’. Aby użytkownicy udzielali się społecznie, muszą być odpowiednio zmotywowani pewnymi gratisami: rangi, uprawnienia czy nagrody… we wrocku tego nie ma i serwis już dawno przestał rozwijać.

Grafika serwisu jest bardzo estetyczna, dosyć specyficzna, rzekłbym nawet że trochę cukierkowa. W pierwszym momencie, poprzez swoją unikalność i wyrazistość, bardzo przypadła mi do gustu, teraz po 2 tygodniowej styczności z serwisem zaczyna męczyć.

W tej chwili serwis opatrzony jest znaczkiem beta 1.1, termin wersji ostatecznej nie jest znany, miejmy nadzieje, że nie pójdą w ślady gmaila czy belysio i będzie to niebawem. Twórcy zapowiadają, że w najbliższym czasie dodadzą nowe funkcjonalności (ciekawe jakie?) – czekam z niecierpliwością.

Życzę powodzenia.

Tymczasem zapraszam do sąsiedztwa!