谈判力
作者: [美] 罗杰·费希尔
副标题: Getting To Yes 史上最为经典的谈判类书籍,哈佛谈判项目精华
isbn: 750861447X
书名: 谈判力
页数: 176
定价: 22.00元
出版社: 中信出版社
装帧: 平装
出版年: 2009-4
把人和事分开 :
房客的看法 房东的看法
房租已经很高了。 很久没有加房租了。 由于其他费用增加,所以我不能再多交房租了。
由于其他费用增加,所以我要提高租金,增加收入。 房间需要粉刷。 他不爱惜房子。
我知道类似的房子,有人出的房租比我的便宜。 我知道别人要租这样的房子得花更多的钱。
像我这样的年轻人付不起高房租。 像他那样的年轻人喜欢弄出噪音,糟蹋房间。
房租应该降低,因为周围环境都不好。 我们作为房东应该提高房租改善周围环境。
我不养狗也不养猫,是个理想的房客。 我受不了他的音响。
她一来收房租,我马上付给她。 他不到我张口绝不付房租。
她太冷漠,从不关心我。 我替别人着想,从不过问别人的私生活。
阅读全文
作者: [美] 罗杰·费希尔
副标题: Getting To Yes 史上最为经典的谈判类书籍,哈佛谈判项目精华
isbn: 750861447X
书名: 谈判力
页数: 176
定价: 22.00元
出版社: 中信出版社
装帧: 平装
出版年: 2009-4
把人和事分开 :
房客的看法 房东的看法
房租已经很高了。 很久没有加房租了。 由于其他费用增加,所以我不能再多交房租了。
由于其他费用增加,所以我要提高租金,增加收入。 房间需要粉刷。 他不爱惜房子。
我知道类似的房子,有人出的房租比我的便宜。 我知道别人要租这样的房子得花更多的钱。
像我这样的年轻人付不起高房租。 像他那样的年轻人喜欢弄出噪音,糟蹋房间。
房租应该降低,因为周围环境都不好。 我们作为房东应该提高房租改善周围环境。
我不养狗也不养猫,是个理想的房客。 我受不了他的音响。
她一来收房租,我马上付给她。 他不到我张口绝不付房租。
她太冷漠,从不关心我。 我替别人着想,从不过问别人的私生活。
阅读全文
1)防止对.svn目录下的PHP的访问:
2)整个站点的配置如下:
2)整个站点的配置如下:
root@192.168.1.105:/usr/local/webserver/nginx/sbin# ./nginx -V
nginx version: nginx/1.2.2
TLS SNI support enabled
configure arguments: --user=www --group=www --prefix=/usr/local/webserver/nginx --with-http_stub_status_module --with-http_ssl_module --add-module=/root/software/nginx_http_push_module-0.692 --add-module=/root/software/ngx_cache_purge-1.3
出现:
root@192.168.1.105:~/software/nginx-1.2.2# sh /root/runnginx.sh
nginx: [warn] the "log_format" directive may be used only on "http" level in /usr/local/webserver/nginx/conf/nginx.conf:157
nginx: [warn] the "log_format" directive may be used only on "http" level in /usr/local/webserver/nginx/conf/nginx.conf:181
nginx: [warn] the "log_format" directive may be used only on "http" level in /usr/local/webserver/nginx/conf/nginx.conf:200
nginx: [warn] the "log_format" directive may be used only on "http" level in /usr/local/webserver/nginx/conf/nginx.conf:230
nginx: [warn] the "log_format" directive may be used only on "http" level in /usr/local/webserver/nginx/conf/nginx.conf:274
nginx: [warn] the "log_format" directive may be used only on "http" level in /usr/local/webserver/nginx/conf/nginx.conf:304
像这样的,不要放在server里,将/usr/local/nginx/conf/nginx.conf 里server段里的下面的日志代码移出放到该server段的后面即可。:
log_format welog '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log weblog;
}
注意,下面的日志是放在server之外的,即出现警告是放的位置不对
log_format welog '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log weblog;
nginx version: nginx/1.2.2
TLS SNI support enabled
configure arguments: --user=www --group=www --prefix=/usr/local/webserver/nginx --with-http_stub_status_module --with-http_ssl_module --add-module=/root/software/nginx_http_push_module-0.692 --add-module=/root/software/ngx_cache_purge-1.3
出现:
root@192.168.1.105:~/software/nginx-1.2.2# sh /root/runnginx.sh
nginx: [warn] the "log_format" directive may be used only on "http" level in /usr/local/webserver/nginx/conf/nginx.conf:157
nginx: [warn] the "log_format" directive may be used only on "http" level in /usr/local/webserver/nginx/conf/nginx.conf:181
nginx: [warn] the "log_format" directive may be used only on "http" level in /usr/local/webserver/nginx/conf/nginx.conf:200
nginx: [warn] the "log_format" directive may be used only on "http" level in /usr/local/webserver/nginx/conf/nginx.conf:230
nginx: [warn] the "log_format" directive may be used only on "http" level in /usr/local/webserver/nginx/conf/nginx.conf:274
nginx: [warn] the "log_format" directive may be used only on "http" level in /usr/local/webserver/nginx/conf/nginx.conf:304
像这样的,不要放在server里,将/usr/local/nginx/conf/nginx.conf 里server段里的下面的日志代码移出放到该server段的后面即可。:
log_format welog '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log weblog;
}
注意,下面的日志是放在server之外的,即出现警告是放的位置不对
log_format welog '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log weblog;
谁说加班就是敬业?
作者:张国祥
2012/7/11
近日,一篇帖子在网上流传。网友发帖称:“入职京东一个多月,每天都保质保量完成工作,没有出现任何纰漏和生产事故,唯一就是每天准时上下班。结果前天领导找我谈话,说工作态度有问题,不敬业太懒散。不符合公司企业文化,让我主动离职。”阅读全文
作者:张国祥
2012/7/11
近日,一篇帖子在网上流传。网友发帖称:“入职京东一个多月,每天都保质保量完成工作,没有出现任何纰漏和生产事故,唯一就是每天准时上下班。结果前天领导找我谈话,说工作态度有问题,不敬业太懒散。不符合公司企业文化,让我主动离职。”阅读全文
默认并没有开启gzip功能。需要修改apache的配置文件进行开启。
什么是gzip,开启gzip的好处。
开启方法如下:
1. httpd.conf中打开deflate_Module和headers_Module模块 VickieXu
2. httpd.conf中添加: Vickie博客
首先查看apache是否加载了mod_deflate.so模块,如果没有需要安装加载。找到并下载和当前apache版本相同的源码文件,解压缩到/home目录下,在apache安装目录下执行:
/usr/local/apache2/bin/apxs -i -c /home/httpd-2.0.63/modules/filters/mod_deflate.
会自动在 httpd.conf添加
LoadModule deflate_module modules/mod_deflate.so
/usr/local/httpd-2.2.10/bin/apachectl restart
httpd: Syntax error on line 254 of /usr/local/httpd-2.2.10/conf/httpd.conf: module deflate_module is built-in and can't be loaded
解决方案:出现这个情况,表明deflate_module模块是内建的,不用再调入,所以只需要把LoadModule *** 注释就可以了
Egg:
/usr/local/httpd-2.2.10/bin/apxs -i -c /tmp/httpd-rebuild/httpd-2.2.10/modules/filters/mod_deflate.c
chmod 755 /usr/local/httpd-2.2.10/modules/mod_deflate.so
怎么知道开启了Gzip呢?用Httpwatcher或者FireBug抓包如下:
Content-Encoding gzip 这个即是。
响应头信息原始头信息
Accept-Ranges bytes
Connection close
Content-Encoding gzip
Content-Length 892
Content-Type text/html; charset=GB2312
Date Fri, 13 Jul 2012 12:02:08 GMT
Server Apache
Vary Accept-Encoding
什么是gzip,开启gzip的好处。
开启方法如下:
1. httpd.conf中打开deflate_Module和headers_Module模块 VickieXu
2. httpd.conf中添加: Vickie博客
首先查看apache是否加载了mod_deflate.so模块,如果没有需要安装加载。找到并下载和当前apache版本相同的源码文件,解压缩到/home目录下,在apache安装目录下执行:
/usr/local/apache2/bin/apxs -i -c /home/httpd-2.0.63/modules/filters/mod_deflate.
会自动在 httpd.conf添加
LoadModule deflate_module modules/mod_deflate.so
/usr/local/httpd-2.2.10/bin/apachectl restart
httpd: Syntax error on line 254 of /usr/local/httpd-2.2.10/conf/httpd.conf: module deflate_module is built-in and can't be loaded
解决方案:出现这个情况,表明deflate_module模块是内建的,不用再调入,所以只需要把LoadModule *** 注释就可以了
Egg:
/usr/local/httpd-2.2.10/bin/apxs -i -c /tmp/httpd-rebuild/httpd-2.2.10/modules/filters/mod_deflate.c
chmod 755 /usr/local/httpd-2.2.10/modules/mod_deflate.so
怎么知道开启了Gzip呢?用Httpwatcher或者FireBug抓包如下:
Content-Encoding gzip 这个即是。
响应头信息原始头信息
Accept-Ranges bytes
Connection close
Content-Encoding gzip
Content-Length 892
Content-Type text/html; charset=GB2312
Date Fri, 13 Jul 2012 12:02:08 GMT
Server Apache
Vary Accept-Encoding
CentOS 6.3 发布 附ISO下载地址:
http://cnbeta.com/articles/196464.htm
7月全球Web服务器市场:Apache份额下滑 Nginx上涨:
http://cnbeta.com/articles/196487.htm
http://cnbeta.com/articles/196464.htm
7月全球Web服务器市场:Apache份额下滑 Nginx上涨:
http://cnbeta.com/articles/196487.htm
防护软件QQ电脑管家提示系统关键项目启动慢,于是找了一下网上的,如下优化:
内容太多了,建议下个优化大师优化一下,默认优化下,这种情况主要是系统的一些外部的设备,如Usb,硬盘等的驱动等待时间,导致系统慢,如果要想快,建议加上固态硬盘,关闭Usb等一系列的外部设备,重新安装全新的Xp系统,这样会有明显的改善,而如果是长时间运行了很久的系统,按下面的方法,未必有效果,但还是贴出来供大家参考一下,如下:阅读全文
内容太多了,建议下个优化大师优化一下,默认优化下,这种情况主要是系统的一些外部的设备,如Usb,硬盘等的驱动等待时间,导致系统慢,如果要想快,建议加上固态硬盘,关闭Usb等一系列的外部设备,重新安装全新的Xp系统,这样会有明显的改善,而如果是长时间运行了很久的系统,按下面的方法,未必有效果,但还是贴出来供大家参考一下,如下:阅读全文
[PHP] date("G") don't work
Php/Js/Shell/Go jackxiang 2012-7-7 18:53
on this host the function 'date("g")' don't work properly. Now, the function should return 13, but return 7. It has a delay of 6 hours.
Someone can help me?
It probably gets the server timezone, GMT -8
Would setting time zone work in one of your global configuration files?
For example setting time zone to Brisbane, Australia
PHP Code:
Someone can help me?
It probably gets the server timezone, GMT -8
Would setting time zone work in one of your global configuration files?
For example setting time zone to Brisbane, Australia
PHP Code:
http://www.cnblogs.com/in-loading/archive/2012/04/11/2442697.html
http://code.google.com/p/phpquery
发现已经有人做的相当完备了
http://stackoverflow.com/questions/260605/php-css-selector-library
----------------------------------------------------------------------------------------------
JQuery是一个非常著名的JS框架,提供了对DOM文档的完整操作。这个文档处理利器现在终于有了PHP版,也就是说可以使用php操作 HTML或者XML文档,遍历文档的节点,很轻松的取出,填充节点内容。或者简单来说,除了js的事件响应部分,其余的几乎都可以用php来实现。php 对数据处理的能力显然要比JS强大很多,对不熟悉JS的同学来说,phpQuery是个非常强大的帮手。如果了解了phpQuery,那么就很容易理解其 实phpQuery也可以取代一部分Smarty的功能。
我刚刚开始学习使用phpQuery,这应该算一篇学习笔记,我会努力将其向手册风格靠拢,不过不会做成中文手册,仍然会加入我在使用过程中遇到的问题以及解决方案。
开始phpQuery
参考资料:phpQuery JQuery
phpQuery从编程思想到语言风格都是参照JQuery来做的,所以熟悉JQuery的人可以随时对照参考JQuery手册,方便理解。
phpQuery应用举例:
require(’phpQuery/phpQuery.php’);
$file = file_get_contents(”test_phpQuery.html”);
$dom = phpQuery::newDocument($file); //初始化对象
echo pq(”head > title”)->text(); //输出文档title
pq这个全局函数类似于JQuery中的$()符号,用于执行请求,或者遍历DOM节点。
例子中的”head > title”就是一个选择请求,选择head标签下的title子标签。
pq(”li”); //选择所有文档中的li标签
foreach(pq(”li”) as $item)
=======================================================================
这篇文章主要介绍了phpQuery让php处理html代码像jQuery一样方便,需要的朋友可以参考下
简介
如何在php中方便地解析html代码,估计是每个phper都会遇到的问题。用phpQuery就可以让php处理html代码像jQuery一样方便。
项目地址:https://code.google.com/p/phpquery/
github地址:https://github.com/TobiaszCudnik/phpquery
DEMO
下载库文件:https://code.google.com/p/phpquery/downloads/list
我下的是onefile版:phpQuery-0.9.5.386-onefile.zip
官方demo:https://code.google.com/p/phpquery/source/browse/branches/dev/demo.php
然后在项目中引用。
html文件test.html:
上面的代码中包含了取属性和innerText内容(通过nodeValue取)。
输出:
复制代码代码如下:
array (size=3)
'name' =>
array (size=2)
0 => string 'Spiderman City Drive' (length=20)
1 => string 'Spiderman - City Raid' (length=21)
'href' =>
array (size=2)
0 => string 'http://www.gahe.com/Spiderman-City-Drive' (length=40)
1 => string 'http://www.gahe.com/Spiderman-City-Raid' (length=39)
'img' =>
array (size=2)
0 => string 'http://www.gahe.com/thumb/12/Spiderman-City-Drive.jpg' (length=53)
1 => string 'http://www.gahe.com/thumb/12/Spiderman-City-Raid.jpg' (length=52)
强大的是pq选择器,语法类似jQuery,很方便。
来自:http://www.aspku.com/kaifa/php/46348.html
更多参考:
http://www.cnblogs.com/rmbteam/archive/2011/11/05/2236986.html
实践示例:http://querylist.cc/article/9
http://code.google.com/p/phpquery
发现已经有人做的相当完备了
http://stackoverflow.com/questions/260605/php-css-selector-library
----------------------------------------------------------------------------------------------
JQuery是一个非常著名的JS框架,提供了对DOM文档的完整操作。这个文档处理利器现在终于有了PHP版,也就是说可以使用php操作 HTML或者XML文档,遍历文档的节点,很轻松的取出,填充节点内容。或者简单来说,除了js的事件响应部分,其余的几乎都可以用php来实现。php 对数据处理的能力显然要比JS强大很多,对不熟悉JS的同学来说,phpQuery是个非常强大的帮手。如果了解了phpQuery,那么就很容易理解其 实phpQuery也可以取代一部分Smarty的功能。
我刚刚开始学习使用phpQuery,这应该算一篇学习笔记,我会努力将其向手册风格靠拢,不过不会做成中文手册,仍然会加入我在使用过程中遇到的问题以及解决方案。
开始phpQuery
参考资料:phpQuery JQuery
phpQuery从编程思想到语言风格都是参照JQuery来做的,所以熟悉JQuery的人可以随时对照参考JQuery手册,方便理解。
phpQuery应用举例:
require(’phpQuery/phpQuery.php’);
$file = file_get_contents(”test_phpQuery.html”);
$dom = phpQuery::newDocument($file); //初始化对象
echo pq(”head > title”)->text(); //输出文档title
pq这个全局函数类似于JQuery中的$()符号,用于执行请求,或者遍历DOM节点。
例子中的”head > title”就是一个选择请求,选择head标签下的title子标签。
pq(”li”); //选择所有文档中的li标签
foreach(pq(”li”) as $item)
=======================================================================
这篇文章主要介绍了phpQuery让php处理html代码像jQuery一样方便,需要的朋友可以参考下
简介
如何在php中方便地解析html代码,估计是每个phper都会遇到的问题。用phpQuery就可以让php处理html代码像jQuery一样方便。
项目地址:https://code.google.com/p/phpquery/
github地址:https://github.com/TobiaszCudnik/phpquery
DEMO
下载库文件:https://code.google.com/p/phpquery/downloads/list
我下的是onefile版:phpQuery-0.9.5.386-onefile.zip
官方demo:https://code.google.com/p/phpquery/source/browse/branches/dev/demo.php
然后在项目中引用。
html文件test.html:
上面的代码中包含了取属性和innerText内容(通过nodeValue取)。
输出:
复制代码代码如下:
array (size=3)
'name' =>
array (size=2)
0 => string 'Spiderman City Drive' (length=20)
1 => string 'Spiderman - City Raid' (length=21)
'href' =>
array (size=2)
0 => string 'http://www.gahe.com/Spiderman-City-Drive' (length=40)
1 => string 'http://www.gahe.com/Spiderman-City-Raid' (length=39)
'img' =>
array (size=2)
0 => string 'http://www.gahe.com/thumb/12/Spiderman-City-Drive.jpg' (length=53)
1 => string 'http://www.gahe.com/thumb/12/Spiderman-City-Raid.jpg' (length=52)
强大的是pq选择器,语法类似jQuery,很方便。
来自:http://www.aspku.com/kaifa/php/46348.html
更多参考:
http://www.cnblogs.com/rmbteam/archive/2011/11/05/2236986.html
实践示例:http://querylist.cc/article/9
背景:调一个多进程程序,发现中间挂了,可我自己写的代码的父亲进程又拉起来了,无法调试到挂的原因,在当前目录下找不到coredump文件怎么办?修改Linux操作系统生成core dump文件的默认路径?最后,子进程死了父亲进程拉起,crack这块可能是return退出了,自己打印是crack,导致并不是真正的crack了,也就不是coredump了,特别注意这个问题。
gdb --core=core.9128
(gdb) file ./a.out
巡视:再看看默认的一些参数,注意core file size是个0,程序出错时不会产生core文件了, 如下:
[root@test log]# ulimit -a
core file size (blocks, -c) 0
实践:没有找到core文件,我们改改ulimit的设置,让它产生。1024是随便取的,要是core文件大于1024个块,就产生不出来了。
$ ulimit -c 1024
$ ulimit -a
core file size (blocks, -c) 1024
ulimit -S -c unlimited > /dev/null 2>&1
[root@test multepoolserver]# ulimit -c 1024
[root@test multepoolserver]# ulimit -a
core file size (blocks, -c) 1024
修改路径:
/sbin/sysctl -w kernel.core_pattern=/var/log/%e.core.%p
kernel.core_pattern = /var/log/%e.core.%p
————————————————————————————————————————————————————————————————
经过分析发现系统默认的core文件生成路径是/var/logs,但/var/logs目录并非系统自带的,系统初始安装默认自带的是/var/log,最终导致该系统出现core dump后并没能生成core文件,因此如何查询和修改系统默认的core dump文件生产路径呢?方法如下:
一. 查询core dump文件路径:
方法1:
# cat /proc/sys/kernel/core_pattern
方法2:
# /sbin/sysctl kernel.core_pattern
二. 修改core dump文件路径:
方法1:
临时修改:修改/proc/sys/kernel/core_pattern文件,但/proc目录本身是动态加载的,每次系统重启都会重新加载,因此这种方法只能作为临时修改。
/proc/sys/kernel/core_pattern
例:echo ‘/var/log/%e.core.%p’ > /proc/sys/kernel/core_pattern
方法2:
永久修改:使用sysctl -w name=value命令。
例:/sbin/sysctl -w kernel.core_pattern=/var/log/%e.core.%p为了更详尽的记录core dump当时的系统状态,可通过以下参数来丰富core文件的命名:
%% 单个%字符
摘自:http://m.blog.csdn.net/blog/bytxl/9786347
http://www.nginx.cn/1521.html
Linux CentOs6.2下下如何生成core dump文件及用GDB调试方法及设置
http://baidutech.blog.51cto.com/4114344/904419
在软件开发的过程中,无论如何努力,bug几乎都是必不可少的。当某些bug发生时,该进程会产生coredump文件。通过这个coredump文件,开发人员可以找到bug的原因。但是coredump的产生,大都是因为程序crash了。
1. 死锁
有些bug是不会导致进程crash的,比如死锁——这时,程序已经不正常了,可是却没有coredump产生。如果环境又不允许gdb调试,难道我们就束手无策了吗?针对这种情况,一般情况下,对于这样的进程,可以利用watchdog监控它们,当发现这些进程很长时间没有更新其heartbeat时,可以给这些进程发送可以导致其产生coredump的信号。根据linux的信号默认的处理行为,SIGQUIT,SIGABRT, SIGFPE和SIGSEGV都可以让该进程产生coredump文件。这样我们可以通过coredump来得知死锁是否发生。当然,如果进程添加了这些信号的处理函数,那么就不会产生coredump了。
2.获取指定位置快照:
还有一种情况,进程并没有死锁或者block在某个位置,但是我们需要在某个指定位置进行调试,获取某些变量或者其它信息。但是,有可能是客户环境或者生产环境,不允许我们进行长时间的检测。那么,我们就需要通过coredump来获得进程在运行到该点时的快照。
这个时候,可以利用gdb来产生手工产生coredump。在attach上这个进程时,在指定位置打上断点,当断点触发时,使用gdb的命令gcore,可以立即产生一个coredump。这样,我们就拿到了这个位置的进程快照。1. 欲查看多线程程序中所有线程的调用栈信息====================================
gdb attach xxx
set height 0
thread apply all bt
detach
q
2. CPU占用率过高问题分析方法
====================================
shell下执行:ps -eLfP 找出cpu占用率高的线程
UID PID PPID LWP PSR C NLWP STIME TTY TIME
root 1431 1270 1751 5 90 64 Dec24 ? 00:00:00
^^^^ ^^ ^^
thread core cpurate
使用gdb:
gdb attach 1431 <==== 登录cpu占用率高的进程
set height 0
i thread <==== 打印该进程的所有线程
找到 : LWP 1751 线程
17 Thread 855356656 (LWP 1751) 0x2ac30994 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib/libpthread.so.0
^^ ^^^^^^^^
打出cpu占用率高的 任务的调用栈:
thread 17 <============ 切换到该线�
Linux生成core文件、core文件路径设置:
——————————————————————————————————————————————————————————————
在Linux下产生并调试core文件 先看看我用的是个什么机器:
$ uname -a
Linux dev 2.4.21-9.30AXsmp #1 SMP Wed May 26 23:37:09 EDT 2004 i686 i686 i386 GNU/Linux
再看看默认的一些参数,注意core file size是个0,程序出错时不会产生core文件了。
$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
max locked memory (kbytes, -l) 4
max memory size (kbytes, -m) unlimited
open files (-n) 2048
pipe size (512 bytes, -p) 8
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 7168
virtual memory (kbytes, -v) unlimited
写个简单的程序,看看core文件是不是会被产生。
$ more foo.c
#include <stdio.h>
static void sub(void);
int main(void)
{
sub();
return 0;
}
static void sub(void)
{
int *p = NULL;
/* derefernce a null pointer, expect core dump. */
printf("%d", *p);
}
$ gcc -Wall -g foo.c
$ ./a.out
Segmentation fault
$ ls -l core.*
ls: core.*: No such file or directory
没有找到core文件,我们改改ulimit的设置,让它产生。1024是随便取的,要是core文件大于1024个块,就产生不出来了。
$ ulimit -c 1024
$ ulimit -a
core file size (blocks, -c) 1024
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
max locked memory (kbytes, -l) 4
max memory size (kbytes, -m) unlimited
open files (-n) 2048
pipe size (512 bytes, -p) 8
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 7168
virtual memory (kbytes, -v) unlimited
$ ./a.out
Segmentation fault (core dumped)
$ ls -l core.*
-rw------- 1 uniware uniware 53248 Jun 30 17:10 core.9128
注意看上述的输出信息,多了个(core dumped)。确实产生了一个core文件,9128是该进程的PID。我们用GDB来看看这个core。
$ gdb --core=core.9128
GNU gdb Asianux (6.0post-0.20040223.17.1AX)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-asianux-linux-gnu".
Core was generated by `./a.out'.
Program terminated with signal 11, Segmentation fault.
#0 0x08048373 in ?? ()
(gdb) bt
#0 0x08048373 in ?? ()
#1 0xbfffd8f8 in ?? ()
#2 0x0804839e in ?? ()
#3 0xb74cc6b3 in ?? ()
#4 0x00000000 in ?? ()
此时用bt看不到backtrace,也就是调用堆栈,原来GDB还不知道符号信息在哪里。我们告诉它一下:
(gdb) file ./a.out
Reading symbols from ./a.out...done.
Using host libthread_db library "/lib/tls/libthread_db.so.1".
(gdb) bt
#0 0x08048373 in sub () at foo.c:17
#1 0x08048359 in main () at foo.c:8
此时backtrace出来了。
(gdb) l
8 sub();
9 return 0;
10 }
11
12 static void sub(void)
13 {
14 int *p = NULL;
15
16 /* derefernce a null pointer, expect core dump. */
17 printf("%d", *p);
(gdb)
在程序不寻常退出时,内核会在当前工作目录下生成一个core文件(是一个内存映像,同时加上调试信息)。使用gdb来查看core文件,可以指示出导致程序出错的代码所在文件和行数。
1.core文件的生成开关和大小限制
---------------------------------
1)使用ulimit -c命令可查看core文件的生成开关。若结果为0,则表示关闭了此功能,不会生成core文件。
2)使用ulimit -c filesize命令,可以限制core文件的大小(filesize的单位为kbyte)。若ulimit -c unlimited,则表示core文件的大小不受限制。如果生成的信息超过此大小,将会被裁剪,最终生成一个不完整的core文件。在调试此core文件的时候,gdb会提示错误。
2.core文件的名称和生成路径
----------------------------
core文件生成路径:
输入可执行文件运行命令的同一路径下。
若系统生成的core文件不带其他任何扩展名称,则全部命名为core。新的core文件生成将覆盖原来的core文件。
1)/proc/sys/kernel/core_uses_pid可以控制core文件的文件名中是否添加pid作为扩展。文件内容为1,表示添加pid作为扩展名,生成的core文件格式为core.xxxx;为0则表示生成的core文件同一命名为core。
可通过以下命令修改此文件:
echo "1" > /proc/sys/kernel/core_uses_pid
2)proc/sys/kernel/core_pattern可以控制core文件保存位置和文件名格式。
可通过以下命令修改此文件:
echo "/corefile/core-%e-%p-%t" > core_pattern,可以将core文件统一生成到/corefile目录下,产生的文件名为core-命令名-pid-时间戳
以下是参数列表:
%p - insert pid into filename 添加pid
%u - insert current uid into filename 添加当前uid
%g - insert current gid into filename 添加当前gid
%s - insert signal that caused the coredump into the filename 添加导致产生core的信号
%t - insert UNIX time that the coredump occurred into filename 添加core文件生成时的unix时间
%h - insert hostname where the coredump happened into filename 添加主机名
%e - insert coredumping executable name into filename 添加命令名
3.core文件的查看
-----------------
core文件需要使用gdb来查看。
gdb ./a.out
core-file core.xxxx
使用bt命令即可看到程序出错的地方。
以下两种命令方式具有相同的效果,但是在有些环境下不生效,所以推荐使用上面的命令。
1)gdb -core=core.xxxx
file ./a.out
bt
2)gdb -c core.xxxx
file ./a.out
bt
4.开发板上使用core文件调试
-----------------------------
如果开发板的操作系统也是linux,core调试方法依然适用。如果开发板上不支持gdb,可将开发板的环境(依赖库)、可执行文件和core文件拷贝到PC的linux下。
在 PC上调试开发板上产生的core文件,需要使用交叉编译器自带的gdb,并且需要在gdb中指定solib-absolute-prefix和 solib-search-path两个变量以保证gdb能够找到可执行程序的依赖库路径。有一种建立配置文件的方法,不需要每次启动gdb都配置以上变量,即:在待运行gdb的路径下建立.gdbinit。
配置文件内容:
set solib-absolute-prefix YOUR_CROSS_COMPILE_PATH
set solib-search-path YOUR_CROSS_COMPILE_PATH
set solib-search-path YOUR_DEVELOPER_TOOLS_LIB_PATH
handle SIG32 nostop noprint pass
来自:http://www.nginx.cn/1521.html
gdb --core=core.9128
(gdb) file ./a.out
巡视:再看看默认的一些参数,注意core file size是个0,程序出错时不会产生core文件了, 如下:
[root@test log]# ulimit -a
core file size (blocks, -c) 0
实践:没有找到core文件,我们改改ulimit的设置,让它产生。1024是随便取的,要是core文件大于1024个块,就产生不出来了。
$ ulimit -c 1024
$ ulimit -a
core file size (blocks, -c) 1024
ulimit -S -c unlimited > /dev/null 2>&1
[root@test multepoolserver]# ulimit -c 1024
[root@test multepoolserver]# ulimit -a
core file size (blocks, -c) 1024
修改路径:
/sbin/sysctl -w kernel.core_pattern=/var/log/%e.core.%p
kernel.core_pattern = /var/log/%e.core.%p
————————————————————————————————————————————————————————————————
经过分析发现系统默认的core文件生成路径是/var/logs,但/var/logs目录并非系统自带的,系统初始安装默认自带的是/var/log,最终导致该系统出现core dump后并没能生成core文件,因此如何查询和修改系统默认的core dump文件生产路径呢?方法如下:
一. 查询core dump文件路径:
方法1:
# cat /proc/sys/kernel/core_pattern
方法2:
# /sbin/sysctl kernel.core_pattern
二. 修改core dump文件路径:
方法1:
临时修改:修改/proc/sys/kernel/core_pattern文件,但/proc目录本身是动态加载的,每次系统重启都会重新加载,因此这种方法只能作为临时修改。
/proc/sys/kernel/core_pattern
例:echo ‘/var/log/%e.core.%p’ > /proc/sys/kernel/core_pattern
方法2:
永久修改:使用sysctl -w name=value命令。
例:/sbin/sysctl -w kernel.core_pattern=/var/log/%e.core.%p为了更详尽的记录core dump当时的系统状态,可通过以下参数来丰富core文件的命名:
%% 单个%字符
摘自:http://m.blog.csdn.net/blog/bytxl/9786347
http://www.nginx.cn/1521.html
Linux CentOs6.2下下如何生成core dump文件及用GDB调试方法及设置
http://baidutech.blog.51cto.com/4114344/904419
在软件开发的过程中,无论如何努力,bug几乎都是必不可少的。当某些bug发生时,该进程会产生coredump文件。通过这个coredump文件,开发人员可以找到bug的原因。但是coredump的产生,大都是因为程序crash了。
1. 死锁
有些bug是不会导致进程crash的,比如死锁——这时,程序已经不正常了,可是却没有coredump产生。如果环境又不允许gdb调试,难道我们就束手无策了吗?针对这种情况,一般情况下,对于这样的进程,可以利用watchdog监控它们,当发现这些进程很长时间没有更新其heartbeat时,可以给这些进程发送可以导致其产生coredump的信号。根据linux的信号默认的处理行为,SIGQUIT,SIGABRT, SIGFPE和SIGSEGV都可以让该进程产生coredump文件。这样我们可以通过coredump来得知死锁是否发生。当然,如果进程添加了这些信号的处理函数,那么就不会产生coredump了。
2.获取指定位置快照:
还有一种情况,进程并没有死锁或者block在某个位置,但是我们需要在某个指定位置进行调试,获取某些变量或者其它信息。但是,有可能是客户环境或者生产环境,不允许我们进行长时间的检测。那么,我们就需要通过coredump来获得进程在运行到该点时的快照。
这个时候,可以利用gdb来产生手工产生coredump。在attach上这个进程时,在指定位置打上断点,当断点触发时,使用gdb的命令gcore,可以立即产生一个coredump。这样,我们就拿到了这个位置的进程快照。1. 欲查看多线程程序中所有线程的调用栈信息====================================
gdb attach xxx
set height 0
thread apply all bt
detach
q
2. CPU占用率过高问题分析方法
====================================
shell下执行:ps -eLfP 找出cpu占用率高的线程
UID PID PPID LWP PSR C NLWP STIME TTY TIME
root 1431 1270 1751 5 90 64 Dec24 ? 00:00:00
^^^^ ^^ ^^
thread core cpurate
使用gdb:
gdb attach 1431 <==== 登录cpu占用率高的进程
set height 0
i thread <==== 打印该进程的所有线程
找到 : LWP 1751 线程
17 Thread 855356656 (LWP 1751) 0x2ac30994 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib/libpthread.so.0
^^ ^^^^^^^^
打出cpu占用率高的 任务的调用栈:
thread 17 <============ 切换到该线�
Linux生成core文件、core文件路径设置:
——————————————————————————————————————————————————————————————
在Linux下产生并调试core文件 先看看我用的是个什么机器:
$ uname -a
Linux dev 2.4.21-9.30AXsmp #1 SMP Wed May 26 23:37:09 EDT 2004 i686 i686 i386 GNU/Linux
再看看默认的一些参数,注意core file size是个0,程序出错时不会产生core文件了。
$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
max locked memory (kbytes, -l) 4
max memory size (kbytes, -m) unlimited
open files (-n) 2048
pipe size (512 bytes, -p) 8
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 7168
virtual memory (kbytes, -v) unlimited
写个简单的程序,看看core文件是不是会被产生。
$ more foo.c
#include <stdio.h>
static void sub(void);
int main(void)
{
sub();
return 0;
}
static void sub(void)
{
int *p = NULL;
/* derefernce a null pointer, expect core dump. */
printf("%d", *p);
}
$ gcc -Wall -g foo.c
$ ./a.out
Segmentation fault
$ ls -l core.*
ls: core.*: No such file or directory
没有找到core文件,我们改改ulimit的设置,让它产生。1024是随便取的,要是core文件大于1024个块,就产生不出来了。
$ ulimit -c 1024
$ ulimit -a
core file size (blocks, -c) 1024
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
max locked memory (kbytes, -l) 4
max memory size (kbytes, -m) unlimited
open files (-n) 2048
pipe size (512 bytes, -p) 8
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 7168
virtual memory (kbytes, -v) unlimited
$ ./a.out
Segmentation fault (core dumped)
$ ls -l core.*
-rw------- 1 uniware uniware 53248 Jun 30 17:10 core.9128
注意看上述的输出信息,多了个(core dumped)。确实产生了一个core文件,9128是该进程的PID。我们用GDB来看看这个core。
$ gdb --core=core.9128
GNU gdb Asianux (6.0post-0.20040223.17.1AX)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-asianux-linux-gnu".
Core was generated by `./a.out'.
Program terminated with signal 11, Segmentation fault.
#0 0x08048373 in ?? ()
(gdb) bt
#0 0x08048373 in ?? ()
#1 0xbfffd8f8 in ?? ()
#2 0x0804839e in ?? ()
#3 0xb74cc6b3 in ?? ()
#4 0x00000000 in ?? ()
此时用bt看不到backtrace,也就是调用堆栈,原来GDB还不知道符号信息在哪里。我们告诉它一下:
(gdb) file ./a.out
Reading symbols from ./a.out...done.
Using host libthread_db library "/lib/tls/libthread_db.so.1".
(gdb) bt
#0 0x08048373 in sub () at foo.c:17
#1 0x08048359 in main () at foo.c:8
此时backtrace出来了。
(gdb) l
8 sub();
9 return 0;
10 }
11
12 static void sub(void)
13 {
14 int *p = NULL;
15
16 /* derefernce a null pointer, expect core dump. */
17 printf("%d", *p);
(gdb)
在程序不寻常退出时,内核会在当前工作目录下生成一个core文件(是一个内存映像,同时加上调试信息)。使用gdb来查看core文件,可以指示出导致程序出错的代码所在文件和行数。
1.core文件的生成开关和大小限制
---------------------------------
1)使用ulimit -c命令可查看core文件的生成开关。若结果为0,则表示关闭了此功能,不会生成core文件。
2)使用ulimit -c filesize命令,可以限制core文件的大小(filesize的单位为kbyte)。若ulimit -c unlimited,则表示core文件的大小不受限制。如果生成的信息超过此大小,将会被裁剪,最终生成一个不完整的core文件。在调试此core文件的时候,gdb会提示错误。
2.core文件的名称和生成路径
----------------------------
core文件生成路径:
输入可执行文件运行命令的同一路径下。
若系统生成的core文件不带其他任何扩展名称,则全部命名为core。新的core文件生成将覆盖原来的core文件。
1)/proc/sys/kernel/core_uses_pid可以控制core文件的文件名中是否添加pid作为扩展。文件内容为1,表示添加pid作为扩展名,生成的core文件格式为core.xxxx;为0则表示生成的core文件同一命名为core。
可通过以下命令修改此文件:
echo "1" > /proc/sys/kernel/core_uses_pid
2)proc/sys/kernel/core_pattern可以控制core文件保存位置和文件名格式。
可通过以下命令修改此文件:
echo "/corefile/core-%e-%p-%t" > core_pattern,可以将core文件统一生成到/corefile目录下,产生的文件名为core-命令名-pid-时间戳
以下是参数列表:
%p - insert pid into filename 添加pid
%u - insert current uid into filename 添加当前uid
%g - insert current gid into filename 添加当前gid
%s - insert signal that caused the coredump into the filename 添加导致产生core的信号
%t - insert UNIX time that the coredump occurred into filename 添加core文件生成时的unix时间
%h - insert hostname where the coredump happened into filename 添加主机名
%e - insert coredumping executable name into filename 添加命令名
3.core文件的查看
-----------------
core文件需要使用gdb来查看。
gdb ./a.out
core-file core.xxxx
使用bt命令即可看到程序出错的地方。
以下两种命令方式具有相同的效果,但是在有些环境下不生效,所以推荐使用上面的命令。
1)gdb -core=core.xxxx
file ./a.out
bt
2)gdb -c core.xxxx
file ./a.out
bt
4.开发板上使用core文件调试
-----------------------------
如果开发板的操作系统也是linux,core调试方法依然适用。如果开发板上不支持gdb,可将开发板的环境(依赖库)、可执行文件和core文件拷贝到PC的linux下。
在 PC上调试开发板上产生的core文件,需要使用交叉编译器自带的gdb,并且需要在gdb中指定solib-absolute-prefix和 solib-search-path两个变量以保证gdb能够找到可执行程序的依赖库路径。有一种建立配置文件的方法,不需要每次启动gdb都配置以上变量,即:在待运行gdb的路径下建立.gdbinit。
配置文件内容:
set solib-absolute-prefix YOUR_CROSS_COMPILE_PATH
set solib-search-path YOUR_CROSS_COMPILE_PATH
set solib-search-path YOUR_DEVELOPER_TOOLS_LIB_PATH
handle SIG32 nostop noprint pass
来自:http://www.nginx.cn/1521.html
奇妙的Apache 2.x mod_xsendfile
Php/Js/Shell/Go jackxiang 2012-7-4 21:19
日常应用中,我们经常会在php里面用到基于文件系统直接输出一个文件的方法,例如:阅读全文
ctags 插件 E433:No tags file tag not found:的问题
Php/Js/Shell/Go jackxiang 2012-7-3 19:01
想对Php代码作跳转,其实有一个叫openctags的插件生成一个openctags.tags的,可以用在Editplust里,跳转还不错。
我在Linux的生产环境下,执行:
如果是openctags则直接也可以在vim里命令行设定:
找到了 ctags 中文手册:
使用 ctags 命令生成 tags 文件 (我生成了 VS 的整个 Solution)
使用 vi 能够找到生成的 tags 文件(修改 _vimrc 文件,增加 set tags=文件完整路径,就可以找到生成的文件了)
使用 CTRL + ] 或 CTRL + T 就可以跳转了(可以在方法间跳转,无法转到变量的定义处)
我在Linux的生产环境下,执行:
如果是openctags则直接也可以在vim里命令行设定:
找到了 ctags 中文手册:
使用 ctags 命令生成 tags 文件 (我生成了 VS 的整个 Solution)
使用 vi 能够找到生成的 tags 文件(修改 _vimrc 文件,增加 set tags=文件完整路径,就可以找到生成的文件了)
使用 CTRL + ] 或 CTRL + T 就可以跳转了(可以在方法间跳转,无法转到变量的定义处)
PHP 和 Java 比最大的优势是什么?
Php/Js/Shell/Go jackxiang 2012-7-1 14:59
这一篇文章还以为是一个真正的比较,后来加了一个Url:Swoole-真正的PHP Web开发框架,大概了解了一下,感觉还是不错的,这个框架的思想以实用,借鉴,不落后,不争先,集成事件,服务等。。。阅读全文
PHP Dio扩展新函数dio_fdopen参数返回--bad file descriptor的分析:
昨天准备做一个程序,PHP的串口扩展程序,用来做串口打开的,于是用dio_fdopen来新建一个文件:
每个打开的文件都会被分配一个文件描述符.[1]stdin, stdout, 和stderr的文件描述符分别是0, 1, 和 2. 对于正在打开的额外文件, 保留了描述符3到9. 在某些时候将这些格外的文件描述符分配给stdin, stdout, 或者是stderr作为临时的副本链接是非常有用的.
返回:Bad file descriptor。
查看PHP扩展的源代码,如下:
PHP的最新扩展:dio_open代码片段摘录。
返回错误在这一块,如下:
这儿涉及到fcntl函数的调用返回有问题,查其相关参数:
F_GETFL : 用来读取open系统调用第二个参数设置的标志,即文件的打开方式(O_RDONLY,O_WRONLY,O_APPEND等),它不需要第三个参数。实际上上这时函数返回的是file结构中的flags域。
其相当于只是创建了一个文件,并未确定这个文件的状态。在C里会补上一个 O_RDWR,
fd = open ("hole", O_CREAT, S_IRWXU | S_IRWXG) ;
变为:
fd = open ("hole", O_CREAT | O_RDWR, S_IRWXU | S_IRWXG) ;
fcntl这个系统调用功能比较多,可以执行多种操作,其内核函数在fs/fcntl.c中定义:
1.入口参数:
(1)fd:欲访问文件的文件描述符
(2)cmd:要执行的操作的命令,这个参数定义了10个标志,下面介绍其中的5个,
F_DUPFD、F_GETFD、F_SETFD、F_GETFL和 F_SETFL
(3)arg:可选,主要根据第二个命令来决定是否需要
2.出口参数:根据第二个参数的不同,这个返回值也不一样。
3.函数功能:
第二个参数是F_DUPFD,则进行复制文件描述符的操作。它需要用到第三个参数arg,这时arg是一个文件描述符,fcntl(fd,F_DUPFD,arg)在files_struct结构中从指定的arg开始搜索空闲的文件描述符,找到第一个后,将fd的内容复制进来,然后将新找到的文件描述符返回。
第二个参数是F_GETFD,则返回files_struct结构中close_on_exec的值。无需第三个参数。
第二个参数是F_SETFD,则需要第三个参数,若arg最低位为1,则对close_on_exec置位,否则清除close_on_exec。
第二个参数是F_GETFL,则用来读取open系统调用第二个参数设置的标志,即文件的打开方式(O_RDONLY,O_WRONLY,O_APPEND等),它不需要第三个参数。实际上上这时函数返回的是file结构中的flags域。
第二个参数是F_SETFL,则用来对open系统调用第二个参数设置的标志进行改变,但是它只能对O_APPEND和O_NONBLOCK标志进行改变,这时需要第三个参数arg,用来确定如何改变。函数返回0表示操作成功,否则返回-1,并置一个错
这个文件句柄的操作感觉还大有学问在里面,有什么同步,异步等等。
参看:http://blog.csdn.net/wallwind/article/details/7281700
回家了解:
昨天准备做一个程序,PHP的串口扩展程序,用来做串口打开的,于是用dio_fdopen来新建一个文件:
每个打开的文件都会被分配一个文件描述符.[1]stdin, stdout, 和stderr的文件描述符分别是0, 1, 和 2. 对于正在打开的额外文件, 保留了描述符3到9. 在某些时候将这些格外的文件描述符分配给stdin, stdout, 或者是stderr作为临时的副本链接是非常有用的.
返回:Bad file descriptor。
查看PHP扩展的源代码,如下:
PHP的最新扩展:dio_open代码片段摘录。
返回错误在这一块,如下:
这儿涉及到fcntl函数的调用返回有问题,查其相关参数:
F_GETFL : 用来读取open系统调用第二个参数设置的标志,即文件的打开方式(O_RDONLY,O_WRONLY,O_APPEND等),它不需要第三个参数。实际上上这时函数返回的是file结构中的flags域。
其相当于只是创建了一个文件,并未确定这个文件的状态。在C里会补上一个 O_RDWR,
fd = open ("hole", O_CREAT, S_IRWXU | S_IRWXG) ;
变为:
fd = open ("hole", O_CREAT | O_RDWR, S_IRWXU | S_IRWXG) ;
fcntl这个系统调用功能比较多,可以执行多种操作,其内核函数在fs/fcntl.c中定义:
1.入口参数:
(1)fd:欲访问文件的文件描述符
(2)cmd:要执行的操作的命令,这个参数定义了10个标志,下面介绍其中的5个,
F_DUPFD、F_GETFD、F_SETFD、F_GETFL和 F_SETFL
(3)arg:可选,主要根据第二个命令来决定是否需要
2.出口参数:根据第二个参数的不同,这个返回值也不一样。
3.函数功能:
第二个参数是F_DUPFD,则进行复制文件描述符的操作。它需要用到第三个参数arg,这时arg是一个文件描述符,fcntl(fd,F_DUPFD,arg)在files_struct结构中从指定的arg开始搜索空闲的文件描述符,找到第一个后,将fd的内容复制进来,然后将新找到的文件描述符返回。
第二个参数是F_GETFD,则返回files_struct结构中close_on_exec的值。无需第三个参数。
第二个参数是F_SETFD,则需要第三个参数,若arg最低位为1,则对close_on_exec置位,否则清除close_on_exec。
第二个参数是F_GETFL,则用来读取open系统调用第二个参数设置的标志,即文件的打开方式(O_RDONLY,O_WRONLY,O_APPEND等),它不需要第三个参数。实际上上这时函数返回的是file结构中的flags域。
第二个参数是F_SETFL,则用来对open系统调用第二个参数设置的标志进行改变,但是它只能对O_APPEND和O_NONBLOCK标志进行改变,这时需要第三个参数arg,用来确定如何改变。函数返回0表示操作成功,否则返回-1,并置一个错
这个文件句柄的操作感觉还大有学问在里面,有什么同步,异步等等。
参看:http://blog.csdn.net/wallwind/article/details/7281700
回家了解:
php 打印测试技巧
Php/Js/Shell/Go jackxiang 2012-6-30 10:30
点评:值得借鉴其方法,所以转载如下:
以前习惯用 echo,print_r 等方法来测试php输出,这样多多少少会影响到代码的正常运行,现改成“把测试变量输出到文本”的形式,可实现日志形式的调试,代码如下:
主要是用到“File_writefile”函数,对上面的 “File_writefile”函数再包装一下:
应用如下:
输出结果:
来自:http://www.cnblogs.com/xiaochaohuashengmi/archive/2011/12/02/2272161.html
以前习惯用 echo,print_r 等方法来测试php输出,这样多多少少会影响到代码的正常运行,现改成“把测试变量输出到文本”的形式,可实现日志形式的调试,代码如下:
主要是用到“File_writefile”函数,对上面的 “File_writefile”函数再包装一下:
应用如下:
输出结果:
来自:http://www.cnblogs.com/xiaochaohuashengmi/archive/2011/12/02/2272161.html
尝试方法:进入控制面板--程序--程序功能--打开或关闭windows功能--勾选.Net3.5,这个包含了2.0版本。然后等待下载完成即可,这种方法可以解决多数朋友经常遇到的win8程序无响应的问题。
小知识:. NET 是 Microsoft XML Web services 平台。XML Web services 允许应用程序通过 Internet 进行通讯和共享数据,而不管所采用的是哪种操作系统、设备或编程语言。Microsoft .NET 平台提供创建 XML Web services 并将这些服务集成在一起之所需。对个人用户的好处是无缝的、吸引人的体验。
小知识:. NET 是 Microsoft XML Web services 平台。XML Web services 允许应用程序通过 Internet 进行通讯和共享数据,而不管所采用的是哪种操作系统、设备或编程语言。Microsoft .NET 平台提供创建 XML Web services 并将这些服务集成在一起之所需。对个人用户的好处是无缝的、吸引人的体验。
微软免费杀毒软件MSE(Microsoft Security Essentials)当前的最新版本是4.0,日前MSE预发布项目提供了最新版MSE供用户体验测试,新版为MSE 4.1预发布版(具体版本号4.1.204.0),这也意味着MSE 4.1即将发布,想要提前体验MSE 4.1的用户不妨安装此预发布版。
MSE 4.1修复了之前版本中存在的Bug,完善了性能,还包括以下新功能:
— 一键整合的Windows Defender Offline:只需一键,用户就可以轻松地使用Windows Defender Offline删除恶意软件,无需从单独的引导媒体重新启动。
— 云清洁修复:增强恶意软件清理,从云端下载清洁版本从而修复恶意软感染过的系统文件。
— 重新设计的网络防护引擎,提供了更好的防护性、可扩展性和性能;
— 完善启动体验。
MSE 4.1预发布版当前仅提供了英文版本,官方下载:
32位(10.2MB):http://download.microsoft.com/download/2/8/5/2859559A-3A1B-4331-AC88-4F59D789F9B9/mse_x86_prerelease_install.exe
64位(12.5MB):http://download.microsoft.com/download/2/8/5/2859559A-3A1B-4331-AC88-4F59D789F9B9/mse_x64_prerelease_install.exe
MSE 4.1修复了之前版本中存在的Bug,完善了性能,还包括以下新功能:
— 一键整合的Windows Defender Offline:只需一键,用户就可以轻松地使用Windows Defender Offline删除恶意软件,无需从单独的引导媒体重新启动。
— 云清洁修复:增强恶意软件清理,从云端下载清洁版本从而修复恶意软感染过的系统文件。
— 重新设计的网络防护引擎,提供了更好的防护性、可扩展性和性能;
— 完善启动体验。
MSE 4.1预发布版当前仅提供了英文版本,官方下载:
32位(10.2MB):http://download.microsoft.com/download/2/8/5/2859559A-3A1B-4331-AC88-4F59D789F9B9/mse_x86_prerelease_install.exe
64位(12.5MB):http://download.microsoft.com/download/2/8/5/2859559A-3A1B-4331-AC88-4F59D789F9B9/mse_x64_prerelease_install.exe