2014-06-12 14 views
7

Uruchamianie aplikacji przy użyciu php 5.4 na AWS przy użyciu Amazon Linux.Sesje PHP nie są zapisywane w memcache

Wersja PHP to PHP 5.4.28. memcache Ilb zainstalowany z repo AWS php54-pecl-memcache-3.0.8-1.11.amzn1.x86_64

I sprawdzeniu, że PHP stosuje /etc/php.ini:

[[email protected]]# php -i | grep Config 
Configuration File (php.ini) Path => /etc 
Loaded Configuration File => /etc/php.ini 

ustawienie pokazać, że należy przy użyciu memcache:

[[email protected] etc]# grep "^session.save" php.ini 
session.save_handler="memcache" 
session.save_path="tcp://<elasticache-endpoint>:11211" 

[[email protected] php.d]# php -i | grep session.save 
session.save_handler => memcache => memcache 
session.save_path => tcp://<elasicache-endpoint>:11211?persistent=1&weight=1&timeout=1&retry_interval=15 => tcp://<elasticache-endpoint>:11211?persistent=1&weight=1&timeout=1&retry_interval=15 

można telnet z pudełka do portu końcowego punkt & i podłączyć prawidłowo, więc instancja jest w stanie połączyć się z serwerem memcached.

Rzeczy, które próbowaliśmy:

  • usunąłem TCP: // z pliku php.ini, i że nie ma różnicy - sesje są nadal uzyskiwanie zapisane w plikach.
  • Zmieniliśmy od session.save_handler = „memcache” do session.save_handler = „memcached”
  • każdym razem dokonać zmiany, zatrzymujemy serwer httpd, a następnie uruchomić go ponownie
  • mamy nawet próbował ponowne uruchamianie serwerów

Niezależnie od tego, co próbowaliśmy, sesje są przechowywane na dysku do/var/lib/php/sessions. Czy jest coś, czego mi brakuje, czy jest to znany problem 5.4 lub AWS?

+0

Czy możesz wypróbować 'memcached' jako handler zamiast' memcache'? – DanFromGermany

+0

@DanFromGermany: Nie, jest to starszy kod i używa memcache dla buforów podręcznych. – chris

+0

PHP 5.4.29 nie jest starszą wersją. Po prostu zainstaluj moduł memcached i spróbuj. Nie wpłynie to na twój kod PHP. Czy przy okazji zrestartowałeś PHP (albo serwer WWW, czy to moduł, czy fpm, jeśli to fcgi)? – DanFromGermany

Odpowiedz

13

OK, udało nam się rozgryźć problem.

Najpierw stworzyliśmy prostą stronę, która wypluła phpinfo(). Zauważ, że ważne jest, aby uruchomić to przez serwer WWW - z uruchomionym php -i NIE zawiera żadnych przesłonięć, które może dodać apache.

W sekcji dotyczącej sesji wyniki zawierają listę wszystkich dyrektyw oraz "Wartość lokalną" i "Wartość wzorcową".

Wartości lokalne miały:

session.save_handler files 
session.save_path /var/lib/php/session 

podczas gdy wartości Mistrz:

session.save_handler memcache 
session.save_path tcp://<endpoint>:11211 

Okazuje się, że jest przesłonięcie domyślnie instalowany w /etc/httpd/conf.d/php .conf, który określa pliki. Wygląda na to, że jest to Redhat/CentOS/Fedora.

Usunięcie tych wartości z php.conf rozwiązało problem.

+0

Trochę tego, co powiedziałem w komentarzach ... spójrz na 'phpinfo()'. Tylko zgaduję, że twoja konfiguracja wskazywałaby na inne php.ini. Czy plik php.conf nadpisał tylko ustawienie sesji, czy też wskazywał na inny plik php.ini? –

+0

@ nl-x: php.conf zastępuje ustawienia w php.ini, ale tylko dla php uruchamianego przez serwer sieciowy. Dlatego nie widzimy, żeby działał php -i. – chris

+0

Absolutnie genialny człowiek, szalałem z tego powodu, używam CentOs7 i mogę potwierdzić, że jest override w php.conf. – soipo

6

Oba główne rozszerzenia PHP PECL memcache mają procedury obsługi sesji. Albo będzie wymagać zainstalowania modułu PECL przed użyciem.

Memcache PECL obsługi sesji przedłużenie jest włączony z następujących w php.ini:

session.save_handler = "memcache" 
session.save_path = "tcp://memcacheServerAddressHere:11211?persistent=1&weight=2&timeout=2&retry_interval=10" 

Memcached PECL obsługi sesji przedłużenie jest włączony z następujących w php.ini:

session.save_handler = "memcached" 
session.save_path = "memcacheServerAddressHere:11211" 

Zauważ, że rozszerzenie Memcache wydaje się pozwalać na większą konfigurację środowiska Memcache.

+0

Używamy rozszerzania memcache, które jest instalowane i działa poprawnie dla buforów danych. To tylko sesje, które nie działają. – chris

+1

Spróbuj użyć adresu URL połączenia bez "tcp: //" session.save_path =>: 11211? Persistent = 1 & weight = 1 & timeout = 1 & retry_interval = 15 =>: 11211? Persistent = 1 & weight = 1 & timeout = 1 & retry_interval = 15 – user3733902

+0

Zaktualizowano pytanie - próbowaliśmy tego i nie robiło to żadnej różnicy. – chris