我正在使用Zend_Db在事务中插入一些数据.我的函数启动一个事务,然后调用另一个也尝试启动事务的方法,当然也失败了(我正在使用MySQL5).所以,问题是 - 我如何检测到该交易已经开始?以下是代码示例:
try {
Zend_Registry::get('database')->beginTransaction();
$totals = self::calculateTotals($Cart);
$PaymentInstrument = new PaymentInstrument;
$PaymentInstrument->create();
$PaymentInstrument->validate();
$PaymentInstrument->save();
Zend_Registry::get('database')->commit();
return true;
} catch(Zend_Exception $e) {
Bootstrap::$Log->err($e->getMessage());
Zend_Registry::get('database')->rollBack();
return false;
}
Run Code Online (Sandbox Code Playgroud)
在PaymentInstrument :: create中,还有另一个beginTransaction语句,它产生一个异常,说明该事务已经启动.
我收到的错误很多,就像这个:
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) 有一个opcache.optimization_level php.ini指令.它是默认的位掩码0xffffffff- 因此默认情况下OPcache会执行所有优化.
OPcache做了哪些优化?传递字节码的是什么?
后续问题:OPcache可以很好地优化代码模式吗?例如,HHVM可以跳过仅包含类/函数声明的文件的执行,它只填充类/函数表.
假设我创建了一个这样的文本元素:
$firstName = new Zend_Form_Element_Text('firstName');
$firstName->setRequired(true);
Run Code Online (Sandbox Code Playgroud)
什么是更改默认错误消息的最佳方法:
值为空,但需要非空值
自定义消息?我读到了替换消息的地方,只需使用addValidator(...,而不是setRequired),如下所示:
$firstName = new Zend_Form_Element_Text('firstName');
$firstName->addValidator('NotEmpty', false, array('messages'=>'Cannot be empty'));
Run Code Online (Sandbox Code Playgroud)
但在我的测试中,这不起作用 - 它根本不验证 - 它将传递一个空文本字段.同时使用两者(addValidator('NotEmp .. + setRequired(true))也不起作用 - 它会双重验证,给出两条错误消息.
有任何想法吗?
谢谢!
有人可能会提供一些技巧和/或示例控制器插件和动作助手是如何不同的?是否存在可以用一个而不是另一个完成特定任务的情况?对我来说,他们看起来或多或少都是一样的,我经常无法决定何时使用什么......有什么大不同之处吗?
在项目规模,学说与zend-db-table速度和性能方面,何时应该在Zend项目中使用doctrine,以及什么时候使用zend-db-table?
我正在使用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)阵列
我目前正在将Web应用程序从基于数据库的国际化方法(每个单词在翻译表中有一个条目,以及实际翻译)迁移到基于Zend_Translate和CSV文件的方法.
我需要提供一种最终用户友好的方式来快速轻松地更新这些翻译.理想情况下,为了最大限度地降低破坏内容的风险,用户不会直接编辑CSV文件,而是显示带有字段的漂亮表单.
您是否知道一个独立的,基于PHP的,最终用户兼容的转换前端,它支持其中一个适配器Zend_Translate必须提供 - 理想情况下是gettext或csv?
像Python的/ Django的Rosetta, 但在PHP?Rosetta正是我所需要的:

但出于服务器设置原因,我非常希望继续使用PHP.
SimplePO看起来正朝着正确的方向发展,但过于简单 - 它似乎无法处理多种语言和目录以及复数形式.
我正在学习ZF2.0测试版.在ZF1中,我们可以在控制器中动态更改布局:
Zend_Layout::getMvcInstance()->setLayout('layoutname');
Run Code Online (Sandbox Code Playgroud)
但是在ZF2.0中, Zend\Layout类没有方法getMvcInstance().我认为它可以使用依赖注入但不确定.
我必须将应用程序从Zend Framework 1.12.0迁移到版本2.似乎还没有迁移指南.我已经研究过ZF2编码约定,并且我采用了依赖注入(Zend\Di)和PHP 5.3命名空间.我的目标是将我的ZF1应用程序重构为ZF2模块.
问题:是否可以在每个步骤之后逐步执行至少部分工作的应用程序并避免大量重构步骤?如果是,步骤是什么?
这是我对这种逐步迁移的想法,但我不知道在每一步之后我是否最终得到了一个有效的应用程序:
但是,只有当某些ZF2组件与ZF1组件一起工作时,我才会在每个步骤后都有一个workin应用程序.我不知道是否可以使用ZF1控制器来使用ZF1视图(和查看助手).
zend-framework ×10
php ×9
zend-session ×2
doctrine ×1
gettext ×1
migration ×1
mysql ×1
opcache ×1
pdo ×1
performance ×1
phpunit ×1
transactions ×1
translation ×1
zend-auth ×1
zend-form ×1