gpt4 book ai didi

PHP FPM Docker ZF1 : The session has already been started. 必须先设置 session id

转载 作者:行者123 更新时间:2023-12-02 18:16:35 25 4
gpt4 key购买 nike

在我的开发环境中,我试图用 Docker 替换旧的重型 Vagrant VM,使用 docker-compose :

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

我已经尝试了所有方法,使用 VOLUME 设置 session 路径,更改 session.save_path ,一遍又一遍地安装它,没有任何 react 。

最佳答案

在花了很长时间调试这个问题之后,我找到了你问题的答案。第二次调用Zend_Session::start() ZF 将通过检查 session ID 是否由正确的 hash_bits_per_character 生成来验证 session ID。由 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);
}

问题是由于某种原因 session id 是用 hash_bits_per_character = 5 生成的。而不是 hash_bits_per_character = 4 .所以,要解决这个问题,你需要做的就是强制 session.hash_bits_per_character调用前设置 Zend_Session::start() Zend_Session 将第一次使用正确的模式检查哈希位:
Zend_Session::setOptions(['hash_bits_per_character' => 5]);

关于PHP FPM Docker ZF1 : The session has already been started. 必须先设置 session id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38252950/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com