【问题标题】:GAE gcloud dev_appserver.py PHP: Failed to read session data: user (path: Memcache)GAE gcloud dev_appserver.py PHP:无法读取会话数据:用户(路径:Memcache)
【发布时间】:2017-01-10 03:26:04
【问题描述】:

我为我的 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。在 Google Group 中,有人建议使用 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 linux google-app-engine google-cloud-platform gcloud


    【解决方案1】:

    首先,在和你遇到同样的问题时,我发现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);
    

    【讨论】:

      【解决方案2】:

      我没有解决 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();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-26
        • 1970-01-01
        • 2015-02-28
        相关资源
        最近更新 更多