我的应用程序收到错误的$ _GET变量并不存在于具有4个CPU内核的Windows 2008 R2上。
所以我创建了这个简单的代码来测试。
<?php
if(!isset($_GET)){
error_log("_GET is not set");
echo "ERROR";
}else{
echo "OK";
}
并创建了一个简单的JMeter测试,用15个线程调用它,大约2500 rps。
当我在一个单核CPU中运行它时,它适用于数百万个没有错误的请求,但是当在具有4个CPU的服务器中运行时,在大约10,000个请求之后,$ _GET变量不再被设置。
我还用$ _POST,$ _SERVER,$ _COOKIE和$ _SESSION重复测试。结果是一样的。
当将PHP降级到5.6版时,它可以正常工作(使用4个CPU)。
将Apache CPU亲和性设置为单个CPU时,它也可以正常工作。
我正在跑步: Apache / 2.4.18(Win64),PHP / 7.0.8。 在具有4个CPU和4GB RAM,SSD的Windows 2008 R2的VM中,托管在Vultr.com。
这是PHP 7的已知问题吗?
答案 0 :(得分:1)
您使用的是什么版本的PHP?
来自PHP.net Windows download page:
的Apache
请使用Apache Lounge提供的Apache版本。它们为x86和x64提供了Apache的VC9,&gt; VC11和VC14版本。我们使用他们的二进制文件来构建Apache SAPI。
如果您使用PHP作为apache.org上的Apache构建模块(不是&gt;推荐),则需要使用使用&gt;旧版Visual Studio 6编译器编译的旧VC6版本的PHP。不要将VC9 +版本的PHP与&gt; apache.org二进制文件一起使用。
使用Apache,您必须使用PHP的线程安全(TS)版本。