分类目录归档: 学习日志

又一台VPS悲剧了

hostitek台湾的vps,SSD硬盘出问题,商家已换新的硬盘,我的数据估计全丢了,还好自己有备份。以前有人说过hostitek的vps丢过数据,我只喜欢他们的网速特好,主机性能也很好,想不到悲剧发生了,他们也没有备份,如果他们有备份,不超售,那就是非常好的vps。如果openVZ的VPS不超售,性能肯定比XEN的强。为什么linux主机的硬盘这么容易坏呢???

博客只好搬到diahosting的美国主机,diahosting很久以前用过,硅谷机房延迟低,网速不错,且RAID10。

wordprees的优化有两篇文章非常好,本人就在用。

WordPress 内存缓存终极加速插件:Batcache

WordPress 如何启用 Memcached 内存缓存

CURL全局初始化问题

最近一个例子调试很久才找到问题。

情况是这样的

A函数里先调用B函数,再调用C函数。

C函数要用到curl openssl版的,在C函数开始部分curl_global_init(CURL_GLOBAL_ALL); 全局初始化,在结尾部分curl_global_cleanup();全局释放。

假如B函数也用到了openssl。这个A函数如果在main函数里执行一遍是没有问题的。如果在主函数里执行两遍以上A函数,问题就会出现了。最后查找原因是因为curl_global_cleanup();把openssl给释放了。造成第二次执行A再执行B的时候B出问题了,间接造成B出问题。

结论:curl_global_init(CURL_GLOBAL_ALL); 一定要放在主程序开头。curl_global_cleanup();函数一定要放在主程序结尾

 

一次惨痛的教训

最近做一个程序,想删除某个文件夹,第一个想到的是win32API RemoveDirectory 后来发现这个函数不能删除非空目录。后来去上网上在资料,找到了两种 

bool DeletePath(char * lpszPath)
{
	if(!lpszPath) return false;
	SHFILEOPSTRUCT FileOp={0};
	//允许放回回收站 不出现确认对话框 不显示一个进度对话框 不显示出错用户界面
	FileOp.fFlags = FOF_ALLOWUNDO|FOF_NOCONFIRMATION|FOF_SILENT|FOF_NOERRORUI;
	FileOp.pFrom = lpszPath; //路径
	FileOp.pTo = NULL; //一定要是NULL
	FileOp.wFunc = FO_DELETE; //删除操作
	return (SHFileOperation(&FileOp) == 0);
}

 

 这种经常出问题,且不通用。

bool deleteDirectory(const char* pszDir)
{
	WIN32_FIND_DATA fd;
	char szTempFileFind[MAX_PATH] = { 0 };
	bool bIsFinish = false;
	ZeroMemory(&fd, sizeof(WIN32_FIND_DATA));
	sprintf(szTempFileFind, "%s*.*", pszDir);

	HANDLE hFind = FindFirstFile(szTempFileFind, &fd);
	if(hFind == INVALID_HANDLE_VALUE)
		return false;
	while (!bIsFinish) //删除非空目录下的所有文件以及目录
	{
		bIsFinish = (FindNextFile(hFind, &fd)) ? false : true;
		if ((strcmp(fd.cFileName, ".") != 0) && (strcmp(fd.cFileName, "..") != 0))
		{
			char szFoundFileName[MAX_PATH] = { 0 };
			strcpy(szFoundFileName, fd.cFileName);
			if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) //判断是不是目录
			{
				char szTempDir[MAX_PATH] = { 0 };
				sprintf(szTempDir, "%s%s", pszDir, szFoundFileName);
				deleteDirectory(szTempDir);
			}
			else
			{
				char szTempFileName[MAX_PATH] = { 0 };
				sprintf(szTempFileName, "%s%s", pszDir, szFoundFileName);
				DeleteFile(szTempFileName);
			}
		}
	}
	FindClose(hFind);

	if (!RemoveDirectory(pszDir)) //删除已清空了内容的目录
		return false; return true;
}

 

这个函数貌似没什么问题,而其我还增加了入口检查,判断pszDir是否为非空。但是悲剧的是如果我传的是没有字符的字符数组,问题就来了。
sprintf(szTempFileFind,  "%s*.*",  pszDir);  如果pszDir是没有字符的空字符数组时 szTempFileFind 就会是 *.* 。这个值等于这个盘的顶层目录,如d:,最后的悲剧就是你整个D盘的东西就全部会被删除。假如你里面有写了几个月的代码。。。
这个教训告诉我 不能乱抄网上的代码。。。T_T