ORACLE监听日志过大导致无法连接的问题

最近公司windows服务器上的oracle突然无法连接了,分成的奇怪,数据实例照常启动没有什么问题,监听在服务面板也能正常启动,貌似都没看到什么异常。

经过各种途径分析始终发现不了什么问题,后来使用命令行来启动监听发现启动非常之慢,lsnrctl start /stop.

后来想看看监听的日志,于是在oracle的bin目录下执行命令adrci.exe,然后执行命令show alert,看到日志路径如下

diag\tnslsnr\win-1stle0m8d7m\listener

这是oracle安装路径里面的路径,找到这个路径看里面的日志文件,发现listener\trace\listener.log这个文件超级巨大达到4g

于是将监听器关闭之后删除该文件,然后重启监听器一切恢复正常。

.NET下使用ORACLE驱动

早些时候微软在.net平台提供对oracle的支持,后来终止了支持,那么现在最好的办法自然是使用oracle自己提供的.net驱动了,而且比微软的方式更高效,访问效率更高。但是使用起来并不是一帆风顺,这里给出一个最最最简单的办法,重要的事情要说三遍。。。

从官网下载xcopy包http://www.oracle.com/technetwork/database/windows/downloads/utilsoft-087491.html

注意下载与自己对应oracle的版本,比如11g的oracle就下ODAC 11.2 Release 6应该是比较正确的,当然高版本有时候也能访问低版本的数据库,但是谁知道会发生什么灵异事件呢。

下载完整的包解压之后看看压缩包的内容如下

image

这么多内容,我们只取其中我们需要的,这里来个最笨的办法:

1.instantclient_11_2目录下的dll全部复制到你项目的bin目录中,大概也就几个文件,当然有些可能是多余的这就不重要了,但是少了肯定不行;

2.根据你的.net版本,比如是2.0那就从odp.net20中复制,文件分别是:

odp.net20\bin\OraOps11w.dll

odp.net20\odp.net\bin\2.x\Oracle.DataAccess.dll

如果想提示信息中文odp.net20\odp.net\bin\2.x\Resources这个目录也一并复制

这些都复制到你的bin目录中。

3.在项目中引用Oracle.DataAccess.dll这个dll就可以了,代码中如下写法;

//执行sql语句
private void ExecuteSql(String sql) {

	string conn_str = "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.140)(PORT=1521))(CONNECT_DATA=(SID=mydb_sid)));User Id=username;Password=password;";
	OracleConnection conn = new OracleConnection(conn_str);
	conn.Open();

	OracleCommand cmd = new OracleCommand(sql, conn);
	cmd.ExecuteNonQuery();

	conn.Close();
}

注意数据库连接改成自己对应的值。

 

这种使用ODAC的方式注意在系统的assambly中不要存在全局的Oracle.DataAccess.dll,到目录C:\Windows\assembly下看看凡是出现Oracle.DataAccess.dll就在上边右键弹出菜单卸载之。这样就保证了你项目引用的是你自己bin目录下的dll和其依赖项。

php获取WIN/LINUX系统 MAC地址

获取网卡的MAC地址原码;目前支持WIN/LINUX系统 获取机器网卡的物理(MAC)地址

<?php
    /**
    获取网卡的MAC地址原码;目前支持WIN/LINUX系统
    获取机器网卡的物理(MAC)地址
    **/
         
    class GetMacAddr{
         
            var $return_array = array(); // 返回带有MAC地址的字串数组
            var $mac_addr;
         
            function GetMacAddr($os_type){
                 switch ( strtolower($os_type) ){
                          case "linux":
                                    $this->forLinux();
                                    break;
                          case "solaris":
                                    break;
                          case "unix":
                                     break;
                           case "aix":
                                     break;
                           default:
                                     $this->forWindows();
                                     break;
          
                  }
          
                     
                  $temp_array = array();
                  foreach ( $this->return_array as $value ){
          
                            if (
    preg_match("/[0-9a-f][0-9a-f][:-]"."[0-9a-f][0-9a-f][:-]"."[0-9a-f][0-9a-f][:-]"."[0-9a-f][0-9a-f][:-]"."[0-9a-f][0-9a-f][:-]"."[0-9a-f][0-9a-f]/i",$value,
    $temp_array ) ){
                                     $this->mac_addr = $temp_array[0];
                                     break;
                           }
          
                  }
                  unset($temp_array);
                  return $this->mac_addr;
             }
          
          
             function forWindows(){
                  @exec("ipconfig /all", $this->return_array);
                  if ( $this->return_array )
                           return $this->return_array;
                  else{
                           $ipconfig = $_SERVER["WINDIR"]."\system32\ipconfig.exe";
                           if ( is_file($ipconfig) )
                              @exec($ipconfig." /all", $this->return_array);
                           else
                              @exec($_SERVER["WINDIR"]."\system\ipconfig.exe /all", $this->return_array);
                           return $this->return_array;
                  }
             }
          
             function forLinux(){
                  @exec("ifconfig -a", $this->return_array);
                  return $this->return_array;
             }
          
    }
