Я запускаю локальный эмулятор Google Cloud App Engine для моего PHP (runtime: php55)
приложение. Это работает, за исключением сессий PHP. Я получаю следующее сообщение:
Warning: session_start(): Failed to read session data: user (path: Memcache)
Я запускаю приложение с помощью следующей команды
dev_appserver.py --php_executable_path=/usr/bin/php-cgi ./default
Поэтому я использую php-cgi. До этого я пытался запустить с обычным PHP, но затем я получил WSOD. В группе Google было предложено использовать php-cgi, что решило эту проблему для меня. Но теперь у меня все еще есть эта проблема, которая, кажется, связана с Memcache.
Это на Linux Mint (Ubuntu), и эта проблема не возникала на машине Windows, где у меня работает то же приложение в эмуляторе.
Когда я устанавливаю php-memcache, я больше не могу запустить приложение. При запуске вышеупомянутой команды с установленным php-memcache я получаю эту ошибку:
PHPEnvironmentError: The PHP runtime cannot be run with the
"Memcache" PECL extension installed
Как мне это решить?
Я не решил проблему с PHP cgi, но я обошел ее, написав собственный обработчик сессии. GAE по умолчанию сохраняет сеансы в Memcache с помощью обработчика сеансов пользователя. Если это по какой-то причине не работает, вы можете использовать мой следующий код, чтобы переключить ваш локальный GAE на обработчик сеансов ‘files’ и сохранить сеансы в папке:
<?php
if ($_SERVER['SERVER_NAME'] == 'localhost') {
class FileSessionHandler {
private $savePath;
function open($savePath, $sessionName) {
$this->savePath = $savePath;
if (!is_dir($this->savePath)) {
mkdir($this->savePath, 0777);
}
return true;
}
function close() {
return true;
}
function read($id) {
return (string) @file_get_contents("$this->savePath/sess_$id");
}
function write($id, $data) {
return file_put_contents("$this->savePath/sess_$id", $data) === false ? false : true;
}
function destroy($id) {
$file = "$this->savePath/sess_$id";
if (file_exists($file)) {
unlink($file);
}
return true;
}
function gc($maxlifetime) {
foreach (glob("$this->savePath/sess_*") as $file) {
if (filemtime($file) + $maxlifetime < time() && file_exists($file)) {
unlink($file);
}
}
return true;
}
}
$handler = new FileSessionHandler();
session_set_save_handler(
array($handler, 'open'), array($handler, 'close'), array($handler, 'read'), array($handler, 'write'), array($handler, 'destroy'), array($handler, 'gc')
);
session_save_path('[PATH_TO_WRITABLE_DIRECTORY]');
register_shutdown_function('session_write_close');
}
session_start();
Других решений пока нет …