今天晚上,写了一会书以后,有开始折腾我的这个网站了,目标很简单,把本站信息弄好,在仔细的看了一会源代码后,终于发现以前写asp的一些知识居然还在管用,基本知道怎么回事了。
于是,上传图片,修改代码,然后再FTP到服务器,再打开网站的时候,我突然发现傻了,网站打不开,报了一堆的错误,说什么打不开目录下的config.php文件。
Warning: include(TEMPLATEPATH/config.php) [function.include]: failed to open stream: No such file or directory in /home/.andromeda/tuolei/www.ixdba.com/wp-admin/index.php on line 4
Warning: include() [function.include]: Failed opening ‘TEMPLATEPATH/config.php’ for inclusion (include_path=’.:/usr/local/php5/lib/php’) in /home/.andromeda/tuolei/www.ixdba.com/wp-admin/index.php on line 4
Fatal error: Call to undefined function get_header() in /home/.andromeda/tuolei/www.ixdba.com/wp-admin/index.php on line 6。
我晕,难道我修改错了。
情急之下,输入管理页面的地址,也报同样的错误,ft。我只好登陆到空间的根目录下,发现根目录下根本没有config.php文件啊。突然想起来,我上传的index.php应当是模板中的index.php,而我把它上传到根目录下了,把根目录下的index.php给覆盖了,而且,看起来,我连管理目录下的index.php也覆盖了。
好大的一个错误啊。。。
幸好我有备份,从备份中恢复根目录下与管理目录下的index.php,一切正常,晕的,这个错误犯的真不小。不过,也说明了,备份是如此的重要。。。
另外,php有什么好的编辑工具没有啊,就是所编即所得的工具,用UltraEdit写web程序,也TMD太累了吧,根本不知道写出来的是什么样子,只能凭我的想象力了。
先获得安装文件openssh.tar,然后解压该文件,如
#tar xvf openssh.tar
x openssh5.2
x openssh5.2/openssh
x openssh5.2/openssh/openssh.base, 1580032 bytes, 3086 media blocks.
x openssh5.2/openssh/openssh.license, 504832 bytes, 986 media blocks.
x openssh5.2/openssh/openssh.man.en_US, 111616 bytes, 218 media blocks.
……
#cd openssh5.2
#ls -l
total 0
drwxr-x— 2 502 502 256 Sep 21 03:59 openssh
drwxr-x— 2 502 502 256 Sep 21 03:59 openssl
先安装ssl
#cd openssl
#smit install_latest
选择当前目录,注意中括号中的“.”号
* INPUT device / directory for software [.]
回车后,选择
SOFTWARE to install
选择默认的_all_latest(这个选择最好保证本目录只有ssl的安装文件),或者是按F4或者Esc+4,得到软件列表,用F7或者Esc+7选择上ssl的全部软件
Press Enter AFTER making all selections.
> openssl-0.9.7d ALL
R:openssl-0.9.7d 0.9.7d
> openssl-devel-0.9.7d ALL
R:openssl-devel-0.9.7d 0.9.7d
> openssl-doc-0.9.7d ALL
R:openssl-doc-0.9.7d 0.9.7d
回车,选择接受许可协议为yes
ACCEPT new license agreements? yes
回车开始安装,如下为安装成功的界面
Command: OK stdout: yes stderr: no
Before command completion, additional instructions may appear below.
geninstall -I “a -cgNQqwX -J” -Z -d . -f File 2>&1
File:
openssl-0.9.7d
openssl-devel-0.9.7d
openssl-doc-0.9.7d
Validating RPM package selections …
openssl ##################################################
openssl-devel ##################################################
openssl-doc ##################################################
通过如下命令可以查看安装了的ssl
#rpm -qa|grep ssl
openssl-0.9.7d-1
openssl-devel-0.9.7d-1
openssl-doc-0.9.7d-1
ssl安装之后,就可以安装ssh软件了
进入到ssh的目录
#cd openssh
#smit install_latest
选择当前目录,注意中括号中的“.”号
* INPUT device / directory for software [.]
回车后,选择
SOFTWARE to install
安装所有可以安装的ssh软件,或者是默认全部软件(确保该目录只有ssh)。
选择
ACCEPT new license agreements? yes
否则,将安装不成功。
回车执行,显示OK将表示安装成功,安装过的文件集可以通过如下命令查看。
#lslpp -l openssh*
Fileset Level State Description
———————————————————————————
Path: /usr/lib/objrepos
openssh.base.client 3.8.0.5200 COMMITTED Open Secure Shell Commands
openssh.base.server 3.8.0.5200 COMMITTED Open Secure Shell Server
openssh.license 3.8.0.5200 COMMITTED Open Secure Shell License
openssh.man.en_US 3.8.0.5200 COMMITTED Open Secure Shell
Documentation -U.S. English
Path: /etc/objrepos
openssh.base.client 3.8.0.5200 COMMITTED Open Secure Shell Commands
openssh.base.server 3.8.0.5200 COMMITTED Open Secure Shell Server
在多进程连接的数据库,并发操作是一个很平常的现象,加上Oracle特有的锁机制(不阻塞读),所以理解与控制并发是一个非常重要的事情。
下面用一个简单的例子说明并发处理中的一个问题,如用户表中存放好评的统计数据,假定两个用户同时操作,看如下一个过程。
one session other session
-----------------------------------------------------------------------------------------
T1> SQL>insert into auction_feedbacks values(?)
1 row inserted
T2> SQL>insert into auction_feedbacks values(?)
1 row inserted
T3> SQL> update bmw_users set rated_sum =
(select count(*) from auction_feedbacks
where username=?)
where id=?;
1 row updated
T4> SQL> update bmw_users set rated_sum =
(select count(*) from auction_feedbacks
where username=?)
where id=?;
1 row updated
T5>SQL> commit;
Commit complete
T6> SQL> commit;
Commit complete
其中时间T1<T2<T3<T5<T5<T6
两个会话,同样的执行语句与同样的执行顺序,都想把增加到好评表中的好评统计放到用户表中去,但是,问题出来了,假定原来该用户的好评是20个,经过两个人的评价后,好评表中最后是22条记录了,而用户表的统计数据是21。
错在哪里?谁都没有错,是并发引发的问题。
要控制好并发,就要深刻理解Oracle的锁机制,Oracle如果一个进程发生数据改变,另外一个进程读该数据的时候,将发生一致性读(以SCN为基准),所以在上面的例子中,进程2读到了进程1 commit之前的统计数,这样就漏掉了会话1发生的好评。
我们要怎么避免并发呢,其实Oracle除了支持一致性读,也支持当前读,也就是说,操作之前检查最新的状态,对于select 可以用序列事务,对于DML本来就是当前读,所以,我们可以利用update的条件中增加需要更新值的原始值来避免并发。
我们利用用户表复制中的防止并发操作来说明,同样的两个会话
会话一
- update rep_users_flag f set f.run_flag='runing'
- where f.run_flag='stop' and f.sp_type='users1';
会话二
- update rep_users_flag f set f.run_flag='runing'
- where f.run_flag='stop' and f.sp_type='users1';
执行同样的语句,如果会话1先执行但是还没有提交的时候,会话2处于等待状态,但是会话1一旦提交,会话2的条件“where f.run_flag=’stop’”的检查将失效(当前读已经是runing,是会话1提交后的数据),所以会话2能更新到的记录数将是0。通过判断sql%rowcount返回的处理行数就可以决定是否继续,如上面的例子,如更新到的行数返回0,将退出或者是等待。
如果在业务频繁的表上面,也可以与实际业务结合起来,如要把表的字段a增加10,可以这样操作
- update table_name set a=a+10
- where id=? and a=10
在以上例子中,假定原表a的值是10,该语句就可以保证只能有一个进程能更新成功。