很长一段时间以来,我们的托管服务器遇到了一个非常奇怪的问题。 PHP中的一段时间(似乎是随机的)变量变为NULL。
总的来说一切都很好,但偶尔会发生。服务器上的所有帐户都受到影响,所有PHP应用程序(包括PHPMyAdmin,Wordpress都是我们自己的脚本)。我们联系了我们的托管公司,但他们找不到任何解决方案。
我的想法很少,最有希望的是与Suhosin的问题。但我没有在日志中直接收到任何消息。
我们制作了一个最简单的脚本来重现错误:
<?php
class Example
{
protected $stringVar = 'this is a string value';
public function accessParameter()
{
$error = false;
if (isset($this->stringVar) && !is_null($this->stringVar)) {
echo "string var : " . $this->toStringWithType($this->stringVar) . "\n";
} else {
echo "string var is not set\n";
$error = true;
}
if ($error) {
$logfile = dirname(__FILE__)."/random_bug_log.log";
file_put_contents($logfile, date('Y-m-d H:i:s')."\n", FILE_APPEND);
file_put_contents($logfile, $this->toStringWithType($this->stringVar) . "\n", FILE_APPEND);
}
}
public function toStringWithType($var)
{
$type = gettype($var);
return "($type) '$var'";
}
}
$e = new Example();
$e->accessParameter();
正常输出:
string var : (string) 'this is a string value'
奇怪的事情发生时的输出:
string var is not set
我愿意接受任何想法或建议如何解决这个问题。我想最终的解决方案是改变托管公司。我没有设法在localhost或任何其他服务器上创建此问题。
已制作的测试件,包括您的建议:
<?php
class Example
{
protected $stringVar = 'this is a string value';
public function accessParameter() {
$error = false;
if(isset($this->stringVar) && !is_null($this->stringVar)) {
echo "string var : "
.$this->toStringWithType($this->stringVar)
."\n";
} else {
echo "string var is not set\n";
$error = true;
}
if($error) {
$logfile = dirname(__FILE__)."/random_bug_log.log";
file_put_contents($logfile, date('Y-m-d H:i:s')." ", FILE_APPEND);
file_put_contents($logfile,
$this->toStringWithType($this->stringVar) . "\n",
FILE_APPEND);
}
}
public function writeParameter() {
$this->stringVar="variable assigned";
if(isset($this->stringVar) && !is_null($this->stringVar)) {
echo "string var : "
.$this->toStringWithType($this->stringVar)
."\n";
} else {
echo "string var is not set\n";
$error = true;
}
}
public function toStringWithType($var)
{
$type = gettype($var);
return "($type) '$var'";
}
}
$e = new Example();
$e->accessParameter();
$e->writeParameter();
事情发生时的输出:
string var is not set
string var is not set
答案 0 :(得分:0)
这是一个非常奇怪的问题。
它可能不是一个解决方案,但值得尝试;
protected $stringVar;
function __construct() {
$this->stringVar = 'this is a string value';
}
答案 1 :(得分:0)
我建议使用!==而不是is_null来查看变量是否实际为空。
if (isset($this->stringVar) && ($this->stringVar !== null)) {
或
if (isset($this->stringVar) && (!empty($this->stringVar)) {
也应该做的工作。
答案 2 :(得分:0)
如果这些问题出现问题,请检查条件中的值,并在其他情况下执行您想要的操作。喜欢在你的情况下喜欢:
if(isset($this->stringVar) && ($this->stringVar == "this is a string value")) {
}else{
// your code here...
}