2009-05-25 13 views
11

Jestem nowym użytkownikiem php, ale w innych technologiach internetowych można udostępniać obiekty między instancjami stron. Na przykład na stronach JSP dla java łatwo można znaleźć w klasie, która istnieje jako klasa statyczna dla całej instancji serwera. Jak to zrobić w php?Czy istnieje sposób na udostępnianie obiektów między stronami php?

Nie odwołuję się do zmiennych sesji (przynajmniej nie sądzę). Jest to bardziej przydatne do pulowania zasobów (może to być gniazdo do współużytkowania lub połączenia z bazą danych itp.). Tak więc cała klasa musi być dzielona między kolejne ładunki, a nie tylko niektóre prymitywne zmienne, które mogę przechowywać w sesji.

Zajrzałem również do wykonywania klas singletowych php, ale uważam, że klasa jest udostępniana tylko na tej samej stronie, a nie na stronach.

Aby wszystko było jeszcze bardziej przejrzyste, szukam czegoś, co może mi pomóc udostępnić, powiedzmy, gniazdo podłączone do serwera na stronie connectSocket.php tak, że wszyscy użytkownicy, którzy ładują tę stronę, używają tego samego gniazda i nie otwiera nowego.

Odpowiedz

15

To jest trochę trudna odpowiedź i może nie być dokładnie tym, czego szukasz.

PHP jest oparte na architekturze "shared-nothing". Jeśli potrzebujesz jakiegoś stanu we wszystkich aplikacjach, musisz to zrobić w inny sposób.

Najpierw polecam zajrzeć do sedna problemu. Czy naprawdę tego potrzebujesz? Jeśli założysz, że aplikacja PHP może zginąć (i stracić stan), czy można zgubić dane?

Jeśli musisz utrzymywać stan, nawet po zgonie aplikacji lub w inny sposób, powinieneś założyć, że prawdopodobnie najlepsze miejsce do umieszczenia danych w MySQL. PHP ma być cienką warstwą wokół logiki biznesowej, więc mogę to bardzo polecić.

Jeśli nie zależy Ci na utracie danych po ponownym uruchomieniu, domena problemu, której szukasz, prawdopodobnie buforuje. Polecam, patrząc na memcached lub jeśli jesteś na jednej maszynie, apc. APC na pewno będzie działać z Apache na jednym komputerze, ale nadal będziesz musiał zakodować aplikację, zakładając, że możesz utracić dane.

Jeśli obawiasz się, że bazowy magazyn danych (MySQL) jest zbyt wolny, ale nadal potrzebujesz danych po ponownym uruchomieniu, powinieneś sprawdzić kombinację tych dwóch systemów. Zawsze możesz naciskać i wyciągać dane z pamięci podręcznej, ale tylko wtedy, gdy aktualizacje będą wysyłane do Mysql.

Jeśli dane dotyczą wyłącznie użytkownika lub sesji, prawdopodobnie chcesz przejrzeć system sesji.

Osobiście opracowałem rozsądnie dużą aplikację dla wielu dzierżawców i chociaż jest to dość złożona aplikacja, nigdy nie potrzebowałem prawdziwego stanu, którego szukasz.

Aktualizacja: Niestety, nie przeczytałem Twojej notatki o udostępnianiu gniazda. Będziesz potrzebował oddzielnego demona, aby sobie z tym poradzić, być może, jeśli będziesz mógł dalej wyjaśnić swój problem, mogą istnieć inne podejścia. Jaki to rodzaj gniazda?

1

Większość bibliotek baz danych PHP już używa puli połączeń. Na przykład wywołujesz pg_connect, tak jakbyś żądał nowego połączenia, ale jeśli ciąg połączenia jest taki sam, jak połączenie, które już istnieje, zamiast tego otrzymasz ustanowione połączenie. Jeśli zależy Ci tylko na puli dostępu do bazy danych, możesz po prostu potwierdzić, że istnieje w używanej bibliotece db.

+1

Mimo że odpowiedź jest prawidłowa, często nie zaleca się korzystania z tych trwałych połączeń. Tworzenie nowych połączeń jest często bardzo tanie, a to oznacza, że ​​nie będziesz musiał ich wszystkich przechowywać przez długi czas. Z reguły łączę się tylko z dbem, gdy robię pierwsze zapytanie i pozbywam się go tak szybko, jak tylko mogę. Bazy danych są trudne do skalowania, PHP jest o wiele łatwiejsze. – Evert

3

Jest to prawdopodobnie częściowa odpowiedź, ale można zapisać instancję klasy w zmiennej Session i uzyskać do niej dostęp w innym czasie.

+3

To niestety nie działa z otwartymi gniazdami. – Evert

12

Istnieje zasadnicza różnica między obsługiwaną przez WWW Javą a obsługiwanymi przez Internet językami interpretowanymi, takimi jak PHP i Perl. W Javie twój serwer internetowy będzie miał środowisko operacyjne, które utrzymuje stan (tj. Tomcat). W przypadku interpretowanych języków żądanie na twój serwer internetowy generuje nowy wątek serwera WWW, który z kolei ładuje nowe środowisko operacyjne dla tego wątku, w tym przypadku środowiska PHP.

Dlatego w PHP nie ma koncepcji instancji strony. Każde żądanie do serwera internetowego to nowy początek. Wszystkie klasy są ponownie ładowane, więc nie ma koncepcji dzielenia się klasami, ani nie istnieje koncepcja łączenia zasobów, chyba że jest zaimplementowana zewnętrznie.

Współdzielenie gniazd między żądaniami sieci Web nie jest więc możliwe.

+0

Nie prawda, a co z memcache? – Pacerier

0

Innym rozwiązaniem horroble może być załadowanie danych obiektu do dowolnej zmiennej $ _SESSION, a następnie ponowne jej wykorzystanie w obiekcie drugiej strony. W rzeczywistości jest to rozwiązanie, które zamierzam realizować w moim projekcie, dopóki nie otrzymam lepszego.

Pozdrawiam!

Powiązane problemy