PHP脚本中发生奇怪和间歇性错误

时间:2014-07-11 19:34:34

标签: php apache opcache

现在,此错误是间歇性的,易于重现。是的,我的意思是它很容易重现。问题是没有模式。在重置opcache之前,它引发错误的ID是一致的。

编辑:进一步研究指向op-cache。禁用op-cache可以解决问题。提高RAM,op-cache只能使用延迟脚本故障。我已经使用OpCacheGUI来监控op-cache几天了,我很少看到它使用超过20MB。这是一个内部程序,不需要速度,所以我只是要禁用它。

设定:

  • Ubuntu 14.04 LTS
  • Apache / 2.4.7(Ubuntu)
  • PHP 5.5.9-1ubuntu4.3(内置:2014年7月7日16:34:16)
  • Zend Engine v2.5.0
  • Zend OPcache v7.0.3

错误:

  

[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;
}

0 个答案:

没有答案