标题
服务器之王! [坛主CLQ的服务器程序开发日记,综合了众多C/C++程序崩溃的原因,强烈推荐!]
clq
2005-12-20 21:06:15 发表
编辑
今天说一下PHP [s:7]
对于简单的应用我一向直接用PHP来写,但最近老发现操作系统的连接全部用尽!我想一定是中毒了,检查了一下的确不是很正常,但有一个非常严重的问题:就是apache和mysql之间存在成百上千的连接!我心里一惊,难道PHP不会自动释放数据库连接吗?再看了一个我的代码,果然是很少释放数据连接的--因为我一直认为PHP会自动释放!!
clq
嘻嘻,还是不对.是php中有两中数据库连接.长连接是不会自动释放的.虽然我很喜欢PHP,但它的安全性太怕了.以后我们网站的程序要全部用那个HTTP的C程序全部改写过.
clq
最近到新公司,已经不是完全用C了. 在他们已有的代码中,用indy的那个tcpserver比较多:( . 唉,这实在令人有点哭笑不得,我想我是改变不了这种现状,那就为在这种现状下更好工作做一点贡献吧.
在他们的代码中通常喜欢用原始的pascal的文件函数来写日志,但这样有一个非常严重的问题.这种函数产生的异常是无法屏蔽的,我试了几种方式都无法使异常不出现,这样的话,会使函数后面的代码不被执行! 我本想,这也不是什么太高要求的服务器,由它算了.但实际工作中,产生错误的情况非常多. 不得已,我想那用windows 的api好了,那总不会异常吧. 因为我很久以前用delphi时就看过TFileStream的源码,知道它是windows api的简单封装,于是就用了这个类.具体代码如下.不过要注意的是,并不是所有TFileStream的函数都不会产生异常.具体的说起来就太多了,大家慢慢体会吧--这是要经验的没有什么别的办法.
procedure printlog2(logInfo:String);//不会引发异常的日志写入函数
var
fs:TFileStream;
filename,s:String;
f:TextFile;
p:pchar;
begin
try
if PrintLogSwitch<> 'on' then exit;
filename := logPath + DateToStr(Now)+'.log';
if not DirectoryExists(logPath) then
begin
CreateDir(logPath);
end;
//fs:=TFileStream.Create(FileName, fmCreate);
//fs:=TFileStream.Create(FileName, fmOpenReadWrite);
{
if FileExists(FileName) then
Append(f)
else
Rewrite(f);
}
if FileExists(FileName) then
fs:=TFileStream.Create(FileName, fmOpenReadWrite)
else
fs:=TFileStream.Create(FileName, fmCreate);
fs.Seek(0, soFromEnd);
s:=FormatDateTime('YYYY-MM-DD,hh-mm-ss zzzz',Now)+':'+logInfo+#13#10;
p:=pchar(s);
fs.Write(p^, length(s));
//fs.WriteBuffer(p^, length(s));
fs.Free;
except
end;
end;
代码有冗余,我也懒得改了. 不过是绝对有效的代码.
clq
最近在用C++改写整个phpwind 的程序,写得越深入越发现phpwind的设计之烂实在是触目惊心!----虽然作为它的免费用户及受益者我本不该这么说。但它的问题太严重了一点,不说出来...
我是马甲
2006-12-20 14:34:46 发表
编辑
今天本想把一些东西移植到公司的代码中,意外地发现了一些情况.
一个简单的http请求发送,然后收消息,客户机和服务器都是自己写的.但老是发现还没收完消息客户机就说接收出错的,开始还以为是服务器写错了什么代码.结果多方测试都没其他问题,将客户端发送的信息严格了一下 -- 原来很随意的多发送了几个回车换行字符.这下发现正常了!而且发现如果服务器的send函数已经成功返回了的话,即使这时杀死服务器,客户端也能正常收到消息! 这说明消息是发送到系统缓冲区的,如果已经到了系统缓冲中,发送程序其实就可以马上退出了--我的系统是windows xp sp2.但多发送消息怎么会导致客户端自己在收消息时出错呢?想不通,也许socket认为你上次的发送都没成功,现在要接收是不允许的,不过如果socket一直不关闭这时客户端还是能收到消息的.只能说socket在关闭时会查看是否有未发送的消息,如果有就不允许从这个socket里收消息了.不过这个机制是在客户机上起作用还是在服务端起作用呢?(就是说是服务器不允许在这种情况下发送,还是客户机在这种情况下不允许接收?)
clq
2006-12-30 21:37:32 发表
编辑
上面的那段 indy 代码移植到 kylix 下有个问题,它居然是默认没有超时的,如果没有数据会一直阻塞下去! 害得我今天又出了错,不过indy的控件中只有read的超时而没有send/write的超时,再联想起以前研究过delphi自身的socket类也是这样的,难道发送时都会成功(或是自己失败返回)?unix下的书好象不是这样说的呀.从我个人的经验来看似乎也还是用过select实现一个超时安全些.
......这的确是个问题,改天去看看apache这些程序是怎样处理的.
guest
2006-12-31 23:33:00 发表
编辑
大家新年好!
clq
今天偶然看到了两个以前比较忽视的问题,恐怖啊! 参见:
http://www.newbt.net:8022/read.csp?fid=9&tid=1017
多线程环境下简直是"必崩"无疑的bug呀!
NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.