我为我的PHP (runtime: php55)
应用运行了本地Google Cloud App Engine模拟器。除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。在谷歌小组中,建议使用php-cgi为我解决了这个问题。但现在我仍然遇到这个问题,这似乎与Memcache有关。
这是在Linux Mint(Ubuntu)上,在我在模拟器中运行相同应用程序的Windows机器上没有出现此问题。
当我安装php-memcache时,我无法启动应用程序。当安装了php-memcache运行上面的命令时,我收到此错误:
PHPEnvironmentError: The PHP runtime cannot be run with the
"Memcache" PECL extension installed
我该如何解决这个问题?
答案 0 :(得分:0)
我没有解决PHP cgi的问题,但我通过编写自己的会话处理程序来解决它。 GAE默认情况下使用“用户”会话处理程序将会话存储在Memcache中。如果由于某种原因无效,您可以使用以下代码将本地GAE切换为“文件”会话处理程序并将会话存储在文件夹中:
<?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();
答案 1 :(得分:0)
首先,在遇到与您相同的问题时,我发现here表示:
PHP 7.2运行时不支持dev_appserver.py。要测试您的应用程序并在本地运行,必须下载并安装PHP 7.2并设置Web服务器。
话虽这么说,使用php-cgi和java似乎正在运行,但有一些区别,确实必须在php.ini
中禁用memcache扩展,但是运行时会注册Memcached
类,因此应该在开发人员和App Engine环境中均可工作:
extension_loaded('memcached') || class_exists('Memcached')
回到您的问题,我通过在开发人员模式下解决此会话错误:
ini_set('session.save_handler', 'files');
ini_set('session.save_path', null);