我想我在这里丢失了我的弹珠......我的网站上有一个问题,它随机停止接受登录.我现在能够将它跟踪到crypt()表现得非常奇怪.
在我的数据库中,我已经获得了用户密码的加密版本 - 所以让我们说Og12345678.
当用户登录时,他们输入他们的密码,我从数据库中读取盐然后加密他们输入的内容并进行比较 - 通常这种方法非常有效.
所以我正在做crypt($ enteredPassword,$ saltFromDb) - 在这种情况下,盐当然是Og.通常对于给定用户,密码crypt工作正常.
当出现问题时(并且当他们重新启动Apache时,他们这样做是永久性的更改)我发现crypt开始为相同的输入使用相同的盐返回一个不同的答案.
然而,它是一致的,即一旦系统出错,crypt将返回错误的答案,但它始终返回相同的错误答案.重复刷新页面显示相同的输出.同样的盐在新的不正确的隐藏结果中也是明显的,所以并不是盐在某处丢失了.
如果我然后重新启动Apache并重新运行脚本而没有任何更改,那么来自crypt的结果将返回到应该如何.
我很欣赏它不是最新的PHP(5.2.8),但会重视任何观点,包括它是否是在更高版本中修复的已知错误(升级PHP并不是一个快乐的任务,其中许多网站仍然使用不幸的怪癖,每次升级都需要重新测试 - 如果它是一个已知的固定bug,那么很明显我会尽快升级它,除此之外,将外部资源外包可能更容易,因为我只在一个地方使用它我网站的常见地方.
任何输入赞赏.
马特佩德莱斯登
---更新:2011年3月11日
以前给出的关于操作系统的评论的更正... - 操作系统是Windows Server 2008 SP1 64位.道歉我应该仔细检查,而不是假设我记得!该机是戴尔2950 8gb Ram,Xeon处理器.
我开始考虑Krtek所建议的 - 当系统变得不稳定时,如果我生成新的crypt()(即一个非常简单的例子,我将变量设置为字符串,加密它然后与地穴进行比较) - 一切都很棒.当我重新启动服务器时,它再次回到之前的计算中.所以我肯定倾向于改变用于计算crypt()结果的算法 ...对可能导致这种情况发生的原因的任何想法?我打印出CRYPT_STD_DES等的值,它们在重新启动之间不会改变.
任何人都有可能导致这种情况发生的线索?
无论它在昨天的某一天似乎发生了两次,最奇怪的是.
谢谢你到目前为止的答案.
---更新:2011年3月16日
只是想提供另一个更新.
这仍然在发生,仍然没有进一步了解原因.
如果将来有人遇到这种情况,我认为我的解决方案将是做一些讨厌的黑客将所有crypt()执行推送到外部C#应用程序并且不再依赖PHP来执行它们.某处出现问题,此时我能看到的唯一解决办法是将其从等式中完全删除.
当然,如果它仍然发生,那也将是有趣的!:)
谢谢大家.
原始问题
我们的应用程序使用CSocket,它需要消息泵运行才能运行.目前,更改为另一个套接字实现是不切实际的,尽管这是我们希望在某个时候结束的地方.
该应用程序使用Visual C++(非托管).
我们目前通过使用C#.NET服务启动程序启动C++ DLL,该启动程序使用Application.Run启动线程以使消息泵运行,然后使用DllImport启动DLL中的start方法.
这有很多问题,其中最紧迫的是如果DLL由于任何原因崩溃我们没有得到转储文件!
由于这一结果,我们切换到C++服务启动,虽然我们很好用它的服务方面我们是如何得到的消息泵会有点难倒.
我在这里浏览了谷歌和一些问题,但我的问题的一部分是缺乏基本的C++知识,所以如果这是一个愚蠢的问题,如果有人可以指出我正确的方向,将非常感谢道歉.
非常感谢Matt Peddlesden先生
更多信息
我们正在尝试替换的当前C#服务基本上是这样的:
public void PumpThread()
{
DLLStart();
Application.Run();
}
protected override void OnStart(string[] args)
{
try
{
Thread pumpThread = new Thread(new ThreadStart(PumpThread));
pumpThread.IsBackground = true;
pumpThread.Start();
}
catch (DllNotFoundException dnfe)
{
}
catch (Exception e)
{
}
}
protected override void OnStop()
{
try
{
DLLStop();
}
catch (DllNotFoundException dnfe)
{
}
catch (Exception e)
{
}
}
Run Code Online (Sandbox Code Playgroud)
从本质上讲,我们只是简单地努力,使我们的代码是不可控制的世界完全运行,而不是5行的托管代码混淆不必要这与C来代替上述C#.NET Windows服务++等价的.
DLLStart()和DLLStop()是从我们实际启动和停止系统的C + Unmanaged DLL导入的两个函数.
我不完全确定这需要什么样的Visual C++项目,以便能够对泵做任何事情,说实话. …
更新25/03/2011 我已经将这个问题标记为已回答,而我还没有具体的答案来帮助改进系统我认为在我走得那么远之前推迟是不公平的.这个问题很广泛,答案给了我许多指导,帮助我顺利完成.当我有更具体的问题要问我会回来的时候.不幸的是,我只能用勾号标记一个答案,但我要感谢大家的意见,这一切都很有价值,谢谢你的时间.
原始问题
提前道歉,因为这个问题可能会非常广泛!
我真正准备介入一个项目,其中一个其他开发人员已经组建了一个基于SQL Server 2008企业版,Reporting Services和存储过程的大型系统.我们在VM系统上进行性能测试时发现的(即,在VMWare1 ESXi托管的Windows Server 2008 R2系统上运行SQL Server),它似乎没有利用额外的内存或内核.
当我进入这个项目时,我正在寻找关于一些初步大纲问题的一些指导:
此外,我想下一个显而易见的一点是 - 我需要在代码中注意哪些事情可以为其他人提供更深入的了解如何构建它并允许我提供更具体的示例?系统中有很多代码行,但显然理想的是尝试查找演示用法的精简示例或模式.
我相信,存储过程是由Reporting Services调用的.
在我们的测试中,它似乎是线性执行 - 即如果我们配置具有2个内核,2ghz CPU分配和4GB内存的VM,如果1个报告在2分钟内同时运行,则2将花费将近4分钟(即两倍的时间)对于这两个报告而言,它不是那么线性但足够接近 - 一切都变慢了,几乎就好像它们并没有真正并行运行.
可能是SQL Server Reporting Services只是一次只运行一个报告或与之相关的东西吗?
存储过程都是在Transact-SQL中开发的.
再次,为广泛的问题道歉.如果有人在那里可以帮助教育我如何在这个领域获得更深入和更多的知识,那么这将是非常感激的!
马特.