PHP sessions not being saved in memcache
Solution 1
OK, we managed to figure out the issue.
First, we created a simple page that spit out phpinfo(). Note that it is important that you run this thru the web server - running php -i DOES NOT include any overrides that apache may add.
Under the session section, the output lists all the directives, and a "Local Value" and a "Master Value".
The local values had:
session.save_handler files
session.save_path /var/lib/php/session
while the master values had:
session.save_handler memcache
session.save_path tcp://<endpoint>:11211
It turns out that there's an override installed by default in /etc/httpd/conf.d/php.conf that specifies the files. This appears to be a Redhat/CentOS/Fedora thing.
Removing those values from php.conf fixed the problem.
Solution 2
Both of the major memcache PHP PECL extensions have session handlers. Either will require you to install a PECL module before use.
The Memcache PECL extension session handler is enabled with the following in php.ini:
session.save_handler = "memcache"
session.save_path = "tcp://memcacheServerAddressHere:11211?persistent=1&weight=2&timeout=2&retry_interval=10"
The Memcached PECL extension session handler is enabled with the following in php.ini:
session.save_handler = "memcached"
session.save_path = "memcacheServerAddressHere:11211"
Note that the Memcache extension appears to allow more configuration of the Memcache environment.
chris
Updated on June 04, 2022Comments
-
chris almost 2 years
Running an application using php 5.4 on AWS using the Amazon Linux.
PHP version is PHP 5.4.28. memcache lib installed from the AWS repo is php54-pecl-memcache-3.0.8-1.11.amzn1.x86_64
I have verified that php is using /etc/php.ini:
[[email protected]]# php -i | grep Config Configuration File (php.ini) Path => /etc Loaded Configuration File => /etc/php.ini
The setting show that I should be using memcache:
[root@ip-10-40-17-119 etc]# grep "^session.save" php.ini session.save_handler="memcache" session.save_path="tcp://<elasticache-endpoint>:11211" [root@ip-10-40-17-119 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
I can telnet from the box to the end point & port and connect properly, so the instance is able to connect to the memcached server.
Things that we have tried:
- I have removed the tcp:// from the php.ini file, and that made no difference - sessions are still getting saved in files.
- We have changed from session.save_handler="memcache" to session.save_handler="memcached"
- each time we make a change, we stop the httpd server, and then start it again
- we have even tried rebooting the servers
Regardless of what we've tried, sessions are stored on disk to /var/lib/php/sessions. Is there something I'm missing, or is this a known 5.4 or AWS issue?
-
chris almost 10 yearsWe are using the memcache extenstion, which is installed and working correctly for data caches. It's only the sessions that are not working.
-
user3733902 almost 10 yearsTry to use connection url without "tcp://" session.save_path => <elasicache-endpoint>:11211?persistent=1&weight=1&timeout=1&retry_interval=15 => <elasticache-endpoint>:11211?persistent=1&weight=1&timeout=1&retry_interval=15
-
chris almost 10 yearsUpdated the question - we tried this, and it made no difference.
-
user3733902 almost 10 yearsTry to change "memcache" to "memcached" in the php.ini like this : session.save_handler = "memcached"
-
nl-x almost 10 yearsA bit what I said in the comments... look at
phpinfo()
. Only I was guessing your configuration would be pointing to another php.ini. So did the php.conf file only overwrite the session setting or did it point to another php.ini file? -
chris almost 10 years@nl-x: the php.conf overrides the settings in php.ini, but only for php run through the web server. That's why we didn't see it running php -i.
-
soipo about 8 yearsAbsolutely brilliant man, I was getting crazy with this, I am using CentOs7 and I can confirm that there is an override in php.conf.