我们随机得到一些非常奇怪的错误日志.即使使用相同的参数/动作/等,它们也不会发生在每个页面上,并且它们似乎不可重复,每个页面的崩溃位置和上下文都不同.但几乎所有都有错误的__PHP_Incomplete_Class_Name作为原因.
一个这样的错误是:
main():脚本尝试执行方法或访问不完整对象的属性.请确保在调用unserialize()之前加载了您正在尝试操作的对象的类定义"LoginLogging",或者提供__autoload()函数来加载类定义
问题是,没有"LoginLogging"类.当它被保存到会话中时,它所引用的对象是ScormElement类型.转储变量给出:
__PHP_Incomplete_Class::__set_state(array(
'__PHP_Incomplete_Class_Name' => 'LoginLogging',
'intUserId' => '64576',
'__intUserId' => '64576',
'intScormId' => '665',
'__intScormId' => '665',
'intScoId' => '9255',
'__intScoId' => '9255',
'strElement' => 'cmi.core.lesson_location',
'__strElement' => 'cmi.core.lesson_location',
'strValue' => '1',
'dttTimeModified' => QDateTime::__set_state(array(
'blnDateNull' => false,
'blnTimeNull' => false,
'strSerializedData' => '2011-08-31T08:05:22-0600',
'date' => '2011-08-31 08:05:22',
'timezone_type' => 1,
'timezone' => '-06:00',
)),
'__strVirtualAttributeArray' => array (),
'__blnRestored' => true,
'objUser' => NULL,
'objScorm' => NULL,
)
Run Code Online (Sandbox Code Playgroud)
正确保留所有属性,并匹配ScormElement的类定义.但是班级名称是错误的.这里是没有名为LoginLogging类.
造成这种情况的原因是什么?我们如何修复它?
编辑:这只是一个例子.其他错误在结构上非常相似,但会影响其他类类型,并且具有不同的不完整名称.但是,所有不完整的名称都具有正确类名的相同字符串 …
所以这是我的测试设置:
session_start();
if(!isset($_SESSION['bahhhh']))
$_SESSION['bahhhh'] = 0;
$_SESSION['bahhhh']++;
sleep(5);
die('a'.$_SESSION['bahhhh']);Run Code Online (Sandbox Code Playgroud)
我期望发生的是每次我点击页面时,它返回一个不同的数字.
但是如果我使用多个标签,并在第一个标签的5秒内刷新它们,它们都返回相同的数字.(这不是客户端缓存,因为5秒的延迟仍然很明显.)
为什么这样做,我该如何解决这个问题?
它似乎与文件和数据库数据有着同样奇怪的缓存问题,并且阻止我构建一个工作的互斥锁以防止一次多次运行相同的代码.
这是另一个更简单的例子:
echo microtime();
sleep(10);Run Code Online (Sandbox Code Playgroud)
运行3次,每次间隔2秒,所有三次返回相同的微秒.WTF?