我收到的错误很多,就像这个:
Zend_Session_Exception: Session must be started before any output has been sent to the browser; output started in /usr/local/zend/share/pear/PHPUnit/Util/Printer.php/173
Run Code Online (Sandbox Code Playgroud)
运行我的应用程序的测试套件时.这是PHPUnit 3.5.10和PHP 5.3.5.
没有神秘的,意外的空白输出导致这种情况.我已经确定"发送到浏览器的输出"是正在执行的PHPUnit测试的实际输出.如果我打开PHPUnit/Util/Printer.php并print $buffer
用if (strpos($buffer, 'PHPUnit 3.5.10 by Sebastian Bergmann') === false)
(包括从PHPUnit中有效地停止输出的第一行)包装该行,那么我的第一个测试成功(直到测试用例输出一个指示测试成功的点,然后是下一个测试失败,因为输出了点).
我团队中的另一位开发人员能够成功运行完整的测试套件,因此我知道这不是应用程序代码的问题.它必须是我的本地环境的一些配置设置或问题.
我已经检查过php.ini来验证是否output_buffering
已打开并implicit_flush
关闭,它们是.
我也尝试添加Zend_Session::$_unitTestEnabled = true;
到我的测试引导程序,但这没有帮助(并且不应该是必要的,因为它适用于另一个开发人员的机器和我们的CI服务器上没有它).
除了忽略错误之外的任何建议?我从来没有见过这样的东西,我真的很茫然.
谢谢!
更新:
为了尝试进一步隔离问题,我通过执行以下测试脚本将ZF和我的应用程序排除在外:
<?php
class SessionTest extends PHPUnit_Framework_TestCase
{
public function testSession()
{
session_start();
$this->assertTrue(true);
}
}
Run Code Online (Sandbox Code Playgroud)
测试失败:
1) SessionTest::testSession
session_start(): Cannot send session cookie - headers already sent by (output started …
Run Code Online (Sandbox Code Playgroud) 我正在使用Zend_Auth(除其他外)使用Zend_Auth进行新的应用程序,但无论出于何种原因,此错误消息在任何位置完全随机出现(或者它接缝)
Zend_Session::start()
- /home/hannes/workspace/develop/library/Zend/Session.php(Line:480):错误#8session_start()
[function.session-start]:ps_files_cleanup_dir:opendir(/ var/lib/php5)失败:权限被拒绝( 13)阵列
我最近开始使用Zendframework 2构建应用程序,我在ZF1方面有很好的经验,我在ZF2面临的主要问题是会话.
这是我创建会话容器的方式.
use Zend\Session\Container;
Run Code Online (Sandbox Code Playgroud)
//会话容器创建:(以前我们将其称为命名空间)
$session_user = new Container('user');
$session_user_errors = new Container('usererrors');
$session_user_shares = new Container('usershares');
Run Code Online (Sandbox Code Playgroud)
现在像这样我有几个容器,
我可以清除这样一个特定容器的钥匙
//通过键从会话中获取值:(从命名空间获取值)
$email = $session_user->offsetGet('email');
Run Code Online (Sandbox Code Playgroud)
//在会话中设置值:(从命名空间设置值)
$session_user->offsetSet('username', 'abcd');
Run Code Online (Sandbox Code Playgroud)
现在我的问题是清除在我的应用程序的几个级别设置的整个容器.
如果我尝试下面的代码它清除我的所有会话容器.
$session_user = new Container('user');
$session_user->getManager()->getStorage()->clear();
Run Code Online (Sandbox Code Playgroud)
我想只清除一个名为'user'的容器,它有很多键(我不知道最后会有什么).有没有办法实现这一目标
我知道我可以在每个键上做offsetunset但这不是我觉得的最佳解决方案.
如果有任何替代方法可以清除特定的会话容器,请建议.
注意: -我没有使用任何第三方模块,如ZfcUser和Akrabat会话
在此先感谢您回复此帖子.
我正在尝试更改Zend_Auth的会话后端.但无法成功.在我的bootstrap.php;
$oBackend = new Zend_Cache_Backend_Libmemcached(
array(
'servers' => $servers,
'compression' => false
) );
// configure caching frontend strategy
$oFrontend = new Zend_Cache_Core(
array(
'caching' => true,
'automatic_serialization' => true
) );
// build a caching object
$cache = Zend_Cache::factory( $oFrontend, $oBackend );
$saveHandler = new \Application\Auth\Adapter\Memcached();
$saveHandler->setCacher($cache);
\Zend_Session::setSaveHandler($saveHandler);
Run Code Online (Sandbox Code Playgroud)
它成功地保存了值memcache没有问题.我测试一下;
$namespace = new Zend_Session_Namespace();
$namespace->name = "Fatih";
Run Code Online (Sandbox Code Playgroud)
在其他控制器;
$ns = new Zend_Session_Namespace();
var_dump($ns->name);
Run Code Online (Sandbox Code Playgroud)
没关系,但我在memcache中看不到Zend_Auth值.但是如果var_dump($_SESSION)
我能看到它就像;
["Zend_Auth"]=> array(1) { ["storage"]=> object(Application_Security_Auth_Storage)#66 (1) { ["_user":protected]=> object(Application_Security_Auth_User)#84 (4) { ["id":protected]=> object(MongoId)#87 (1) …
Run Code Online (Sandbox Code Playgroud) 我使用以下方法在临时会话中存储了几个值: $job = new Zend_Session_Namespace('application');
如何在不清除所有会话的情况下仅销毁会话应用程序.
Zend Framework 2中的Session组件的体系结构尚未记录,我在理解它的实际应用时遇到了一些麻烦(例如,与非常直观的Symfony Session相比).
重要部分的简短摘要:
Zend\Session\Storage\SessionStorage
映射并替换$_SESSION
超全局Zend\Session\SessionManager
是一个管理存储,会话cookie,会话配置,会话验证等的外观.Zend\Session\Container
是旧的Session_Namespace
,不同的容器共享一个Manager实例(通过静态字段)的替代品.没有代表名称空间(容器)集合的组件,因此无法使用'issetNamespaceX','unsetNamespaceX'等方法.没有人(包括Manager和Storage)知道容器,是否存在是什么,如果,有多少名称.
Matthew Weier O'Phinney解释了这种情况如下:
Container是一个特殊类,用于处理当前Storage实例的独立段.[...]如果有的话,存储适配器将包含容器,而不是管理器.但是,我们还希望允许更多基本的存储使用,这使得Container与存储正交,这解释了has-a关系的差异.
关于正确的依赖注入,我看到了这个解决方案的一些实际问题.显然,管理器可以被视为具有相当长寿命的服务,因此有资格进行构造函数注入.不幸的是,管理器没有关于容器的任何线索,这也迫使我注入容器(坏因为相当短暂并且需要插槽),编写我自己的附加功能以使存储或管理器容器感知(应该是框架)功能)或在我的消费类中创建容器(我想明显避免).
所以Zend解决方案对我来说似乎并不实用.如果我想使用Manager,FlashMessenger和一个额外的容器,我需要注入4(四个!)类.如果我对Symfony Session做同样的事情,我只需要注入1(一)个类.
此外,容器不符合注入条件,因为它们可能是短暂的运行时对象,在脚本执行期间可能存在或可能不存在.使用Symfony Session这不是问题,因为Session知道它的包(容器),ZF2这是一个问题,因为Manager不知道容器.
主要问题:我如何在实践中使用Zend\Session with Containers?
附加问题:是否有充分的理由不提供类似于ZF1的真实命名空间功能,或者类似于Symfony SessionBag
?
我想知道如何使用Zend Framework获取当前在线或在网站上进行活动会话的用户数量.
我尝试了通常的方式来读取会话保存路径,但它不能使用Zend.这里的任何人都可以建议我一个很好的方法来了解服务器上任何时刻有多少活动会话.
我已经设置了两个用户帐户模块 - 管理员和客户.我目前的设置意味着如果您登录管理员我的应用程序认为您也是以客户身份登录.我决定的解决方案是创建一个会话,其中cookie路径基于管理员URL,即设置cookie_path
为/administrator
.
在我的管理员Module.php
onBootstrap
功能中,我包括:
$sessionConfig = new SessionConfig();
$sessionConfig->setOptions(['cookie_path' => '/administrator']);
$sessionManager = new SessionManager($sessionConfig, null, null);
Container::setDefaultManager($sessionManager);
Run Code Online (Sandbox Code Playgroud)
它设置了cookie路径,但这会影响整个应用程序; 即网站的其余部分是无cookie的,因为网址不是以网页开头的/administrator
.
如何设置我的应用程序,cookie_path
以便我的管理员模块与应用程序的其余部分不同?
我所追求的是两个cookie - 一个用于管理路径,一个用于应用程序的其余部分.
我Zend\Authentication\AuthenticationService
用于ACL.我想要实现的是让用户登录网站的客户部分并执行操作,然后登录管理面板进行操作.
例如,Magento将在处理客户帐户登录时设置一个cookie,然后在处理管理员帐户登录时设置另一个cookie.
如何设置Zend\Authentication\AuthenticationService
基于url/module使用第二个会话或cookie?
嗨伙计们,我正在尝试使用Zend Sessions将会话存储在数据库中,但是因为某些原因,我的会话已经消失了.我不确定是否正在执行某些代码执行此操作或是否其他内容.
我注意到会话ID似乎在登录后的breif时间后重新生成.
即使在我的htaccess文件中添加了以下行,这甚至是:
php_value session.auto_start 0
Run Code Online (Sandbox Code Playgroud)
最终的结果是我登录时每分钟都会注销.
继承我的bootstrap文件中的代码
$config = array(
'name' => 'session',
'primary' => 'id',
'modifiedColumn' => 'modified',
'dataColumn' => 'data',
'lifetimeColumn' => 'lifetime'
);
$saveHandler = new Zend_Session_SaveHandler_DbTable($config);
Zend_Session::rememberMe($seconds = (60 * 60 * 24 * 30));
$saveHandler->setLifetime($seconds)->setOverrideLifetime(true);
Zend_Session::setSaveHandler($saveHandler);
//start your session!
Zend_Session::start();
Run Code Online (Sandbox Code Playgroud)
我没有使用任何其他会话相关的功能,除了登录时Zend_Auth.
Infact rememberme
调用Session类的regenerateID函数 - 最终结果是我现在每隔几分钟就会不断注销.
我通过zend auth创建了一个登录系统,这里是代码
// userAuthentication
public function authAction(){
$request = $this->getRequest();
$registry = Zend_Registry::getInstance();
$auth = Zend_Auth::getInstance();
$DB = $registry['DB'];
$authAdapter = new Zend_Auth_Adapter_DbTable($DB);
$authAdapter->setTableName('user')
->setIdentityColumn('user_name')
->setCredentialColumn('user_password');
$username = $request->getParam('username');
$password = $request->getParam('password');
$authAdapter->setIdentity($username);
$authAdapter->setCredential($password);
$result = $auth->authenticate($authAdapter);
if($result->isValid()){
$data = $authAdapter->getResultRowObject(null,'password');
$auth->getStorage()->write($data);
$this->_redirect('/login/controlpannel');
}else{
$this->_redirect('/login/login');
}
}
Run Code Online (Sandbox Code Playgroud)
这项工作现在很好.用户(表)中也有user_id(列),其中也有用户名和密码.我需要从这个表中获取特定的user_id,只需登录并将其放入会话中
$user_session = new Zend_Session_Namespace('user_session');
$user_session->username = $username;
$user_id->user_id = $user_id;
Run Code Online (Sandbox Code Playgroud)
这样我就可以查询这个$ user_id的一些信息,并将结果传递给view(name)controlpanel