现在,此错误是间歇性的,易于重现。是的,我的意思是它很容易重现。问题是没有模式。在重置opcache之前,它引发错误的ID是一致的。
编辑:进一步研究指向op-cache。禁用op-cache可以解决问题。提高RAM,op-cache只能使用延迟脚本故障。我已经使用OpCacheGUI来监控op-cache几天了,我很少看到它使用超过20MB。这是一个内部程序,不需要速度,所以我只是要禁用它。
设定:
错误:
[UNK] [2014-07-11 14:34:31-0400]致命错误(1):无法在/var/www/html/.../classes/script中调用私有sql_class :: __ construct() .class.php(8)
URI:/.../js/getMessages.php?script=152
#0 default_error_handler()在[/ var / www / html /.../ libconfig.php:122]中调用 #1 shutdown()调用atUnknown
getMessages.php:
<?php
define('NO_FORM_KEY',1);
require_once '../libconfig.php';
PackageManager::requireClassOnce('io.cachefile');
header('Content-Type: application/json');
$etag=md5(implode(',',$_GET));
$cache=new CacheFile(CACHE.'/getMessages'.$_GET['script'].'.json',300,$etag);
if(!$cache->hasExpired()){
$cache->readToOutput();
exit;
}
$model=new mix_message(); // This class also extends sql_class
$script=new mix_script();
$script->load($_GET['script']);
$path='/mixer/message/'.mix_message::getBaseMessagePath($script);
$model->trackChanges(false);
$model->setScriptId($_GET['script']);
$model->find();
ob_start();
while($model->loadNext()){
echo json_encode($path.$model->getId().'.mp3').',';
}
$cache->putContents('['.substr(ob_get_clean(),0,-1).']');
$cache->readToOutput();
mix_script
构造函数:
5 class mix_script extends sql_class{
7 public function __construct(){
8 parent::__construct('scripts',
9 array(
10 'script_id',
11 'script_name',
12 'script_text',
...
20 'lgroup_path',
21 'pack_id'
22 ),
23 array(
...
35 PDO::PARAM_INT),
36 'script_id');
37 $this->init();
38 }
sql_class
:
6 public function __construct($table,array $columns,array $colTypes,$pkey){
7 parent::__construct($table,array_combine($columns,$colTypes),$pkey,db_get_connection(),true);
8 }
对于那些好奇的人来说,是 sql_class
的父母:
public function __construct($table,array $columns,$pkey,$db,$trackChanges=false){
$this->table=$table;
$this->columns=$columns;
$this->pkey=$pkey;
$this->db=$db;
$this->data=$trackChanges?new ChangeTrackingPropertyList:new PropertyList;
$this->trackChanges=$trackChanges;
}