我想我可能发现了 PHP 中的一个错误crypt()
Windows 下的功能。
However: 我承认这可能是我的错。 PHP 有数百万人使用,有数千人在使用 PHP;我的代码被数十人使用并由我处理。 (这个说法最好编码恐怖中的解释 http://www.codinghorror.com/blog/2008/03/the-first-rule-of-programming-its-always-your-fault.html.)
所以我请求帮助:让我看看我的错。我这几天一直在努力寻找它,但没有成功。
设置
我使用的是带有 Apache 2.2.14 (Win32) 和 PHP 5.3.2 的 Windows 服务器安装。我的开发盒运行Windows XP Professional; “生产”服务器(这是一个 Intranet 设置)运行 Windows Storage Server 2003。两者都会出现问题。
我没有看到任何内容php.ini
相关crypt()
,但会很乐意回答有关我的配置的问题。
问题
我的 PHP 应用程序中的几个脚本偶尔会挂起:页面位于“等待本地主机”状态,并且永远不会完成。每个脚本都使用crypt
在将用户密码存储到数据库之前对其进行哈希处理,或者,对于登录页面,在将输入的密码与数据库中存储的版本进行比较之前对其进行哈希处理。
由于登录页面是最简单的,所以我重点测试一下。我反复登录,发现大概十次就有四次挂掉。
作为实验,我将登录页面更改为使用纯文本密码,并将数据库中的密码更改为纯文本版本。页面停止挂起。
我看到 PHP 的最新版本列出了这个错误修复:
修复了错误#51059(当
给出了无效的盐[原文如此])。
所以我创建了一个非常简单的测试脚本,如下所示,使用中给出的相同盐一个官方的例子 http://php.net/manual/en/function.crypt.php:
$foo = crypt('rasmuslerdorf','r1');
echo $foo;
如果我疯狂地重新加载,这个页面也会挂起。我只是see它挂在Chrome中,但无论什么浏览器,在Apache上的效果都是一样的。
对阿帕奇的影响
当这些页面挂起时,Apache 的服务器状态页面 http://httpd.apache.org/docs/2.0/mod/mod_status.html(我解释过here https://serverfault.com/questions/95620/local-apache-on-windows-xp-not-finishing-page-requests/102080#102080,关于不同的问题)增加正在处理的请求数量并减少空闲工作人员的数量。正在处理的请求几乎都有“正在发送回复”的状态,尽管有时它们会暂时显示“正在读取请求”或“保持活动(已读)”。
最终,阿帕奇可能会崩溃。当发生这种情况时,Windows 崩溃报告如下所示:
szAppName: httpd.exe
szAppVer: 2.2.14.0
szModName: php5ts.dll
szModVer: 5.3.1.0 // OK, this report was before I upgraded to PHP 5.3.2,
// but that didn't fix it
offset: 00a2615
是我的错吗?
我很想就此向 PHP 提交一份错误报告。如上所述,反对它的论点是错误几乎总是我的错。
然而,我支持“这是 PHP 的错”的观点是:
- 我使用的是 Windows,而大多数服务器使用 Linux(我无法选择这个),因此我发现边缘情况的可能性更大
- 最近有一个错误
crypt()
,所以也许仍然有问题
- 我已经做了我能做的最简单的测试用例,但仍然有问题
任何人都可以复制这个吗?你能建议我哪里出错了吗?我到底应该提交错误吗?
预先感谢您提供的任何帮助。