我的团队正在与使用Solr作为搜索索引的第三方CMS合作.我注意到,似乎作者使用Solr作为各种类型的数据库,因为返回的每个文档都包含两个字段:
所以基本上它运行对Solr的搜索,下载对象的XML表示,然后从XML实例化对象,而不是使用id在数据库中查找它.
我的直觉告诉我这是一个不好的做法.Solr是一个搜索索引,而不是一个数据库......所以对我来说更有意义的是对Solr执行复杂的搜索,获取文档ID,然后将相应的行拉出数据库.
当前的实现是否完美无缺,或者是否有数据支持这种重构成熟的想法?
编辑:当我说"XML表示"时 - 我的意思是一个存储字段,其中包含所有对象属性的XML字符串,而不是多个存储字段.
给出以下查询:
(field:value1 OR field:value2 OR field:value3 OR ... OR field:value50)
Run Code Online (Sandbox Code Playgroud)
这可以分解为更简洁的东西吗?基本上我有数百个类别ID,我需要在大类别ID(一次20-50)下搜索项目.在MySQL中,我只是使用field IN(value1, value2, value3)而不是(field = value1 OR field = value2 etc...).
Solr/Lucene有更简单的方法吗?
我收到的错误很多,就像这个:
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) 我有一个在我的应用程序中的多个视图共享的子窗体.在一个视图中,此子窗体单独显示,底部有一个后退/继续按钮,引导用户进入下一个子窗体.在另一个视图中,子窗体显示在与其他子窗体相同的页面上(基本上是一个长格式).
由于子窗体的html在两个视图中都是100%相同,因此我将其分成部分并ng-include用于渲染它.在仅显示带有后退/继续按钮的子窗体的视图中,我在父HTML的内部渲染后退/继续按钮.
在视觉上,一切正常,我能够访问在表单(user.email, user.password, user.etc...)中输入的所有数据.
问题是我根据用户是否正确填写了表单来启用/禁用"继续"按钮,这在"仅子表单"变体中不起作用,因为父作用域似乎没有能够访问表单的状态.如果我将按钮粘贴在局部,它可以工作,但我不想这样做,因为按钮不属于每个使用此部分的实例.
在我的示例中请注意,红色边框内的提交按钮被禁用,直到在框中键入内容并且"表单无效?" 值更新,而蓝色边框内的按钮始终启用和"表格无效?" 价值是空白的.
如何myForm.$invalid从父作用域访问值?
我的开发人员和我在共享的MySQL开发数据库上有自己的开发模式.我的任务要求我在我的模式中创建触发器,但到目前为止我还没有成功.
CREATE TRIGGER myTrigger AFTER DELETE on myTable
FOR EACH ROW BEGIN
-- DO STUFF
END;
Run Code Online (Sandbox Code Playgroud)
MySQL说:错误1419(HY000):您没有启用SUPER权限并且启用了二进制日志记录(您可能希望使用安全性较低的log_bin_trust_function_creators变量)
我检查了MySQL手册(http://dev.mysql.com/doc/refman/5.1/en/privileges-provided.html):
TRIGGER权限使您可以创建和删除触发器.您必须拥有此表的权限才能为该表创建或删除触发器.MySQL 5.1.6中添加了此权限.(在MySQL 5.1.6之前,触发操作需要SUPER权限.)
我们正在运行"5.1.32-enterprise-gpl-advanced-log",因此TRIGGER权限应该足够; 但是,DBA授予我TRIGGER特权mySchema.*我可以在我做SHOW GRANTS时看到它;但是我仍然得到关于需要"SUPER"特权的这个错误.我们不想让所有的开发者都超赞.
有什么建议?
我们都没有成为专家(我们大多数人还没有).当然,我们都知道如何用我们喜欢的语言编写程序,但编写高质量的应用程序和编写语法正确的程序是两回事.我们工作,学习,努力,不断学习,最终达到其他人可以向我们学习的门槛.
如果你的学习过程与我的学习过程类似,你可能会写一些功能齐全,可靠的应用程序,这些应用程序仍然每天都在使用,但每当你想到它们时,都会感到羞愧.程序代码?混合业务和表示逻辑?SQL注入漏洞?代码荒芜荒芜的任何评论?名单还在继续.
不幸的是,我们都不能指望我们的雇主允许我们回去重写我们的旧应用程序,因为只要我们想到它们就会给我们做噩梦.更糟的是,我们中的一些实际工作,用我们旧的应用程序,但要知道,这将是太危险的和/或费时做了一大堆的好尽可能重构去.
你如何应对过去曾经犯下的编程暴行,以及那些发现肮脏秘密的人,你并不总是知道自己在做什么?
我正在开发一个功能分支,并对我的功能分支进行了一些更改,这些更改将影响其他开发人员.我想将这些新的更改提交到主干,这样就没有人会争先恐后地解决这个问题.但是,我不想提交功能分支的其余部分,因为它尚未完全正常运行.
我在r109分叉了行李箱.我的分支已经对r145中的主干进行了所有更改.我在r152和r153中将我的"将影响其他开发者"更改为我的分支.
我在这里的思考过程是将我的工作副本切换到主干然后执行:
svn merge svn:// project/branch/myBranch -r 146:153 ./project
SVN抱怨冲突,因为trunk包含我更改的其中一个文件的原始版本,而我只是合并了最新的更改(我在早期提交到我的分支时对该文件做了一些更改),并且它也抱怨关于与另一个开发人员在r149中更改的文件的冲突.由于我的分支在我提交之前只包含从主干到r145的合并,因此我的分支并未反映出这种变化.
这没关系 - 冲突很容易解决,但我担心的是,从现在开始,当我想将完整的分支重新整合到主干中时,我将遇到麻烦.
或者,我可以对主干进行必要的更改,然后将它们合并到我的分支中,但我不喜欢这种方法,因为更改已在分支中完成.做两次没有意义.
有没有人有部分合并功能分支到主干然后完全重新集成的经验?什么是最好的策略?
我习惯CTRL+ TAB/ SHIFT+ CTRL+ TAB分别转换到下一个和以前的标签,在它们出现在标签栏上的顺序.NetBeans采用MRU样式,其中CTRL+ TAB将带您进入您编辑的最后一个文件.
这经常打破我的流程,因为我需要保持标签并检查我是否在正确的文件中继续而不是本能地点击CTRL+ TAB+ TAB+,TAB因为我知道我要去的文件是标签栏上的3个标签.
默认的CTRL+ PAGEUP/ CTRL+键PAGEDOWN映射的行为与我想要CTRL+ TAB和SHIFT+ CTRL+的行为完全相同TAB,但将映射更改为CTRL+ TAB似乎没有区别 - 它忽略了我的键映射并继续使用MRU.
我该如何改变这种行为?
毫无疑问,我们应该编写应用程序来保护自己免受恶意,好奇和/或粗心的用户的攻击,但是当前和/或未来的同事呢?
例如,我正在编写一个基于Web的API,它接受来自用户的参数.其中一些参数可能映射到配置文件中的值.如果用户使用URL混乱并为参数提供了无效值,则在尝试从配置文件的不存在的部分读取时,我的应用程序将会出错.当然,我在尝试从配置文件中读取之前擦除了params.
现在,如果另外一个开发人员在这个应用程序上运行,那么为此参数添加另一个有效值,该值将通过清理过程,但不会将相应的部分添加到配置文件中.请记住,我只是保护应用程序免受不良用户的攻击,而不是糟糕的程序员.我的申请会失败.
一方面,我知道所有的更改都应该在转向生产之前进行测试,这样的事情无疑会出现在一个不错的测试环节中,但另一方面,我尝试构建我的应用程序以尽可能地抵御失败.我只是不知道在潜在的失败列表中包含同事修改我的代码是否"正确".
对于这个项目,我选择不检查配置文件的相关部分是否存在.作为当前的开发人员,我不允许用户指定会导致失败的参数值,因此我希望未来的开发人员不会将行为引入可能导致失败的生产环境......或者至少消除这样的问题测试期间的情况.
你怎么看?
懒惰......还是哲学上的声音?
我们的项目是一个内容管理系统,支持我们的几十个网站.开发小组从一个小地方开始,我们处理了一个相当标准的编码/部署策略.
我们编码了行李箱并坚持干净的行李箱.每隔几天我们就会标记trunk并部署到测试服务器.如果一切顺利,我们将部署到生产并继续前进.
这种情况很有效,直到团队成长.我们经常遇到这样的情况:标记的修订版在进入生产之前需要修复问题.虽然负责的开发人员正在处理这些修复,但我们让其他开发人员对trunk进行了更改.一旦原始开发人员的修复完成,添加的新提交将不得不继续进行,进一步延迟构建,因为现在需要进行额外的验证.
为了纠正这个问题,我们创建了一个严格用于发布的独立主干.人们将在主干中工作,然后要求项目经理或开发负责人将他们的更改合并到发布主干中.
这工作了一段时间,直到球队变得更大,更不相交.我们有3-5人的团队在4个地理位置工作 - 一些在相同的组件上,另一些在不同的组件上,具有不同的优先级和发布时间表.这几乎是一份全职工作,并成为管理构建的人的噩梦.
为了解决这个问题,我们开始根据最新的Production标签创建"发布分支".人们只会致力于那些准备好测试并进入生产的东西.其他人会致力于干线,直到他们轮到合并.这需要将构建管理器和拥有代码的人之间的冲突合并和解决.
这工作了大约一个星期,直到我们开始做几个"高优先级紧急"发布.这实际上意味着我们会:
这是每一天.有时一天两次.
我试图将这一点与一个开源项目联系起来,那里有开发人员,他们甚至都不认识对方,他们似乎仍然相处......但是当新的稳定,经过测试时,这种比较会分崩离析对于每周(或每天)几次"公共"消费,预计有生产价值的产品.例如,如果Firefox的日常构建是一个混乱的错误,至少用户可以返回到以前的版本或使用最新的稳定版本.对于我们的用户来说情况并非如此.如果我们的发布不完美,他们就无法工作.
背景故事完成后,我现在提出一个问题:
鉴于一个......
...您可以推荐哪些建议或替代工作流程来促进一个更大的负担不在一个人身上的更健全的流程?
我正在开发一个Web应用程序,用户上传文件列表,然后立即将其发送到远程服务器.我有一个需要rsynced的所有本地文件的列表,但它们将与其他我不想每次运行的文件混合在一起.我知道rsync只会发送更改的文件,但是这个目录结构和内容会随着时间的推移而变得非常大,并且延迟是不可接受的.
我知道做远程rsync,我可以指定一个远程文件列表,即..
rsync"host:/ path/to/file1/path/to/file2/path/to/file3"
...但是,一旦我删除"host:"并尝试在本地指定文件,这不起作用.
我也知道我可以使用--files-from,但这需要我提前创建一个文件列表,我想要rsync(然后删除它).我认为只是有效地说"将这4个特定文件rsync到这个远程服务器"会更清晰,但我似乎无法让它工作.
有什么方法可以做我想要完成的事情,还是我不得不求助于创建一个包含列表的tmp文件?
谢谢!
在MySQL的5.7文档状态:
该
filtered列指示将由表条件过滤的表行的估计百分比。也就是说,rows显示估计的检查行数并rows × filtered / 100显示将与先前表连接的行数。
为了更好地理解这一点,我在使用MySQL Sakila 示例数据库的查询中进行了尝试。有问题的表具有以下结构:
mysql> SHOW CREATE TABLE film \G
*************************** 1. row ***************************
Table: film
Create Table: CREATE TABLE `film` (
`film_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(255) NOT NULL,
`description` text,
`release_year` year(4) DEFAULT NULL,
`language_id` tinyint(3) unsigned NOT NULL,
`original_language_id` tinyint(3) unsigned DEFAULT NULL,
`rental_duration` tinyint(3) unsigned NOT NULL DEFAULT '3',
`rental_rate` decimal(4,2) NOT NULL DEFAULT '4.99',
`length` smallint(5) unsigned DEFAULT …Run Code Online (Sandbox Code Playgroud) 到目前为止,我一直在测试我的ZF2控制器如下:
namespace Application\Controller;
use Application\Controller\IndexController;
use Zend\Http\Request;
use Zend\Http\Response;
use Zend\Mvc\MvcEvent;
use Zend\Mvc\Router\RouteMatch;
use PHPUnit_Framework_TestCase;
class IndexControllerTest extends PHPUnit_Framework_TestCase
{
public function testIndexActionCanBeAccessed()
{
$this->routeMatch->setParam('action', 'index');
$result = $this->controller->dispatch($this->request);
$response = $this->controller->getResponse();
$this->assertEquals(200, $response->getStatusCode());
$this->assertInstanceOf('Zend\View\Model\ViewModel', $result);
}
protected function setUp()
{
\Zend\Mvc\Application::init(include 'config/application.config.php');
$this->controller = new IndexController();
$this->request = new Request();
$this->routeMatch = new RouteMatch(array('controller' => 'index'));
$this->event = new MvcEvent();
$this->event->setRouteMatch($this->routeMatch);
$this->controller->setEvent($this->event);
}
protected $controller = null;
protected $event = null;
protected $request = null;
protected $response = null; …Run Code Online (Sandbox Code Playgroud)