2009年10月8日18:05,小小杜出生于汝阳县医院。 性别男,体重3kg
挺瘦的,呵呵~~~~希望过年的时候成个大胖小子 O(∩_∩)O~
ps:由于域名到期未能及时续费,博客停了好多天,没能及时更新
2009年10月8日18:05,小小杜出生于汝阳县医院。 性别男,体重3kg
挺瘦的,呵呵~~~~希望过年的时候成个大胖小子 O(∩_∩)O~
ps:由于域名到期未能及时续费,博客停了好多天,没能及时更新
来源:http://www.cnblogs.com/niniwzw/archive/2009/09/07/1561668.html
最近在雅虎的一个朋友和我说,以前用bash csh 写脚本, 它现在都在用PHP 写后台程序,觉得PHP的函数最全,而且很容易用 shell_exec 很容易调用系统内核。
我和他交流了一下写后台程序的一些原则,归纳如下。
首先,要去掉以前写网页脚本的一些思维习惯。网页脚本运行一次以后,就马上释放内存。而daemon 程序不一样,它会一直运行一年,甚至几年。
1. 作为一个好的习惯,一定要在while (1) {} 这样一个死循环里面运行代码。这样,只要代码不出状况,脚本就不会停止。
2. echo 不能用,而是用log 代替。用写日志的方法代替echo。因为echo 是 向 屏幕输出一个字符,如果没有任何输出的对象,就会报一个致命错误。
3. 如果MYSQL,要每次重新连接MYSQL。
function connnect()
{
global $db;
if (is_resource($db)) {
mysqli_close($db);
}
$db = mysqli_connect(“122.225.96.142“, ‘waihui‘, ‘freebsd@fzm‘, ‘waihui‘);
}
上面就是连接的一个例子。这个代码曾经被一个高手狠狠的批评了一顿。这个主要是为了防止下面的事情:
mysql 重启了,$db 变量肯定还是个资源,但是这个资源已经无效了。如果再执行代码就会发生:
mysql has go away 这样的错误。这个会向屏幕输出,即时关闭错误报告也一样会输出。这样导致整个
脚本运行错误,和echo 产生的错误一样。
虽然每次连接数据库有些浪费,但是也只能宁可错杀1000,也不放过一个。这个错误,是大多数朋友都会犯的
错误,很多人和我说这个是mysql的bug,因为,本来写文件好好的,后来连接带mysql就出错了。
其实不是mysql的bug。
4. 新产生的变量,如果不是自动释放的,要马上释放。否则日积月累,程序就要崩溃。很多PHP程序员没有一点
内存管理的概念,觉得内存是无限的,随便用,写后台程序一定要注意内存的管理。
5. 如果要访问文件,首先要 clearstatcache, 否则很有可能会不精确的统计,或者
判断文件是否存在变的不准确了。更要命的是,如果你频繁打开文件,文件的handle 值会
不断增加,等到超过整数的最大值,程序就无法打开文件。很多人的程序,3个月挂一次,
没有出现错误,也没有出现内存问题,很有可能就是每次操作文件前,没有清除statcache。
当MySQL繁忙的时候运行show processlist,会发现有很多行输出,每行输出对应一个MySQL连接。怎么诊断发起连接的进程是哪个?它当前正在干嘛呢?
首先,需要通过TCP Socket而不是Unix Socket连接MySQL,这样在show processlist的输出中就会有来源端口号。如下,
mysql> show processlist;
+——–+——–+—————–+——+———+——+——-+——————+
| Id | User | Host | db | Command | Time | State | Info |
+——–+——–+—————–+——+———+——+——-+——————+
| 277801 | mydbuser | localhost:35558 | mydb | Sleep | 1 | | NULL |
| 277804 | mydbuser | localhost:35561 | mydb | Sleep | 1 | | NULL |
| 277805 | mydbuser | localhost:35562 | mydb | Sleep | 0 | | NULL |
+——–+——–+—————–+——+———+——+——-+——————+
在Host列有来源IP和端口号,然后我们从连接机器查看端口号是谁打开的,
[root@localhost ~]# netstat -ntp | grep 35558
… 124.115.0.68:35558 ESTABLISHED 18783/httpd
可知进程18783发起的MySQL连接来源端口是35558,然后就可以用strace观察这个进程了。如果是Apache的PHP脚本,还可以用proctitle模块( http://pecl.php.net/package/proctitle/ )设置脚本的状态信息。
lsof也能根据端口号显示进程号,细节请参考手册。
http://www.mysqlperformanceblog.com/2007/02/08/debugging-sleeping-connections-with-mysql/
什么是固定链接,打个比方,如果说域名是一个博客在互联网上的代表一个人的话,那么固定链接地址就是门牌号码。只有通过固定链接,你才能找到找个 人。由此可见,固定链接在博客中的重要性。对于wordpress 用户而言,掌握一下一些固定连接的设置参数和技巧,则能够让别人更好的找到你的博客。
参数不多说,很死的东西,按照WordPress官方文档列表如下:
将上述参数进行组合,即可得到wordpress的固定链接形式。网上常见的几种设置方法:
这基于两个方面的考虑。一是如果数字出现在固定链接里面,等于提醒搜索引擎,这是很旧的内容了,没必要再爬一遍了。另外一个原因是,假如你要修改文章的日期重新发布的话,链接地址就变了,也就是意味着你的反向链接,PR 等等都没有了。
这一点是很多人都会忽略的地方。让分类出现在固定链接里面有两个缺陷:一是一篇文章如果选择了多个分类的话,则会出现多个链接地址,这很容易造成因为重复内容而被搜索引擎惩罚;二是有可能会造成关键词堆砌而被搜索引擎惩罚。
这一点经常看到。很多wordpress 用户的固定链接是年/月/日/分类名/文章名。这种过于深的固定链接对搜索引擎是非常不友好的。
虽然现在的搜索引擎已经能识别URL地址里面的中文字符,但无论是从美观上,还是从wordpress 优化的角度来看,都是非常差的。