现在,这个错误是间歇性的,很容易重现。是的,我的意思是它很容易复制。问题是没有模式。在我重置 opcache 之前,它引发错误的 ID 是一致的。
编辑:进一步的研究指向操作缓存。禁用 op-cache 可以解决问题。增加操作缓存可以使用的 RAM 只会延迟脚本失败。几天来,我一直在使用OpCacheGUI监控操作缓存,但很少看到它使用超过 20MB。这是一个不需要速度的内部程序,所以我将禁用它。
设置:
- Ubuntu 14.04 LTS
- Apache/2.4.7 (Ubuntu)
- PHP 5.5.9-1ubuntu4.3(内置:2014 年 7 月 7 日 16:34:16)
- Zend 引擎 v2.5.0
- Zend OPcache v7.0.3
错误:
[UNK][2014-07-11 14:34:31-0400]致命错误(1):无法在 /var/www/html/.../classes/script.class 中调用私有 sql_class::__construct()。 php(8)
URI: /.../js/getMessages.php?script=152
#0 default_error_handler() 调用于[/var/www/html/.../libconfig.php:122]
#1 shutdown()称为未知
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;
}