我想我可能在
Windows的
PHP的crypt()函数中发现了一个错误.
但是,我认识到这可能是我的错. PHP被数以百万计使用,成千上万的工作;我的代码被我使用了几十个. (这个说法最好是explained on Coding Horror)
所以我要求帮助:告诉我我的错我一直在试图找到它几天,没有运气.
设置
我正在使用Windows 2.2.14(Win32)和PHP 5.3.2的Windows服务器安装.我的开发框运行Windows XP Professional; “生产”服务器(这是一个内部网设置)运行Windows Storage Server 2003.这两个问题都发生.
我没有看到任何与PHP.ini相关的crypt(),但会很高兴地回答有关我的配置的问题.
问题
我的程序中的几个脚本偶尔挂起:页面坐在那里等待本地主机,从不完成.这些脚本中的每一个使用crypt将用户的密码哈希,然后将其存储在数据库中,或者在登录页面的情况下,将输入的密码进行哈希,然后将其与存储在数据库中的版本进行比较.
由于登录页面最简单,所以我专注于测试.我反复登录,发现它可能会挂起10次.
作为实验,我更改登录页面以使用纯文本密码,并将数据库中的密码更改为纯文本版本.页面停止挂起.
我看到PHP的最新版本列出了这个bug修复:
Fixed bug #51059 (crypt crashes when
invalid salt are [sic] given).
所以我创建了一个非常简单的测试脚本,如下,使用与an official example中给出的相同的盐:
$foo = crypt('rasmuslerdorf','r1');
echo $foo;
这个页面也会挂起来,如果我重新加载它像疯了.我只看到它挂在Chrome上,但无论浏览器如何,对Apache的影响是一样的.
对Apache的影响
当这些页面挂起时,Apache的server-status page(我解释了here,有关不同的问题)增加了正在处理的请求数量,并减少了空闲工作人员的数量.正在处理的请求几乎都有“发送回复”的状态,虽然有时候他们会显示“阅读请求”或“保持活动(读取)”.
最终,Apache可能会崩溃.如果是这样,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()的bug,所以也许还有问题
>我做了最简单的测试用例,我还有问题
有人可以复制吗你能建议我出错了吗?我应该提交bug?
提前感谢您提供的任何帮助.
在这个问题上,错误51059(仅关于传递无效输入)或50947(不同的代码,5.3具有在PHP中实现的所有平台上的新算法和功能)与此不相关.
不过http://bugs.php.net/bug.php?id=51424是.我已经在那里贴了一些部分补丁,但是它解决了大部分可能的锁,但这确实是不够的.在下一个5.3版本中将会有一个完整的修复.
顺便说一下,它不是Windows特定的,而是关于线程SAPI(例如,Windows apache 2.2).