GAE gcloud dev_appserver.py PHP:无法读取会话数据:user(path:Memcache)

时间:2017-01-10 03:26:05

标签: php linux google-app-engine google-cloud-platform gcloud

我为我的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

我该如何解决这个问题?

2 个答案:

答案 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);