Centos 6.2 Linux PHP 连接 Oracle 11G

注:本次任务所用Centos 6.2 为最小安装

在oracle网站下载 instantclient 安装包,根据主机情况下载 i386 或 x86_64相应的安装包

oracle站需要注册登录后才能下载

http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html

下载后安装instantclient

rpm -Uvh oracle-instantclient-basic-12.1.0.1.0-1.i386.rpm
rpm -Uvh oracle-instantclient-devel-12.1.0.1.0-1.i386.rpm

完成后,客户端安装于:
/usr/lib/oracle
/usr/lib/oracle/12.1/client/lib

vi /etc/ld.so.conf.d/oracle-lib.conf 加入:

/usr/lib/oracle/12.1/client64/lib/
ldconfig

//默认centOS没有安装phpize   (#which phpize查询)

安装phpize:
#yum install php-devel

准备PHP重新编译环境

# yum install gcc-c++ //Debian / Ubuntu采用 gcc-g++
# yum install wget
# yum install make

安装OCI8 PHP扩展
wget http://pecl.php.net/get/oci8-2.0.8.tgz

tar xzf oci8-2.0.8.tgz

cd oci8-2.0.8

/usr/bin/phpize

./configure –with-php-config=/usr/bin/php-config –with-oci8=shared,instantclient,/usr/lib/oracle/12.1/client/lib/

make && make install

make,makeinstall在/usr/lib/php/modules生成oci8.so扩展

在/etc/php.ini中加入:

extension = oci8.so

重启apache,加载PHP

==========================

<?php
$dbconn=oci_connect(“username”,”password”,”(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.28)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = grits)
))”);
if($dbconn!=false)
{
echo “success”;
if(oci_close($dbconn)==true)
{
echo “log off success”;
}
}
else
{
$e = oci_error();
echo $e['message'];
}
?>
==========================

问题处理:

Oracle 11G特殊问题:

初次连接时,提示

ORA-24408: could not generate unique server group name

解决:
more /etc/sysconfig/network
查看 HOSTNAME

vi /etc/hosts
127.0.0.1 HOSTNAME

替换HOSTNAME为真实的主机名。

抽奖程序

功能:按照初始设定的抽奖号码,可以是顺序号,也可以是姓名或身份证号。设定一、二、三等奖及特等奖数量。分次随机抽取结束后,滚屏显示(直接投影),抽奖结果可直接打印输出以备领奖和文件保存。

适用:单位年会,产品发布会,培训签到等,增加会议活动关注度并调节气氛。

纯净绿色版。www.grits.cn 出品。

下载:Draw

MailRelay自动邮件发送

功能:批量通过smtp服务器发送文本/html格式邮件,纯净绿色。

下载:MailRelay

Author: www.grits.cn

邮件发送需通过smtp服务器,不支持邮件直投。
基于smtp服务器安全,本版本不开放多线程发送,不支持本机多个IP地址切换。

同一台机器上可复制n套系统文件,并同时启动n个 mailrelay.exe
每个MailRelay进程在各自的\Raw目录中逐个发送。

Raw目录中的邮件文本由用户程序自行生成。邮件文本_样本

指定文件修改起始时间过滤文件夹

功能:指定文件修改起始时间过滤文件夹,符合条件的文件复制至目标文件夹,保留原始路径结构。同时剔除.svn相关的辅助文件。

适用:网站文件部分修改后,提取新修改的文件以便FTP上传。

下载:filterduplicator

使用:filterduplicator.exe <源文件夹> <起始时间-年月日时分秒> <目标文件夹>

示例:filterduplicator.exe “c:\Apache2.2\htdocs\grits” “2013-06-01 00:00:00″ “c:\grits.cn”

go-lang参考代码:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
//Author: www.grits.cn
package main
 
import (
	"fmt"
	"io"
	"os"
	"path/filepath"
	"runtime"
	"time"	
	"strings"
)
 
type fileInfo struct{
	tmModified time.Time
	path string
}
 
const maxGoroutines = 100
func main(){
	if len(os.Args)!=4 || os.Args[1] == "-h" || os.Args[1] == "--help" {
		fmt.Println( "Usage: ",filepath.Base(os.Args[0])," \"c:\\sourcedir\" \"2013-06-01 12:12:12\" \"c:\\destinationdir\"" )
		os.Exit(1)
	}
 
	dirSrc,timeStart,dirDes := os.Args[1],os.Args[2],os.Args[3]
	if len(timeStart)!=19 {
		fmt.Println( "Time Start must be like \"2013-06-01 12:12:12\"" )
		os.Exit(1)
	}
 
	runtime.GOMAXPROCS( runtime.NumCPU() )
	tmStart, _ := time.Parse("2006-01-02 15:04:05",timeStart)	//	http://golang.org/pkg/time/
 
	os.RemoveAll( dirDes )
	err := os.MkdirAll( dirDes,os.ModePerm )
	if err==nil {
		chanInfo := make( chan fileInfo,maxGoroutines*2 )
		go filter( chanInfo,dirSrc,tmStart )
		for info := range chanInfo {
			pathRelative,err := filepath.Rel(dirSrc, info.path)
			if err==nil {
				dirSplit,fileSplit := filepath.Split(pathRelative)
				pathDes := filepath.Join(dirDes,dirSplit)
 
    			_, err = os.Open(pathDes)
    			if os.IsNotExist(err) {
       				if os.MkdirAll( pathDes,os.ModePerm )!=nil {
						fmt.Println( pathDes,"create error!" )
					}
				}
 
				fileDes := filepath.Join(pathDes,fileSplit)
				CopyFile(info.path, fileDes)
				fmt.Println( info.tmModified,fileDes )
			}
		}
		//print( tm.Format("2006-01-02 15:04:05") )
	}else{ print( err.Error() ) }
}
 
func filter( chanInfo chan fileInfo, dirSrc string, tmStart time.Time ){
	filepath.Walk( dirSrc, makeWalkFunc(chanInfo,tmStart) )
	close( chanInfo )//do not put in main routine, it will close immediately
}
 
func makeWalkFunc( chanInfo chan fileInfo,tmStart time.Time ) func(string, os.FileInfo, error) error{
	return 	func(path string, info os.FileInfo, err error) error{
				if err == nil && !strings.Contains(path,".svn") && info.ModTime().After(tmStart) && (info.Mode()&os.ModeType == 0) {
					chanInfo <- fileInfo{ info.ModTime(),path }
				}
				return nil
			}
}
 
func CopyFile(src,des string) (int64, error) { 
	sf, err := os.Open(src) 
	if err != nil { 
		return 0, err 
	} 
	defer sf.Close() 
	df, err := os.Create(des) 
	if err != nil { 
		return 0, err 
	} 
	defer df.Close() 
	return io.Copy(df, sf) 
}