问题
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:
[root@ip-xx.xx.xx.xx]# 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?
回答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.
回答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.
来源:https://stackoverflow.com/questions/24184568/php-sessions-not-being-saved-in-memcache