2016-07-07 111 views
1

在我的开发环境,我想,以取代旧重流浪VM与码头工人,使用docker-composePHP FPM Docker ZF1:会话已经启动。会话ID必须设置第一

version: '2' 
services: 
    nginx: 
     build: ./containers/nginx 
     networks: 
      mm: 
       ipv4_address: 172.25.0.101 
     environment: 
      APPLICATION_ENV: development 
     extra_hosts: 
      - "mysite.dev:127.0.0.1" 
     ports: 
      - 80:80 
     links: 
      - php 
     volumes: 
      - ../:/srv 

    php: 
     build: ./containers/php-fpm 
     networks: 
      mm: 
       ipv4_address: 172.25.0.102 
     volumes: 
      - ../:/srv 
     links: 
      - memcached 
     ports: 
      - 9000:9000 

    memcached: 
     image: memcached:latest 
     ports: 
      - 1234:11211 
     networks: 
      mm: 
       ipv4_address: 172.25.0.103 

networks: 
    mm: 
     driver: bridge 
     ipam: 
      driver: default 
      config: 
       - subnet: 172.25.0.0/24 

但是,应用程序编写与ZF1,每当我实例一个Zend_Session_Namespace对象只是Zend_Session::start()后出现以下错误:

Zend_Session_Exception: The session has already been started. The session id must be set first. in /srv/mm/vendor/zendframework/zendframework1/library/Zend/Session.php on line 667 

我已经试过这一切,mouting会话路径与VOLUME,改变session.save_path,一次又一次地安装了这一切,并没有任何反应。

回答

1

在花了很长时间调试这个问题后,我找到了你的问题的答案。在第二次呼叫Zend_Session::start()时,ZF将通过检查是否生成了正确的hash_bits_per_character来验证会话ID,该正确的hash_bits_per_character是否由php_ini设置session.hash_bits_per_character定义。

/** 
* From Zend_Session 
*/ 
protected static function _checkId($id) 
{ 
    $saveHandler = ini_get('session.save_handler'); 
    if ($saveHandler == 'cluster') { // Zend Server SC, validate only after last dash 
     $dashPos = strrpos($id, '-'); 
     if ($dashPos) { 
      $id = substr($id, $dashPos + 1); 
     } 
    } 

    $hashBitsPerChar = ini_get('session.hash_bits_per_character'); 
    if (!$hashBitsPerChar) { 
     $hashBitsPerChar = 5; // the default value 
    } 
    switch($hashBitsPerChar) { 
     case 4: $pattern = '^[0-9a-f]*$'; break; 
     case 5: $pattern = '^[0-9a-v]*$'; break; 
     case 6: $pattern = '^[0-9a-zA-Z-,]*$'; break; 
    } 
    return preg_match('#'.$pattern.'#', $id); 
} 

的问题是,由于某种原因,会话ID与hash_bits_per_char = 5而不是hash_bits_per_char = 4产生。因此,要解决这个问题,所有你需要做的是使用正确的方式调用Zend_Session::start()首次和Zend_Session就会检查散列位前强制session.hash_bits_per_char设置:

Zend_Session::setOptions(['hash_bits_per_char' => 5]); 
+0

就像一个魅力!只是稍微修正一下,在设置选项中它是'hash_bits_per_character'而不是'hash_bits_per_char'。你可以在应用程序或'session.hash_bits_per_character = 5'的'php.ini'文件中设置它。谢啦! –