//方法使用
$mac = new GetMacAddr(PHP_OS);
echo $mac->mac_addr;
?>

PHP一键去除网页BOM头

在网站开发或者是前端开发中,有时候我们在小改动的情况下,习惯的使用windows系统自带的编辑器进行编辑,这就会导致页面出现bom签名(只针对utf8文件,gbk编码不会出现此问题)这个时候如何解决这个问题呢?

首先你要熟悉几个常出现的问题:

1.网站打开空白

2.页面头部出现多余的空白

3.网站出现乱码,如“锘�”

解决方法可以是:

1.选用专业的编辑器,例如notepad++,sublime,editplus这样不会自动签名。

2.sublime通过如下操作File -> Save with Encoding -> UTF-8保存后即可去除bom

3.notepad++选中格式 -> 以UTF-8格式编码 选项即可去除

泪雪这次最为苦恼的就是遇见了网页出现的乱码“锘�”,这个就是因为转码后多余出来的,仔细检测也并不是PHP文件的BOM属性,经过不断的摸索和 发现,是整个网站中有些文件存在BOM属性,所以导致调用输出时就出现了“锘�”这样的乱码,由于网站程序的庞大,所以并不可能手动挨个检查排除修复,所 以就发现了一个极为好用的PHP程序。

这是执行效果:

php1

下面就贴出整理的代码吧!

<?php
if (isset($_GET[‘dir’])){ //设置文件目录
$basedir=$_GET[‘dir’];
}else{
$basedir = ‘.’;
}
$auto = 1;
checkdir($basedir);
function checkdir($basedir){
if ($dh = opendir($basedir)) {
while (($file = readdir($dh)) !== false) {
if ($file != ‘.’ &amp;&amp; $file != ‘..’){
if (!is_dir($basedir.”/”.$file)) {
echo “filename: $basedir/$file “.checkBOM(“$basedir/$file”).” &lt;br&gt;”;
}else{
$dirname = $basedir.”/”.$file;
checkdir($dirname);
}
}
}
closedir($dh);
}
}
function checkBOM ($filename) {
global $auto;
$contents = file_get_contents($filename);
$charset[1] = substr($contents, 0, 1);
$charset[2] = substr($contents, 1, 1);
$charset[3] = substr($contents, 2, 1);
if (ord($charset[1]) == 239 &amp;&amp; ord($charset[2]) == 187 &amp;&amp; ord($charset[3]) == 191) {
if ($auto == 1) {
$rest = substr($contents, 3);
rewrite ($filename, $rest);
return (“&lt;font color=red&gt;BOM found, automatically removed.&lt;/font&gt;”);
} else {
return (“&lt;font color=red&gt;BOM found.&lt;/font&gt;”);
}
}
else return (“BOM Not Found.”);
}
function rewrite ($filename, $data) {
$filenum = fopen($filename, “w”);
flock($filenum, LOCK_EX);
fwrite($filenum, $data);
fclose($filenum);
}
?>

使用方法:复制上面代码到一个新建的delbom.txt的文件中,上传到网站根目录,然后将delbom.txt改为delbom.php,最后直接前台访问该文件即可。

json_encode不支持中文

今天头一回用json_encode,发现它不支持中文,

在json_encode之前,把所有数组内所有内容都用urlencode()处理一下,然用json_encode()转换成json字符串,最后再用urldecode()将编码过的中文转回来。

写了个函数JSON来代替json_encode,这种方法在我的程序中测试是成功的:

/**************************************************************
 *
 *	使用特定function对数组中所有元素做处理
 *	@param	string	&$array		要处理的字符串
 *	@param	string	$function	要执行的函数
 *	@return boolean	$apply_to_keys_also		是否也应用到key上
 *	@access public
 *
 *************************************************************/
function arrayRecursive(&$array, $function, $apply_to_keys_also = false)
{
    static $recursive_counter = 0;
    if (++$recursive_counter > 1000) {
        die('possible deep recursion attack');
    }
    foreach ($array as $key => $value) {
        if (is_array($value)) {
            arrayRecursive($array[$key], $function, $apply_to_keys_also);
        } else {
            $array[$key] = $function($value);
        }

        if ($apply_to_keys_also && is_string($key)) {
            $new_key = $function($key);
            if ($new_key != $key) {
                $array[$new_key] = $array[$key];
                unset($array[$key]);
            }
        }
    }
    $recursive_counter--;
}

/**************************************************************
 *
 *	将数组转换为JSON字符串(兼容中文)
 *	@param	array	$array		要转换的数组
 *	@return string		转换得到的json字符串
 *	@access public
 *
 *************************************************************/
function JSON($array) {
	arrayRecursive($array, 'urlencode', true);
	$json = json_encode($array);
	return urldecode($json);
}