[显示细节]改变linux终端目录的显示颜色
Unix/LinuxC技术 jackxiang 2013-5-17 16:32
背景:
如何更改linux终端显示颜色?深蓝色的目录背景是黑色,很不爽。
有兄弟有现成的调色请稍给兄弟,如:
PS1='[\[\e[32;40m\]\u@\h \w \t]$ '
类似的,目录Ok的,有现成的兄弟,给个出来。
我在群里问很多朋友,都说我这个目录的颜色有点奇怪,他们的蓝色在黑色下面能看得很清楚,也有兄弟建议说修改SecureCRT里的会话选项-外观-窗口和文本外观-当前颜色方案-选:traditional 点编辑:属性,前景/背景对背景颜色作调整。(但我还是喜欢黑色:超级黑,高级黑无限黑,终极黑,极品黑,宇宙黑),【后来我发现有可能是全局选项,本文后面有这个设置,我设置了下感觉不是很符合要求,目录不知道怎么设置,建议以实践为准。】,找了篇文章,感觉和我的想法差不多,先转了再说,试试还成功了。
我的实践成功步骤如下:
1)vi /etc/DIR_COLORS
DIR 01;34 # directory
定位位置:
FILE 00 # normal file
DIR 01;34 # directory
LINK 01;36 # symbolic link
FIFO 40;33 # pipe
修改为:
DIR 01;36 # directory
2)使改动生效方法:
eval `dircolors /etc/DIR_COLORS` //命令中的`符号为键盘~符号下面的那个
3)登录生效:如果再登录一次,发现它还是蓝色,不是浅蓝,于是得在登录时实现自动运行,如下。
vi ~/.bashrc
立即生效:source ~/.bashrc
附录:
Linux登录终端时显示本机IP地址在前面,一样修改~/.bashrc,在虛尾添加:
linux终端中,目录的显示颜色是蓝色,看起来很是不方便。阅读全文
如何更改linux终端显示颜色?深蓝色的目录背景是黑色,很不爽。
有兄弟有现成的调色请稍给兄弟,如:
PS1='[\[\e[32;40m\]\u@\h \w \t]$ '
类似的,目录Ok的,有现成的兄弟,给个出来。
我在群里问很多朋友,都说我这个目录的颜色有点奇怪,他们的蓝色在黑色下面能看得很清楚,也有兄弟建议说修改SecureCRT里的会话选项-外观-窗口和文本外观-当前颜色方案-选:traditional 点编辑:属性,前景/背景对背景颜色作调整。(但我还是喜欢黑色:超级黑,高级黑无限黑,终极黑,极品黑,宇宙黑),【后来我发现有可能是全局选项,本文后面有这个设置,我设置了下感觉不是很符合要求,目录不知道怎么设置,建议以实践为准。】,找了篇文章,感觉和我的想法差不多,先转了再说,试试还成功了。
我的实践成功步骤如下:
1)vi /etc/DIR_COLORS
DIR 01;34 # directory
定位位置:
FILE 00 # normal file
DIR 01;34 # directory
LINK 01;36 # symbolic link
FIFO 40;33 # pipe
修改为:
DIR 01;36 # directory
2)使改动生效方法:
eval `dircolors /etc/DIR_COLORS` //命令中的`符号为键盘~符号下面的那个
3)登录生效:如果再登录一次,发现它还是蓝色,不是浅蓝,于是得在登录时实现自动运行,如下。
vi ~/.bashrc
立即生效:source ~/.bashrc
附录:
Linux登录终端时显示本机IP地址在前面,一样修改~/.bashrc,在虛尾添加:
linux终端中,目录的显示颜色是蓝色,看起来很是不方便。阅读全文
七夜兄弟的fastcgi blog增强版:
http://bbs.phpchina.com/forum.php?mod=viewthread&tid=200687
了解:
1)升级使用sqlite3的fts3扩展,进行全文检索
2)使用rmmseg进行中文分词
3) drupal文件上传
这个哥们的邮箱:sunjianfei@xiaomi.com
http://bbs.phpchina.com/forum.php?mod=viewthread&tid=249829
http://bbs.phpchina.com/forum.php?mod=viewthread&tid=249829
————————————————————————————————
找这个哥们他从邮箱里回了一个做好的,我没看明白当时为嘛选这些,问了下七夜:Add Time:2014-08-20
1)升级使用sqlite3的fts3扩展,进行全文检索
2)使用rmmseg进行中文分词
3) drupal文件上传
这玩意都是啥,像1) mysql都能直接直持吧?
像二mysql好像也有插件是吧?
像上传为嘛要用drupal来增强呢?
+————————+
有啥考量没?
七夜
14/8/20 星期三 上午 11:07:01
用nginx的上传就行 //是一个Nginx专用的上传模块,https://jackxiang.com/post/6221/ 有介绍。
回忆未来-向东-Jàck 14/8/20 星期三 上午 11:09:01
七夜兄弟说的是那个nginx一个上传插件吧?nginx_upload_module
七夜
14/8/20 星期三 上午 11:09:00
恩是的。nginx模块
上午 11:09:23
回忆未来-向东-Jàck 14/8/20 星期三 上午 11:09:23
我都想用c写一个专门的上传了,啊哈哈。
七夜
14/8/20 星期三 上午 11:09:43
不用。都有现成的
回忆未来-向东-Jàck 14/8/20 星期三 上午 11:10:17
写了一半写不下去了,c功力不够,对那个上传大文件是先放内存还是直接写文件这块涉及到缓存处理上好像有点纠结。
七夜
写磁盘。内存缓存部分
七夜
14/8/20 星期三 上午 11:13:11
写磁盘。内存缓存部分
————————
那是从内存一下写入磁盘,还是要有一个进程来看哪个文件内存放得多就先写呢?
啥也不会
14/8/20 星期三 上午 11:15:07
mmap啊 别的交给系统好了
SQLite的FTS3扩展
FTS3允许用户创建一个全文索引的特殊表,
CREATE VIRTUAL TABLE enrondata1 USING fts3(content TEXT); /* FTS3 table */
CREATE TABLE enrondata2(content TEXT); /* Ordinary table */
使用FTS3效率特别快
SELECT count(*) FROM enrondata1 WHERE content MATCH 'linux'; /* 0.03 seconds */
SELECT count(*) FROM enrondata2 WHERE content LIKE '%linux%'; /* 22.5 seconds */
http://www.cnblogs.com/abob/archive/2010/12/01/1893425.html
2)使用rmmseg进行中文分词:
C语言开源高性能中文分词组件,C语言mmseg中文分词器 《狮子的魂》:https://code.google.com/p/friso/
3) drupal文件上传:http://blog.sina.com.cn/s/blog_a94fd80d01017tkx.html
FastCGI Blog 2.0版本正在开发中,新的版本,将是代码级别的优化,还有一些功能的增强
1. 使用了内存池,提高申请小内存的效率.一个请求一个内存池.这样杜绝了内存泄漏。
2. 自己编写了hashmap、list等实现,减少对第三方lib的依赖
3. 使用配置文件,修改相关配置更加方便
4. 使用功能更为强大的html编辑器,增加后台文件上传功能
5. 代码高亮显示
6. 文章的全文搜索功能.(有时间的话,实现该功能)
http://bbs.chinaunix.net/thread-1790317-3-1.html
C FastCGI Blog 零痛苦一键安装包
自从上次发布了我用写C写的 FastCGI Blog,很多人都说安装不太方便,所以我做了个一键安装包,大家可以零痛苦体验
解开压缩包,执行
./install.sh "/root/local"
/root/local
是安装目录
Nginx转发 spawn-fcgi看护
欢迎测试,欢迎加入
在
七夜开发
的博客基础上进行升级:
1)升级为g++编译,方便整合c++库
2)升级使用sqlite3的fts3扩展,进行全文检索
3)使用rmmseg进行中文分词
目前正在更新:
1) 整理
代码
结构,提供方便的二次开发接口和说明文档
2)添加
文件
上传,实现drupal文件上传的
用户
体验
3)后台
模板
管理
代码还在完善中,请静侯
————————————————————————————————
所有的软件包下载List:
http://code.google.com/p/php-tokyocabinet/downloads/list
C实现的FastCGI Blog:
http://www.fengblog.org/archives/200/
http://blog.sina.com.cn/s/blog_7041f8eb0100nkxe.html
下载完整版的地址:
http://www.pudn.com/downloads426/sourcecode/windows/network/detail1804143.html
七夜博客系统 FastCGI Blog 2.0,自从C-blog1.0发布以来,很多人给了很中肯的意见。这段有时间了,赶紧的把一些大家都需要的功能给开发出来。现在推出c-blog2.0版本.在这个版本里,还没实现全文搜索.在2.1版里会实现全文搜索功能。
这次升级的功能列表:
1. 引入了 配置文件
2. 增加cookie 解析,和文件上传功能
3. html编辑器,换了 更为强大的KindEditor编辑器
4. 支持代码高亮
5. 使用了内存池.统一分配 统一释放,程序更安全
6. 更清晰的 程序目录分类.
(1) db 为 数据库目录
(2) log 为 日志目录
(3) src 为 c-blog源文件目录
(4) htdocs 为 www访问目录.nginx 指到这个目录就行
7. 使用 configure make make install 方式 安装.更为简单
一直想有个自己的blog,就是犯懒不肯code,最近对自己下了狠劲。利用一两个月业余时间完成了这个blog,我还是很有成就感的。哈哈哈。这个blog程序,这几天刚完成。有bug在所难免,欢迎大家提出来,我会不断的维护的。下面我罗列一下这个blog的功能
这个blog采用html template技术, 模板修改起来就跟php的模板一样简单
后台功能
1. 分类管理、添加、删除、编辑(只支持一级分类)
2. 文章管理、添加、删除、编辑
3. 生成静态首页、清除全部静态页缓存
4. 友情链接管理、添加、删除、编辑
5. 评论列表、删除
6. 简单的用户登录和退出
========================================================================================
这个blog 依赖这些 lib
1. FastCGI http://www.fastcgi.com/dist/
2. tokyocabinet http://fallabs.com/tokyocabinet/
DownLoad:http://fallabs.com/kyotocabinet/pkg/
http://fallabs.com/tokyocabinet/pastpkg/tokyocabinet-1.3.27.tar.gz
3. SQLite3 http://www.sqlite.org/download.html
4. jemalloc http://www.canonware.com/download/jemalloc/
下载上述软件,并编译安装.
blog的编译命令是(相关lib路径,根据自己的改,)
gcc -o blog blog.c util.c tpllib.c rbtree.c assign.c ./module/bl
(gdb) set env module=user
(gdb) run
Starting program: /usr/local/htdocs/cblog
[Thread debugging using libthread_db enabled]
[New Thread 0xb7ff0b70 (LWP 5952)]
Location:/
输出:
./src/blog.c: puts("Location:/\r\n\r\n")
/usr/local/webserver/fastcgi/spawn-fcgi/bin/spawn-fcgi -f /usr/local/htdocs/cblog -s /tmp/fcgi-blog.sock
http://blogtest.com/article-read-opensource-15-c-fastcgi-blog-2.0.html
这个是用cgi生成的网页么?怎么访问这个cgi啊?
七夜 下午 02:47:19
article-read-opensource-15-c-fastcgi-blog-2.0.html
article 是访问article 模块
read 是访问article 模块 中的函数
opensource 是分类名
15 是 id
后面 的 都是 seo
url seo
回忆未来-向东-Jàck 下午 02:48:19
你这个有没有url的seo,这个得自己编写?
这个url的seo是不是写在nginx里的?当时。
等会
/panel-user-login.html
后台登录链接的Url及帐号名密码如下:
http://blogtest.com/panel-user-login.html
http://blogtest2.com/panel-user-login.html
用户名:七夜
密码:vilinux
tail -f /data1/logs/access.log
tail -f /data1/logs/nginx_error.log
回忆未来-向东-Jàck 下午 03:09:22
192.168.137.1 - - [03/Jul/2013:15:09:11 +0800] "GET /panel-user-login.html HTTP/1.1" 502 383 "-" "Mozilla/5.0 (Windows NT 6.1; rv:22.0) Gecko/20100101 Firefox/22.0"
七夜 下午 03:09:40
看看error
errlor.log
回忆未来-向东-Jàck 下午 03:10:24
2013/07/03 15:10:14 [crit] 2799#0: *3 connect() to unix:/tmp/fcgi-blog.sock failed (13: Permission denied) while connecting to upstream, client: 192.168.137.1, server: blogtest.com, request: "GET /panel-user-login.html HTTP/1.1", upstream: "fastcgi://unix:/tmp/fcgi-blog.sock:", host: "blogtest.com"
回忆未来-向东-Jàck 下午 03:10:24
2013/07/03 15:10:14 [crit] 2799#0: *3 connect() to unix:/tmp/fcgi-blog.sock failed (13: Permission denied) while connecting to upstream, client: 192.168.137.1, server: blogtest.com, request: "GET /panel-user-login.html HTTP/1.1", upstream: "fastcgi://unix:/tmp/fcgi-blog.sock:", host: "blogtest.com"
七夜 下午 03:11:10
chmod 777
没权限
回忆未来-向东-Jàck 下午 03:11:40
chmod -R 777 /tmp/fcgi-blog.sock
是吧?
可以了,修改了下nginx的配置,如下可以,访问,不知密码是多少:
http://blogtest.com/panel-user-login.html
Ok的Nginx配置如下:
说明通过tail看nginx的日志多么重要:
tail -f /data1/logs/nginx_error.log /data1/logs/access.log
The page you are looking for is temporarily unavailable.
Please try again later.
查看Nginx错误日志:
tail -f /data1/logs/nginx_error.log /data1/logs/access.log
==> /data1/logs/nginx_error.log <==
2013/07/03 18:17:50 [crit] 3728#0: *98 connect() to unix:/tmp/fcgi-blog.sock failed (13: Permission denied) while connecting to upstream, client: 192.168.137.1, server: blogtest.com, request: "GET /panel-user-login.html HTTP/1.1", upstream: "fastcgi://unix:/tmp/fcgi-blog.sock:", host: "blogtest.com"
==> /data1/logs/access.log <==
192.168.137.1 - - [03/Jul/2013:18:17:50 +0800] "GET /panel-user-login.html HTTP/1.1" 502 383 "-" "Mozilla/5.0 (Windows NT 6.1; rv:22.0) Gecko/20100101 Firefox/22.0"
ulimit -c unlimited
./cblog //产生core文件,core.5273
gdb cblog core.5273
----------------------------------
Core was generated by `./cblog'.
Program terminated with signal 11, Segmentation fault.
#0 0x00cab5e7 in tcmapput () from /usr/local/lib/libtokyocabinet.so.7
--------------------------------------------------------------------------------------------------
七夜 下午 05:21:33
不行,你不能这么gdb的
你 log 输出一下
就能知道了
====================================================================================
一)启动fastcgi:
/usr/local/webserver/fastcgi/spawn-fcgi/bin/spawn-fcgi -f /usr/local/htdocs/cblog -s /tmp/fcgi-blog.sock
spawn-fcgi: child spawned successfully: PID: 2251
chmod -R 777 /tmp/fcgi-blog.sock
二)进去后出现:
./templets/panel/category_update.html Error loading template file!
三)调试方法:
root@192.168.137.128:/usr/local/conf# strace -p 2251
Process 2251 attached - interrupt to quit
accept(0, {sa_family=AF_FILE, NULL}, [2]) = 5
select(6, [5], NULL, NULL, {2, 0}) = 1 (in [5], left {1, 999996})
read(5, "\1\1\0\1\0\10\0\0\0\1\0\0\0\0\0\0\1\4\0\1\4\1\7\0\f\0QUERY_"..., 8192) = 1072
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb77a0000
open("./templets/panel/category_insert.html", O_RDONLY) = -1 ENOENT (No such file or directory)
munmap(0xb77a0000, 4096)
=====================================================================================
没法读到模板的问题如下解决办法:
-------------------------------------------------------
七夜兄弟:
open("./templets/blog/article_list.html", O_RDONLY) = -1 ENOENT (No such file or directory)
./module/panel/article.c: if (tpl_load(tpl,"./templets/blog/article_list.html") != TPL_OK)
打开文件编译后,这个模板文件是相对于fastcgi这个程序是从哪儿开始算机的啊?
编译文件打开的模板文件你写的是相对路径,这个相对路径是相对的根目录是?
七夜 上午 11:13:12
/usr/local/htdocs/
你得在这个目录,你试试我的方法.
cd /usr/local/htdocs/
/usr/local/webserver/fastcgi/spawn-fcgi/bin/spawn-fcgi -f ./cblog -s /tmp/fcgi-blog.sock
spawn-fcgi: child spawned successfully: PID: 3639
这个sqllite备份怎么备份,
这玩意一个文件容易一出问题,整个文件里数据就挂了吧?
稳定性怎么样、如果真用sqlite的话。有没有办法提高其数据的安全这方面的经验。
七夜 上午 11:27:12
stop fastcgi. after copy sqlite3 db file to other path
安全,已经不在发布目录
所以不用担心会被浏览器下载什么的
七夜 上午 11:29:24
可能会有些小bug。大问题没有。我运行了一年
回忆未来-向东-Jàck 上午 11:30:13
像nginx下的php一样起多个。可以么?
七夜 上午 11:30:23
目前还不可以
回忆未来-向东-Jàck 上午 11:31:07
我看好像有个fastcgi命令可以起一个端口起来,有个参数是多少个进程的啊。
==========================================================
关于多个进程现在只有一个,可以再学习下。
下面关于后台的功能特别是那个缓存:
回忆未来-向东-Jàck 上午 11:32:26
这添加文章太快了,这种快感不错,比我在外面的博客快了进10倍,
这用户体验好啊。
清楚全部缓存
这个是什么意思,缓存在哪儿的?
七夜 上午 11:33:00
我会生成静态页的
列表页 首页 文章页
都会生成的静态页的
回忆未来-向东-Jàck 上午 11:33:20
生成首页
不就是么?
是自动生成的么,其他的静态页面。
首页要自己生成是吧?
七夜 上午 11:33:46
列表页 文章页 是自动生成的
访问生成的
回忆未来-向东-Jàck 上午 11:34:53
哈哈,好的,我有空再看下代码,学习一下,灰常感谢。
回忆未来-向东-Jàck 上午 11:36:34
tokyocabinet jemalloc 用在这儿是干嘛的?
好像是内存分配的是吧?这个jemalloc。它有什么好处?
这个tokyocabinet 是个什么玩意?是缓存吗。
七夜 上午 11:38:43
jemalloc 优化的 内存管理器
tokyocabinet 有现成的 map list封装
回忆未来-向东-Jàck 上午 11:39:30
这样就不容易内存泄漏和数据结构上也带来了处理方便是吧?我也学学。
七夜 上午 11:41:45
不是,jemalloc 主要是代替 libc的malloc 和free
内存泄漏 还是自己去管理
回忆未来-向东-Jàck 上午 11:42:09
仅仅是设想下像这种单个的fastcg进程i能支持并发多少 有没有过测试或估计哩?
七夜 上午 11:42:16
你可以压测一下
问下scottjiang兄弟这块的实践经验:
fastcgi只起一个进程,大概能支持并发多少啊?scottjiang兄弟。
location ~ \.html$ {
root /usr/local/htdocs;
fastcgi_pass unix:/tmp/fcgi-blog.sock;
fastcgi_index cblog;
include fastcgi_params;
}
有没有经验值啊?我想了解下这块。再就是怎么把这一个进程变多个啊。
江庆海 上午 11:50:24
可以在apache中配置最大进程数。根据你的业务请求量,一般配几十吧。
你google一下配置说明,应该有可以启动进程数,每个进程数处理最大并发个数、超时等配置。
nginx 不太熟啊,应该也是有的。
================================================
多个进程的参考方法如下:
1. nginx安装(略过)
2. FastCGI安装
因为nginx不能直接执行外部的cgi程序,我们可使用lighttpd中的spawn-fastcgi来让nginx可支持外部cgi运行。也有另外一种方法安装nginx-fcgi来让nginx支持cgi,我们这里讲解一种使用spawn-fastcgi的方法。
#include <iostream>
#include <fcgi_stdio.h>
#include <stdlib.h>
int main()
{
int count = 0;
while(FCGI_Accept() >= 0){
printf("Content-type: text/html\r\n"
"\r\n"
""
"FastCGI Hello!"
"Request number %d running on host%s "
"Process ID: %d\n", ++count, getenv("SERVER_NAME"), getpid());
}
return 0;
}
编译程序:g++ testcgi.c -o lzgFastCGI -lfcgi
测试程序是否能正常运行:./myFastCGI,如果能正常运行则说明程序没有问题,如果出现缺少库libfcgi.so.0,则自己需要手动把/usr/local/lib/libfcgi.so.0库建立一个链接到/usr/lib/目录下:ln -s /usr/local/libfcgi.so.0 /usr/lib/
3. nginx配置、测试
1) 拷贝lzgFastCGI程序到nginx下的cgibin目录(自己可以创建,根据需要更改)
2) 启动spawn-fastcgi管理进程
/usr/local/nginx/sbin/spawn-fcgi -a 127.0.0.1 -p 9002 -C 25 -f /usr/local/nginx/cgibin/lzgFastCGI
查看一下9002端口是否已成功:netstat -na | grep 9002
3) 更改nginx.conf配置文件
添加配置
location ~ \.cgi$ {
fastcgi_pass 127.0.0.1:9002;
fastcgi_index index.cgi;
fastcgi_param SCRIPT_FILENAME fcgi$fastcgi_script_name;
include fastcgi_params;
}
根据上面的文章进行实践是OK的:
/usr/local/nginx/sbin/spawn-fcgi -a 127.0.0.1 -p 9002 -C 25 -f /usr/local/nginx/cgibin/lzgFastCGI
cd /usr/local/htdocs/
/usr/local/webserver/fastcgi/spawn-fcgi/bin/spawn-fcgi -a 127.0.0.1 -p 9002 -C 25 -f ./cblog
实践OK的,Ok步骤如下:
root@192.168.137.128:/usr/local/htdocs# /usr/local/webserver/fastcgi/spawn-fcgi/bin/spawn-fcgi -a 127.0.0.1 -p 9002 -C 25 -f ./cblog
spawn-fcgi: child spawned successfully: PID: 4367
root@192.168.137.128:/usr/local/htdocs# netstat -atlunp|grep 9002
tcp 0 0 127.0.0.1:9002 0.0.0.0:* LISTEN 4367/./cblog
Nginx配置:
location ~ \.cgi$ { //这儿略有区别,是html都指向这个cgi了。
适当参考即可,和实际的情况均有出入:http://blog.csdn.net/qzier_go/article/details/7340868
http://terry831010.blog.163.com/blog/static/6916117120126185428827/
http://www.ha97.com/173.html
使用spawn-fcgi来控制php-cgi的FastCGI进程:
/usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -C 5 -u apache -g apache -f /usr/bin/php-cgi
参数含义如下:
-f <fcgiapp> 指定调用FastCGI的进程的执行程序位置,根据系统上所装的PHP的情况具体设置。
-a <addr> 绑定到地址addr。
-p <port> 绑定到端口port。
-s <path> 绑定到unix socket的路径path。
-C <childs> 指定产生的FastCGI的进程数,默认为5。(仅用于PHP)
-P <path> 指定产生的进程的PID文件路径。
-u和-g FastCGI使用什么身份(-u 用户 -g 用户组)运行,CentOS下可以使用apache用户,其他的根据情况配置,如nobody、www-data等。
实践来源:http://www.phpabc.cn/apachejie-he-spawn-fcgishi-yong-fastcgi.html
/usr/local/webserver/fastcgi/spawn-fcgi/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -C 5 -u apache -g www -f /usr/local/webserver/php/bin/php-cgi
spawn-fcgi: child spawned successfully: PID: 7551
ps aux|grep php
apache 7551 16.7 1.6 43396 6016 ? Ssl 15:14 0:01 /usr/local/webserver/php/bin/php-cgi
====================================================================================
Sqlite表查询相关实践:
root@192.168.137.128:/usr/local/db# sqlite3 blog.db
SQLite version 3.7.17 2013-05-20 00:56:22
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
1)查看表名
sqlite> .table
article category comment friendlink
2)查表内容:
sqlite> select * from category;
1|php|php|1
2|mysql|mysql|2
3|nosql|nosql|3
4|linux|linux|4
5|javascript|javascript|5
6||life|6
7||opensource|7
8|web2.0|web2.0|8
3)表结构:
sqlite> .schema category
CREATE TABLE [category] (
[sid] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
[sortname] VARCHAR(30) NOT NULL,
[sortdir] VARCHAR(30) NOT NULL,
[pos] INTEGER DEFAULT '0' NOT NULL
);
CREATE INDEX [IDX_CATEGORY_POS] ON [category](
[pos] ASC
);
4)退出sqliite
sqlite> .exit
————————————————Add:2013-12-10启动了1000个fastcgi进程————————————————
http://www.cnblogs.com/xiaouisme/archive/2012/08/01/2618398.html
步骤如下:
(1)代码情况:heloFastCGI.c
(2)make情况:makefile.sh
(3)建立目录步骤:step.txt
mkdir -p /usr/local/webserver/nginx/myFastCGI
cp helloFastCGI /usr/local/webserver/nginx/myFastCGI
/usr/local/webserver/nginx/sbin/spawn-fcgi -a 127.0.0.1 -p 9100 -C 25 -f
/usr/local/webserver/nginx/myFastCGI/helloFastCGI -F 1000
启动:
/usr/local/webserver/nginx/sbin/spawn-fcgi -a 127.0.0.1 -p 9100 -C 25 -f /usr/local/webserver/nginx/myFastCGI/helloFastCGI -F 1000
启动后:
root@192.168.137.128:/data0/htdocs/myfastcgi# ps aux|grep helloFastCGI |wc
1001 11012 115083
root@192.168.137.128:/data0/htdocs/myfastcgi# netstat -atlunp|grep 9100
tcp 0 0 127.0.0.1:9100 0.0.0.0:* LISTEN 5524/helloFastCGI
注意这是一行命令哦。注意可能要sudo.
-p是指定fastcgi控制器绑定的TCP端口listen的.
如果你想调试单个fastcgi程序,可以把-f换成-n.
-F指定spawn-fcgi将fork多少个child进程。之后nginx对于此cgi的请求就可以并发了。显然这里的直接并发量是1000.
其他参数可以help看看:(看起来-C对不要php的我来说没啥用.本文是初次使用记录性教程,这里就不纠结这些参数了)
关闭spawn-fcgi打开的fastcgi程序:
$ netstat -anp | grep 9000 #查看占用9000端口的程序ID
$ kill -9 PID #或killall 进程名
后面这些进程启动后,怎么和nginx对接上呢,需要进行配置文件研究修改即可,文章里有说明。
...........关于配置的说明:..............
1. .ginx收到cgi请求后,会看有多少个该cgi程序的进程(spawn-fcgi -F指定的参数),然后根据并发量来调用(调度)cgi程序。
2. 原版spawn-fcgi(可参考下面七参考资料里daemon版spawn-fcgi)在fork了cgi程序后,自己就退出了。这时fork了的cgi程序的父进程ID都是1了,即init系统进程。这样,如果想并发就需要你的fastcgi去支持并发,可google:fastcgi并发
3. 关于php,nginx是用fastcgi来解析php的。这个负责解析的fastcgi程序并不多,好像就1个,因此这cgi不能大并发,但是没关系nginx支持cgi缓存~所以php网页的并发请求跟fastcgi关系不大。其实可以把fastcgi对于php的作用当作一个编译器,编译完后,php都有了缓存,再请求就不需要再次跑fastcgi来解析php脚本了,php就是个该死的脚本啊~~
我自己也不知道讲清楚没。其实我自己也不知道自己清楚没。:-)
________________对cblog进行设置在原来基础上加上: -F 1000 ________________
root@192.168.137.128:/usr/local/htdocs# ps aux|grep cblog|wc
491 5402 35846
==============================================================
对其扩展为多个FastCGI的进程后分别以Unix socket和9002进行较为深入的研究并证明其调度及和程序里cookie在多进程里出现登录失败的问题研究
=======================================================================================
/usr/local/webserver/fastcgi/spawn-fcgi/bin/spawn-fcgi -f ./cblog -s /tmp/fcgi-blog.sock -F 3
/usr/local/webserver/fastcgi/spawn-fcgi/bin/spawn-fcgi -a 127.0.0.1 -p 9002 -C 25 -f ./cblog
以下结论:其写的blog不支持多个进程的登录,上面起了进程均后只有3个进程,而其中走的是unix socket不是端口有两个:2392、2394。
其它一个是端口:9002,它个没有疑义。对于2392、2394两个进程是可能被fastcgi轮流来接请求的,于是出现cookie登录失败,实践知而只起一个这样的进程ID号,不会存在这样的情况,估计其cookie没有写得兼容多个fastcgi罢。
同时发现只起动/usr/local/webserver/fastcgi/spawn-fcgi/bin/spawn-fcgi -f ./cblog -s /tmp/fcgi-blog.sock -F 3,出现其进程有时只有2个,说明程序相当不稳定,所以只能说是起研究之用:
root@192.168.137.128:/usr/local/webserver/nginx# sh /root/runfastcgi.sh
spawn-fcgi: child signaled: 11
spawn-fcgi: child spawned successfully: PID: 2638
spawn-fcgi: child spawned successfully: PID: 2639
root@192.168.137.128:/usr/local/webserver/nginx# sh /root/runfastcgi.sh
spawn-fcgi: child signaled: 11
spawn-fcgi: child spawned successfully: PID: 2655
spawn-fcgi: child spawned successfully: PID: 2656
root@192.168.137.128:/usr/local/webserver/nginx# sh /root/runfastcgi.sh
spawn-fcgi: child spawned successfully: PID: 2671
spawn-fcgi: child spawned successfully: PID: 2673
spawn-fcgi: child spawned successfully: PID: 2674
只启动上面这一个本地unix socket后出现,如果连接:http://blogtest2.com/panel-user-login.html 也就是9002出现:
The page you are looking for is temporarily unavailable.
Please try again later.
说明这两者:Unix socket和9002是独立的。
(第二:再次证明之反证。)反之,如只起用9002多个pid后,是什么情况?实践一下:
起3个依旧不稳定: /usr/local/webserver/fastcgi/spawn-fcgi/bin/spawn-fcgi -a 127.0.0.1 -p 9002 -C 25 -f ./cblog -F 3
root@192.168.137.128:/usr/local/webserver/nginx# sh /root/runfastcgi.sh
spawn-fcgi: child signaled: 8
spawn-fcgi: child spawned successfully: PID: 2736
spawn-fcgi: child spawned successfully: PID: 2737
root@192.168.137.128:/usr/local/webserver/nginx# sh /root/runfastcgi.sh
spawn-fcgi: child signaled: 11
spawn-fcgi: child spawned successfully: PID: 2752
spawn-fcgi: child spawned successfully: PID: 2753
root@192.168.137.128:/usr/local/webserver/nginx# sh /root/runfastcgi.sh
spawn-fcgi: child spawned successfully: PID: 2763
spawn-fcgi: child spawned successfully: PID: 2765
spawn-fcgi: child spawned successfully: PID: 2766
此时访问 Unix socket出现得到确实是独立的再次证晨:
http://blogtest.com/panel-user-login.html The page you are looking for is temporarily unavailable.Please try again later.
root@192.168.137.128:/usr/local/webserver/nginx# strace -p 2763 -p 2765
http://blogtest2.com/panel-user-login.html
Process 2763 attached - interrupt to quit
Process 2765 attached - interrupt to quit
[pid 2765] accept(0, <unfinished ...>
[pid 2763] accept(0, {sa_family=AF_INET, sin_port=htons(56906), sin_addr=inet_addr("127.0.0.1")}, [16]) = 5
[pid 2763] setsockopt(5, SOL_TCP, TCP_NODELAY, [1], 4) = 0
[pid 2763] read(5, "\1\1\0\1\0\10\0\0\0\1\0\0\0\0\0\0\1\4\0\1\3\277\1\0\17\32SCRIPT"..., 8192) = 1000
[pid 2763] time(NULL) = 1386912681
[pid 2763] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb778e000
[pid 2763] munmap(0xb778e000, 4096) = 0
[pid 2763] write(5, "\1\6\0\1\0005\3\0X-Accel-Redirect: /templ"..., 88) = 88
[pid 2763] shutdown(5, 1 /* send */) = 0
[pid 2763] select(6, [5], NULL, NULL, {2, 0}) = 1 (in [5], left {1, 999995})
[pid 2763] read(5, "", 1024) = 0
[pid 2763] close(5) = 0
[pid 2763] accept(0,
登录action:
[pid 2765] <... accept resumed> {sa_family=AF_INET, sin_port=htons(56908), sin_addr=inet_addr("127.0.0.1")}, [16]) = 5
[pid 2765] setsockopt(5, SOL_TCP, TCP_NODELAY, [1], 4) = 0
[pid 2765] read(5, "\1\1\0\1\0\10\0\0\0\1\0\0\0\0\0\0\1\4\0\1\4f\2\0\17\32SCRIPT"..., 8192) = 1240
[pid 2765] time(NULL) = 1386912715
[pid 2765] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7758000
[pid 2765] gettimeofday({1386912715, 783922}, NULL) = 0
[pid 2765] open("/dev/urandom", O_RDONLY|O_LARGEFILE) = 6
[pid 2765] fcntl64(6, F_GETFD) = 0
[pid 2765] fcntl64(6, F_SETFD, FD_CLOEXEC) = 0
[pid 2765] getuid32() = 0
[pid 2765] getppid() = 1
[pid 2765] gettimeofday({1386912715, 801719}, NULL) = 0
[pid 2765] gettimeofday({1386912715, 802502}, NULL) = 0
[pid 2765] read(6, "\304\264\345M\0?\352V\4\320\323\257u$\16\325", 16) = 16
[pid 2765] gettid() = 2765
[pid 2765] time(NULL) = 1386912715
[pid 2765] open("/etc/localtime", O_RDONLY) = 7
[pid 2765] fstat64(7, {st_mode=S_IFREG|0644, st_size=405, ...}) = 0
[pid 2765] fstat64(7, {st_mode=S_IFREG|0644, st_size=405, ...}) = 0
[pid 2765] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7757000
[pid 2765] read(7, "TZif2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\0\0\0\3\0\0\0\0"..., 4096) = 405
[pid 2765] _llseek(7, -7, [398], SEEK_CUR) = 0
[pid 2765] read(7, "\nCST-8\n", 4096) = 7
[pid 2765] close(7) = 0
[pid 2765] munmap(0xb7757000, 4096) = 0
[pid 2765] munmap(0xb7758000, 4096) = 0
[pid 2765] write(5, "\1\6\0\1\0\274\4\0Set-Cookie: session=05ef"..., 224) = 224
[pid 2765] shutdown(5, 1 /* send */) = 0
[pid 2765] select(6, [5], NULL, NULL, {2, 0}) = 1 (in [5], left {1, 999994})
[pid 2765] read(5, "", 1024) = 0
[pid 2765] close(5) = 0
[pid 2765] accept(0,
跳转到管理页面又变回2763:
[pid 2763] <... accept resumed> {sa_family=AF_INET, sin_port=htons(56909), sin_addr=inet_addr("127.0.0.1")}, [16]) = 5
[pid 2763] setsockopt(5, SOL_TCP, TCP_NODELAY, [1], 4) = 0
[pid 2763] read(5, "\1\1\0\1\0\10\0\0\0\1\0\0\0\0\0\0\1\4\0\1\3\374\4\0\17\36SCRIPT"..., 8192) = 1064
[pid 2763] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb778e000
[pid 2763] munmap(0xb778e000, 4096) = 0
[pid 2763] write(5, "\1\6\0\1\0m\3\0Content-type: text/html\r"..., 144) = 144
[pid 2763] shutdown(5, 1 /* send */) = 0
[pid 2763] select(6, [5], NULL, NULL, {2, 0}) = 1 (in [5], left {1, 999150})
[pid 2763] read(5, "", 1024) = 0
[pid 2763] close(5) = 0
[pid 2763] accept(0,
说明这个第一个Unix的socket也好,9002端口也好,都存在我们常说的一个问题就是都会通过fastcgi协议分派到不同的进程中去处理,是有统一调度的!!!
第二:两者是独立的,一个是访问句柄,一个是访问端口进行通讯,独立而不干扰。但是这块七夜写的Cookie的登录判断这块可能写得不够严谨,有时间得看下这块的代码实现才行,同时借鉴PHP的cookie实现机制才能实现真正的cookie在多进程下不会出现失效的问题。EOF
——————第一:混合的情况:Unix Socket和9002同时————
作登录请求
root@192.168.137.128:~# sh /root/runfastcgi.sh
spawn-fcgi: child spawned successfully: PID: 2386
spawn-fcgi: child spawned successfully: PID: 2392
spawn-fcgi: child spawned successfully: PID: 2394
spawn-fcgi: child spawned successfully: PID: 2395
root@192.168.137.128:~# ps aux|grep cblog
root 2386 0.0 0.2 13868 1112 ? Ssl 13:15 0:00 ./cblog
root 2392 0.0 0.2 13868 1112 ? Ssl 13:15 0:00 ./cblog
root 2394 0.0 0.2 13868 1112 ? Ssl 13:15 0:00 ./cblog
root@192.168.137.128:~# strace -p 2386 -p 2392 -p 2394
从:http://blogtest2.com/panel-user-login.html
到登录:登陆成功!的action都是:2386进程在干(见:)。
root@192.168.137.128:~# strace -p 2386 -p 2392 -p 2394
Process 2386 attached - interrupt to quit
Process 2392 attached - interrupt to quit
Process 2394 attached - interrupt to quit
[pid 2394] accept(0, <unfinished ...>
[pid 2392] accept(0, <unfinished ...>
[pid 2386] accept(0, {sa_family=AF_INET, sin_port=htons(56887), sin_addr=inet_addr("127.0.0.1")}, [16]) = 5
[pid 2386] setsockopt(5, SOL_TCP, TCP_NODELAY, [1], 4) = 0
[pid 2386] read(5, "\1\1\0\1\0\10\0\0\0\1\0\0\0\0\0\0\1\4\0\1\3\221\7\0\17\32SCRIPT"..., 8192) = 960
[pid 2386] time(NULL) = 1386911788
[pid 2386] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb77d3000
[pid 2386] munmap(0xb77d3000, 4096) = 0
[pid 2386] write(5, "\1\6\0\1\0005\3\0X-Accel-Redirect: /templ"..., 88) = 88
[pid 2386] shutdown(5, 1 /* send */) = 0
[pid 2386] select(6, [5], NULL, NULL, {2, 0}) = 1 (in [5], left {1, 999727})
[pid 2386] read(5, "", 1024) = 0
[pid 2386] close(5) = 0
[pid 2386] accept(0, {sa_family=AF_INET, sin_port=htons(56889), sin_addr=inet_addr("127.0.0.1")}, [16]) = 5
[pid 2386] setsockopt(5, SOL_TCP, TCP_NODELAY, [1], 4) = 0
[pid 2386] read(5, "\1\1\0\1\0\10\0\0\0\1\0\0\0\0\0\0\1\4\0\1\0048\0\0\17\32SCRIPT"..., 8192) = 1192
[pid 2386] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb77d3000
[pid 2386] gettimeofday({1386911862, 145842}, NULL) = 0
[pid 2386] open("/dev/urandom", O_RDONLY|O_LARGEFILE) = 6
[pid 2386] fcntl64(6, F_GETFD) = 0
[pid 2386] fcntl64(6, F_SETFD, FD_CLOEXEC) = 0
[pid 2386] getuid32() = 0
[pid 2386] getppid() = 1
[pid 2386] gettimeofday({1386911862, 155096}, NULL) = 0
[pid 2386] gettimeofday({1386911862, 155738}, NULL) = 0
[pid 2386] read(6, "\3218\03774\374\342\3\f\330\377M{\214y\24", 16) = 16
[pid 2386] gettid() = 2386
[pid 2386] time(NULL) = 1386911862
[pid 2386] open("/etc/localtime", O_RDONLY) = 7
[pid 2386] fstat64(7, {st_mode=S_IFREG|0644, st_size=405, ...}) = 0
[pid 2386] fstat64(7, {st_mode=S_IFREG|0644, st_size=405, ...}) = 0
[pid 2386] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb77d2000
[pid 2386] read(7, "TZif2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\0\0\0\3\0\0\0\0"..., 4096) = 405
[pid 2386] _llseek(7, -7, [398], SEEK_CUR) = 0
[pid 2386] read(7, "\nCST-8\n", 4096) = 7
[pid 2386] close(7) = 0
[pid 2386] munmap(0xb77d2000, 4096) = 0
[pid 2386] munmap(0xb77d3000, 4096) = 0
[pid 2386] write(5, "\1\6\0\1\0\274\4\0Set-Cookie: session=44ad"..., 224) = 224
[pid 2386] shutdown(5, 1 /* send */) = 0
[pid 2386] select(6, [5], NULL, NULL, {2, 0}) = 1 (in [5], left {1, 982622})
[pid 2386] read(5, "", 1024) = 0
[pid 2386] close(5) = 0
[pid 2386] accept(0,
登录后进入管理:还是2386
方式:fastcgi_pass 127.0.0.1:9002;
http://blogtest.com/panel-user-login.html
[pid 2392] <... accept resumed> {sa_family=AF_FILE, NULL}, [2]) = 5
[pid 2392] select(6, [5], NULL, NULL, {2, 0}) = 1 (in [5], left {1, 999999})
[pid 2392] read(5, "\1\1\0\1\0\10\0\0\0\1\0\0\0\0\0\0\1\4\0\1\3\211\7\0\f\0QUERY_"..., 8192) = 952
[pid 2392] time(NULL) = 1386912018
[pid 2392] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7796000
[pid 2392] munmap(0xb7796000, 4096) = 0
[pid 2392] write(5, "\1\6\0\1\0005\3\0X-Accel-Redirect: /templ"..., 88) = 88
[pid 2392] shutdown(5, 1 /* send */) = 0
[pid 2392] select(6, [5], NULL, NULL, {2, 0}) = 1 (in [5], left {1, 999999})
[pid 2392] read(5, "", 1024) = 0
[pid 2392] close(5) = 0
[pid 2392] accept(0,
提交action:
[pid 2394] <... accept resumed> {sa_family=AF_FILE, NULL}, [2]) = 5
[pid 2394] select(6, [5], NULL, NULL, {2, 0}) = 1 (in [5], left {1, 999991})
[pid 2394] read(5, "\1\1\0\1\0\10\0\0\0\1\0\0\0\0\0\0\1\4\0\1\4/\1\0\f\0QUERY_"..., 8192) = 1184
[pid 2394] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb77dc000
[pid 2394] gettimeofday({1386912056, 976899}, NULL) = 0
[pid 2394] open("/dev/urandom", O_RDONLY|O_LARGEFILE) = 6
[pid 2394] fcntl64(6, F_GETFD) = 0
[pid 2394] fcntl64(6, F_SETFD, FD_CLOEXEC) = 0
[pid 2394] getuid32() = 0
[pid 2394] getppid() = 1
[pid 2394] gettimeofday({1386912056, 978495}, NULL) = 0
[pid 2394] gettimeofday({1386912056, 978630}, NULL) = 0
[pid 2394] read(6, "\366\377\210C\247\350\367\231\221a7\271sE}\251", 16) = 16
[pid 2394] gettid() = 2394
[pid 2394] time(NULL) = 1386912056
[pid 2394] open("/etc/localtime", O_RDONLY) = 7
[pid 2394] fstat64(7, {st_mode=S_IFREG|0644, st_size=405, ...}) = 0
[pid 2394] fstat64(7, {st_mode=S_IFREG|0644, st_size=405, ...}) = 0
[pid 2394] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb77db000
[pid 2394] read(7, "TZif2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\0\0\0\3\0\0\0\0"..., 4096) = 405
[pid 2394] _llseek(7, -7, [398], SEEK_CUR) = 0
[pid 2394] read(7, "\nCST-8\n", 4096) = 7
[pid 2394] close(7) = 0
[pid 2394] munmap(0xb77db000, 4096) = 0
[pid 2394] munmap(0xb77dc000, 4096) = 0
[pid 2394] write(5, "\1\6\0\1\0\274\4\0Set-Cookie: session=c605"..., 224) = 224
[pid 2394] shutdown(5, 1 /* send */) = 0
[pid 2394] select(6, [5], NULL, NULL, {2, 0}) = 1 (in [5], left {1, 999992})
[pid 2394] read(5, "", 1024) = 0
[pid 2394] close(5) = 0
[pid 2394] accept(0,
http://blogtest.com/cpanel.htm [未登录]
[pid 2392] <... accept resumed> {sa_family=AF_FILE, NULL}, [2]) = 5
[pid 2392] select(6, [5], NULL, NULL, {2, 0}) = 1 (in [5], left {1, 999989})
[pid 2392] read(5, "\1\1\0\1\0\10\0\0\0\1\0\0\0\0\0\0\1\4\0\1\3\357\1\0\f\0QUERY_"..., 8192) = 1048
[pid 2392] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7796000
[pid 2392] munmap(0xb7796000, 4096) = 0
[pid 2392] write(5, "\1\6\0\1\0m\3\0Content-type: text/html\r"..., 144) = 144
[pid 2392] shutdown(5, 1 /* send */) = 0
[pid 2392] select(6, [5], NULL, NULL, {2, 0}) = 1 (in [5], left {1, 999993})
[pid 2392] read(5, "", 1024) = 0
[pid 2392] close(5) = 0
[pid 2392] accept(0,
方式:fastcgi_pass unix:/tmp/fcgi-blog.sock;
http://bbs.phpchina.com/forum.php?mod=viewthread&tid=200687
了解:
1)升级使用sqlite3的fts3扩展,进行全文检索
2)使用rmmseg进行中文分词
3) drupal文件上传
这个哥们的邮箱:sunjianfei@xiaomi.com
http://bbs.phpchina.com/forum.php?mod=viewthread&tid=249829
http://bbs.phpchina.com/forum.php?mod=viewthread&tid=249829
————————————————————————————————
找这个哥们他从邮箱里回了一个做好的,我没看明白当时为嘛选这些,问了下七夜:Add Time:2014-08-20
1)升级使用sqlite3的fts3扩展,进行全文检索
2)使用rmmseg进行中文分词
3) drupal文件上传
这玩意都是啥,像1) mysql都能直接直持吧?
像二mysql好像也有插件是吧?
像上传为嘛要用drupal来增强呢?
+————————+
有啥考量没?
七夜
14/8/20 星期三 上午 11:07:01
用nginx的上传就行 //是一个Nginx专用的上传模块,https://jackxiang.com/post/6221/ 有介绍。
回忆未来-向东-Jàck 14/8/20 星期三 上午 11:09:01
七夜兄弟说的是那个nginx一个上传插件吧?nginx_upload_module
七夜
14/8/20 星期三 上午 11:09:00
恩是的。nginx模块
上午 11:09:23
回忆未来-向东-Jàck 14/8/20 星期三 上午 11:09:23
我都想用c写一个专门的上传了,啊哈哈。
七夜
14/8/20 星期三 上午 11:09:43
不用。都有现成的
回忆未来-向东-Jàck 14/8/20 星期三 上午 11:10:17
写了一半写不下去了,c功力不够,对那个上传大文件是先放内存还是直接写文件这块涉及到缓存处理上好像有点纠结。
七夜
写磁盘。内存缓存部分
七夜
14/8/20 星期三 上午 11:13:11
写磁盘。内存缓存部分
————————
那是从内存一下写入磁盘,还是要有一个进程来看哪个文件内存放得多就先写呢?
啥也不会
14/8/20 星期三 上午 11:15:07
mmap啊 别的交给系统好了
SQLite的FTS3扩展
FTS3允许用户创建一个全文索引的特殊表,
CREATE VIRTUAL TABLE enrondata1 USING fts3(content TEXT); /* FTS3 table */
CREATE TABLE enrondata2(content TEXT); /* Ordinary table */
使用FTS3效率特别快
SELECT count(*) FROM enrondata1 WHERE content MATCH 'linux'; /* 0.03 seconds */
SELECT count(*) FROM enrondata2 WHERE content LIKE '%linux%'; /* 22.5 seconds */
http://www.cnblogs.com/abob/archive/2010/12/01/1893425.html
2)使用rmmseg进行中文分词:
C语言开源高性能中文分词组件,C语言mmseg中文分词器 《狮子的魂》:https://code.google.com/p/friso/
3) drupal文件上传:http://blog.sina.com.cn/s/blog_a94fd80d01017tkx.html
FastCGI Blog 2.0版本正在开发中,新的版本,将是代码级别的优化,还有一些功能的增强
1. 使用了内存池,提高申请小内存的效率.一个请求一个内存池.这样杜绝了内存泄漏。
2. 自己编写了hashmap、list等实现,减少对第三方lib的依赖
3. 使用配置文件,修改相关配置更加方便
4. 使用功能更为强大的html编辑器,增加后台文件上传功能
5. 代码高亮显示
6. 文章的全文搜索功能.(有时间的话,实现该功能)
http://bbs.chinaunix.net/thread-1790317-3-1.html
C FastCGI Blog 零痛苦一键安装包
自从上次发布了我用写C写的 FastCGI Blog,很多人都说安装不太方便,所以我做了个一键安装包,大家可以零痛苦体验
解开压缩包,执行
./install.sh "/root/local"
/root/local
是安装目录
Nginx转发 spawn-fcgi看护
欢迎测试,欢迎加入
在
七夜开发
的博客基础上进行升级:
1)升级为g++编译,方便整合c++库
2)升级使用sqlite3的fts3扩展,进行全文检索
3)使用rmmseg进行中文分词
目前正在更新:
1) 整理
代码
结构,提供方便的二次开发接口和说明文档
2)添加
文件
上传,实现drupal文件上传的
用户
体验
3)后台
模板
管理
代码还在完善中,请静侯
————————————————————————————————
所有的软件包下载List:
http://code.google.com/p/php-tokyocabinet/downloads/list
C实现的FastCGI Blog:
http://www.fengblog.org/archives/200/
http://blog.sina.com.cn/s/blog_7041f8eb0100nkxe.html
下载完整版的地址:
http://www.pudn.com/downloads426/sourcecode/windows/network/detail1804143.html
七夜博客系统 FastCGI Blog 2.0,自从C-blog1.0发布以来,很多人给了很中肯的意见。这段有时间了,赶紧的把一些大家都需要的功能给开发出来。现在推出c-blog2.0版本.在这个版本里,还没实现全文搜索.在2.1版里会实现全文搜索功能。
这次升级的功能列表:
1. 引入了 配置文件
2. 增加cookie 解析,和文件上传功能
3. html编辑器,换了 更为强大的KindEditor编辑器
4. 支持代码高亮
5. 使用了内存池.统一分配 统一释放,程序更安全
6. 更清晰的 程序目录分类.
(1) db 为 数据库目录
(2) log 为 日志目录
(3) src 为 c-blog源文件目录
(4) htdocs 为 www访问目录.nginx 指到这个目录就行
7. 使用 configure make make install 方式 安装.更为简单
一直想有个自己的blog,就是犯懒不肯code,最近对自己下了狠劲。利用一两个月业余时间完成了这个blog,我还是很有成就感的。哈哈哈。这个blog程序,这几天刚完成。有bug在所难免,欢迎大家提出来,我会不断的维护的。下面我罗列一下这个blog的功能
这个blog采用html template技术, 模板修改起来就跟php的模板一样简单
后台功能
1. 分类管理、添加、删除、编辑(只支持一级分类)
2. 文章管理、添加、删除、编辑
3. 生成静态首页、清除全部静态页缓存
4. 友情链接管理、添加、删除、编辑
5. 评论列表、删除
6. 简单的用户登录和退出
========================================================================================
这个blog 依赖这些 lib
1. FastCGI http://www.fastcgi.com/dist/
2. tokyocabinet http://fallabs.com/tokyocabinet/
DownLoad:http://fallabs.com/kyotocabinet/pkg/
http://fallabs.com/tokyocabinet/pastpkg/tokyocabinet-1.3.27.tar.gz
3. SQLite3 http://www.sqlite.org/download.html
4. jemalloc http://www.canonware.com/download/jemalloc/
下载上述软件,并编译安装.
blog的编译命令是(相关lib路径,根据自己的改,)
gcc -o blog blog.c util.c tpllib.c rbtree.c assign.c ./module/bl
(gdb) set env module=user
(gdb) run
Starting program: /usr/local/htdocs/cblog
[Thread debugging using libthread_db enabled]
[New Thread 0xb7ff0b70 (LWP 5952)]
Location:/
输出:
./src/blog.c: puts("Location:/\r\n\r\n")
/usr/local/webserver/fastcgi/spawn-fcgi/bin/spawn-fcgi -f /usr/local/htdocs/cblog -s /tmp/fcgi-blog.sock
http://blogtest.com/article-read-opensource-15-c-fastcgi-blog-2.0.html
这个是用cgi生成的网页么?怎么访问这个cgi啊?
七夜 下午 02:47:19
article-read-opensource-15-c-fastcgi-blog-2.0.html
article 是访问article 模块
read 是访问article 模块 中的函数
opensource 是分类名
15 是 id
后面 的 都是 seo
url seo
回忆未来-向东-Jàck 下午 02:48:19
你这个有没有url的seo,这个得自己编写?
这个url的seo是不是写在nginx里的?当时。
等会
/panel-user-login.html
后台登录链接的Url及帐号名密码如下:
http://blogtest.com/panel-user-login.html
http://blogtest2.com/panel-user-login.html
用户名:七夜
密码:vilinux
tail -f /data1/logs/access.log
tail -f /data1/logs/nginx_error.log
回忆未来-向东-Jàck 下午 03:09:22
192.168.137.1 - - [03/Jul/2013:15:09:11 +0800] "GET /panel-user-login.html HTTP/1.1" 502 383 "-" "Mozilla/5.0 (Windows NT 6.1; rv:22.0) Gecko/20100101 Firefox/22.0"
七夜 下午 03:09:40
看看error
errlor.log
回忆未来-向东-Jàck 下午 03:10:24
2013/07/03 15:10:14 [crit] 2799#0: *3 connect() to unix:/tmp/fcgi-blog.sock failed (13: Permission denied) while connecting to upstream, client: 192.168.137.1, server: blogtest.com, request: "GET /panel-user-login.html HTTP/1.1", upstream: "fastcgi://unix:/tmp/fcgi-blog.sock:", host: "blogtest.com"
回忆未来-向东-Jàck 下午 03:10:24
2013/07/03 15:10:14 [crit] 2799#0: *3 connect() to unix:/tmp/fcgi-blog.sock failed (13: Permission denied) while connecting to upstream, client: 192.168.137.1, server: blogtest.com, request: "GET /panel-user-login.html HTTP/1.1", upstream: "fastcgi://unix:/tmp/fcgi-blog.sock:", host: "blogtest.com"
七夜 下午 03:11:10
chmod 777
没权限
回忆未来-向东-Jàck 下午 03:11:40
chmod -R 777 /tmp/fcgi-blog.sock
是吧?
可以了,修改了下nginx的配置,如下可以,访问,不知密码是多少:
http://blogtest.com/panel-user-login.html
Ok的Nginx配置如下:
说明通过tail看nginx的日志多么重要:
tail -f /data1/logs/nginx_error.log /data1/logs/access.log
The page you are looking for is temporarily unavailable.
Please try again later.
查看Nginx错误日志:
tail -f /data1/logs/nginx_error.log /data1/logs/access.log
==> /data1/logs/nginx_error.log <==
2013/07/03 18:17:50 [crit] 3728#0: *98 connect() to unix:/tmp/fcgi-blog.sock failed (13: Permission denied) while connecting to upstream, client: 192.168.137.1, server: blogtest.com, request: "GET /panel-user-login.html HTTP/1.1", upstream: "fastcgi://unix:/tmp/fcgi-blog.sock:", host: "blogtest.com"
==> /data1/logs/access.log <==
192.168.137.1 - - [03/Jul/2013:18:17:50 +0800] "GET /panel-user-login.html HTTP/1.1" 502 383 "-" "Mozilla/5.0 (Windows NT 6.1; rv:22.0) Gecko/20100101 Firefox/22.0"
ulimit -c unlimited
./cblog //产生core文件,core.5273
gdb cblog core.5273
----------------------------------
Core was generated by `./cblog'.
Program terminated with signal 11, Segmentation fault.
#0 0x00cab5e7 in tcmapput () from /usr/local/lib/libtokyocabinet.so.7
--------------------------------------------------------------------------------------------------
七夜 下午 05:21:33
不行,你不能这么gdb的
你 log 输出一下
就能知道了
====================================================================================
一)启动fastcgi:
/usr/local/webserver/fastcgi/spawn-fcgi/bin/spawn-fcgi -f /usr/local/htdocs/cblog -s /tmp/fcgi-blog.sock
spawn-fcgi: child spawned successfully: PID: 2251
chmod -R 777 /tmp/fcgi-blog.sock
二)进去后出现:
./templets/panel/category_update.html Error loading template file!
三)调试方法:
root@192.168.137.128:/usr/local/conf# strace -p 2251
Process 2251 attached - interrupt to quit
accept(0, {sa_family=AF_FILE, NULL}, [2]) = 5
select(6, [5], NULL, NULL, {2, 0}) = 1 (in [5], left {1, 999996})
read(5, "\1\1\0\1\0\10\0\0\0\1\0\0\0\0\0\0\1\4\0\1\4\1\7\0\f\0QUERY_"..., 8192) = 1072
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb77a0000
open("./templets/panel/category_insert.html", O_RDONLY) = -1 ENOENT (No such file or directory)
munmap(0xb77a0000, 4096)
=====================================================================================
没法读到模板的问题如下解决办法:
-------------------------------------------------------
七夜兄弟:
open("./templets/blog/article_list.html", O_RDONLY) = -1 ENOENT (No such file or directory)
./module/panel/article.c: if (tpl_load(tpl,"./templets/blog/article_list.html") != TPL_OK)
打开文件编译后,这个模板文件是相对于fastcgi这个程序是从哪儿开始算机的啊?
编译文件打开的模板文件你写的是相对路径,这个相对路径是相对的根目录是?
七夜 上午 11:13:12
/usr/local/htdocs/
你得在这个目录,你试试我的方法.
cd /usr/local/htdocs/
/usr/local/webserver/fastcgi/spawn-fcgi/bin/spawn-fcgi -f ./cblog -s /tmp/fcgi-blog.sock
spawn-fcgi: child spawned successfully: PID: 3639
这个sqllite备份怎么备份,
这玩意一个文件容易一出问题,整个文件里数据就挂了吧?
稳定性怎么样、如果真用sqlite的话。有没有办法提高其数据的安全这方面的经验。
七夜 上午 11:27:12
stop fastcgi. after copy sqlite3 db file to other path
安全,已经不在发布目录
所以不用担心会被浏览器下载什么的
七夜 上午 11:29:24
可能会有些小bug。大问题没有。我运行了一年
回忆未来-向东-Jàck 上午 11:30:13
像nginx下的php一样起多个。可以么?
七夜 上午 11:30:23
目前还不可以
回忆未来-向东-Jàck 上午 11:31:07
我看好像有个fastcgi命令可以起一个端口起来,有个参数是多少个进程的啊。
==========================================================
关于多个进程现在只有一个,可以再学习下。
下面关于后台的功能特别是那个缓存:
回忆未来-向东-Jàck 上午 11:32:26
这添加文章太快了,这种快感不错,比我在外面的博客快了进10倍,
这用户体验好啊。
清楚全部缓存
这个是什么意思,缓存在哪儿的?
七夜 上午 11:33:00
我会生成静态页的
列表页 首页 文章页
都会生成的静态页的
回忆未来-向东-Jàck 上午 11:33:20
生成首页
不就是么?
是自动生成的么,其他的静态页面。
首页要自己生成是吧?
七夜 上午 11:33:46
列表页 文章页 是自动生成的
访问生成的
回忆未来-向东-Jàck 上午 11:34:53
哈哈,好的,我有空再看下代码,学习一下,灰常感谢。
回忆未来-向东-Jàck 上午 11:36:34
tokyocabinet jemalloc 用在这儿是干嘛的?
好像是内存分配的是吧?这个jemalloc。它有什么好处?
这个tokyocabinet 是个什么玩意?是缓存吗。
七夜 上午 11:38:43
jemalloc 优化的 内存管理器
tokyocabinet 有现成的 map list封装
回忆未来-向东-Jàck 上午 11:39:30
这样就不容易内存泄漏和数据结构上也带来了处理方便是吧?我也学学。
七夜 上午 11:41:45
不是,jemalloc 主要是代替 libc的malloc 和free
内存泄漏 还是自己去管理
回忆未来-向东-Jàck 上午 11:42:09
仅仅是设想下像这种单个的fastcg进程i能支持并发多少 有没有过测试或估计哩?
七夜 上午 11:42:16
你可以压测一下
问下scottjiang兄弟这块的实践经验:
fastcgi只起一个进程,大概能支持并发多少啊?scottjiang兄弟。
location ~ \.html$ {
root /usr/local/htdocs;
fastcgi_pass unix:/tmp/fcgi-blog.sock;
fastcgi_index cblog;
include fastcgi_params;
}
有没有经验值啊?我想了解下这块。再就是怎么把这一个进程变多个啊。
江庆海 上午 11:50:24
可以在apache中配置最大进程数。根据你的业务请求量,一般配几十吧。
你google一下配置说明,应该有可以启动进程数,每个进程数处理最大并发个数、超时等配置。
nginx 不太熟啊,应该也是有的。
================================================
多个进程的参考方法如下:
1. nginx安装(略过)
2. FastCGI安装
因为nginx不能直接执行外部的cgi程序,我们可使用lighttpd中的spawn-fastcgi来让nginx可支持外部cgi运行。也有另外一种方法安装nginx-fcgi来让nginx支持cgi,我们这里讲解一种使用spawn-fastcgi的方法。
#include <iostream>
#include <fcgi_stdio.h>
#include <stdlib.h>
int main()
{
int count = 0;
while(FCGI_Accept() >= 0){
printf("Content-type: text/html\r\n"
"\r\n"
""
"FastCGI Hello!"
"Request number %d running on host%s "
"Process ID: %d\n", ++count, getenv("SERVER_NAME"), getpid());
}
return 0;
}
编译程序:g++ testcgi.c -o lzgFastCGI -lfcgi
测试程序是否能正常运行:./myFastCGI,如果能正常运行则说明程序没有问题,如果出现缺少库libfcgi.so.0,则自己需要手动把/usr/local/lib/libfcgi.so.0库建立一个链接到/usr/lib/目录下:ln -s /usr/local/libfcgi.so.0 /usr/lib/
3. nginx配置、测试
1) 拷贝lzgFastCGI程序到nginx下的cgibin目录(自己可以创建,根据需要更改)
2) 启动spawn-fastcgi管理进程
/usr/local/nginx/sbin/spawn-fcgi -a 127.0.0.1 -p 9002 -C 25 -f /usr/local/nginx/cgibin/lzgFastCGI
查看一下9002端口是否已成功:netstat -na | grep 9002
3) 更改nginx.conf配置文件
添加配置
location ~ \.cgi$ {
fastcgi_pass 127.0.0.1:9002;
fastcgi_index index.cgi;
fastcgi_param SCRIPT_FILENAME fcgi$fastcgi_script_name;
include fastcgi_params;
}
根据上面的文章进行实践是OK的:
/usr/local/nginx/sbin/spawn-fcgi -a 127.0.0.1 -p 9002 -C 25 -f /usr/local/nginx/cgibin/lzgFastCGI
cd /usr/local/htdocs/
/usr/local/webserver/fastcgi/spawn-fcgi/bin/spawn-fcgi -a 127.0.0.1 -p 9002 -C 25 -f ./cblog
实践OK的,Ok步骤如下:
root@192.168.137.128:/usr/local/htdocs# /usr/local/webserver/fastcgi/spawn-fcgi/bin/spawn-fcgi -a 127.0.0.1 -p 9002 -C 25 -f ./cblog
spawn-fcgi: child spawned successfully: PID: 4367
root@192.168.137.128:/usr/local/htdocs# netstat -atlunp|grep 9002
tcp 0 0 127.0.0.1:9002 0.0.0.0:* LISTEN 4367/./cblog
Nginx配置:
location ~ \.cgi$ { //这儿略有区别,是html都指向这个cgi了。
适当参考即可,和实际的情况均有出入:http://blog.csdn.net/qzier_go/article/details/7340868
http://terry831010.blog.163.com/blog/static/6916117120126185428827/
http://www.ha97.com/173.html
使用spawn-fcgi来控制php-cgi的FastCGI进程:
/usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -C 5 -u apache -g apache -f /usr/bin/php-cgi
参数含义如下:
-f <fcgiapp> 指定调用FastCGI的进程的执行程序位置,根据系统上所装的PHP的情况具体设置。
-a <addr> 绑定到地址addr。
-p <port> 绑定到端口port。
-s <path> 绑定到unix socket的路径path。
-C <childs> 指定产生的FastCGI的进程数,默认为5。(仅用于PHP)
-P <path> 指定产生的进程的PID文件路径。
-u和-g FastCGI使用什么身份(-u 用户 -g 用户组)运行,CentOS下可以使用apache用户,其他的根据情况配置,如nobody、www-data等。
实践来源:http://www.phpabc.cn/apachejie-he-spawn-fcgishi-yong-fastcgi.html
/usr/local/webserver/fastcgi/spawn-fcgi/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -C 5 -u apache -g www -f /usr/local/webserver/php/bin/php-cgi
spawn-fcgi: child spawned successfully: PID: 7551
ps aux|grep php
apache 7551 16.7 1.6 43396 6016 ? Ssl 15:14 0:01 /usr/local/webserver/php/bin/php-cgi
====================================================================================
Sqlite表查询相关实践:
root@192.168.137.128:/usr/local/db# sqlite3 blog.db
SQLite version 3.7.17 2013-05-20 00:56:22
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
1)查看表名
sqlite> .table
article category comment friendlink
2)查表内容:
sqlite> select * from category;
1|php|php|1
2|mysql|mysql|2
3|nosql|nosql|3
4|linux|linux|4
5|javascript|javascript|5
6||life|6
7||opensource|7
8|web2.0|web2.0|8
3)表结构:
sqlite> .schema category
CREATE TABLE [category] (
[sid] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
[sortname] VARCHAR(30) NOT NULL,
[sortdir] VARCHAR(30) NOT NULL,
[pos] INTEGER DEFAULT '0' NOT NULL
);
CREATE INDEX [IDX_CATEGORY_POS] ON [category](
[pos] ASC
);
4)退出sqliite
sqlite> .exit
————————————————Add:2013-12-10启动了1000个fastcgi进程————————————————
http://www.cnblogs.com/xiaouisme/archive/2012/08/01/2618398.html
步骤如下:
(1)代码情况:heloFastCGI.c
(2)make情况:makefile.sh
(3)建立目录步骤:step.txt
mkdir -p /usr/local/webserver/nginx/myFastCGI
cp helloFastCGI /usr/local/webserver/nginx/myFastCGI
/usr/local/webserver/nginx/sbin/spawn-fcgi -a 127.0.0.1 -p 9100 -C 25 -f
/usr/local/webserver/nginx/myFastCGI/helloFastCGI -F 1000
启动:
/usr/local/webserver/nginx/sbin/spawn-fcgi -a 127.0.0.1 -p 9100 -C 25 -f /usr/local/webserver/nginx/myFastCGI/helloFastCGI -F 1000
启动后:
root@192.168.137.128:/data0/htdocs/myfastcgi# ps aux|grep helloFastCGI |wc
1001 11012 115083
root@192.168.137.128:/data0/htdocs/myfastcgi# netstat -atlunp|grep 9100
tcp 0 0 127.0.0.1:9100 0.0.0.0:* LISTEN 5524/helloFastCGI
注意这是一行命令哦。注意可能要sudo.
-p是指定fastcgi控制器绑定的TCP端口listen的.
如果你想调试单个fastcgi程序,可以把-f换成-n.
-F指定spawn-fcgi将fork多少个child进程。之后nginx对于此cgi的请求就可以并发了。显然这里的直接并发量是1000.
其他参数可以help看看:(看起来-C对不要php的我来说没啥用.本文是初次使用记录性教程,这里就不纠结这些参数了)
关闭spawn-fcgi打开的fastcgi程序:
$ netstat -anp | grep 9000 #查看占用9000端口的程序ID
$ kill -9 PID #或killall 进程名
后面这些进程启动后,怎么和nginx对接上呢,需要进行配置文件研究修改即可,文章里有说明。
...........关于配置的说明:..............
1. .ginx收到cgi请求后,会看有多少个该cgi程序的进程(spawn-fcgi -F指定的参数),然后根据并发量来调用(调度)cgi程序。
2. 原版spawn-fcgi(可参考下面七参考资料里daemon版spawn-fcgi)在fork了cgi程序后,自己就退出了。这时fork了的cgi程序的父进程ID都是1了,即init系统进程。这样,如果想并发就需要你的fastcgi去支持并发,可google:fastcgi并发
3. 关于php,nginx是用fastcgi来解析php的。这个负责解析的fastcgi程序并不多,好像就1个,因此这cgi不能大并发,但是没关系nginx支持cgi缓存~所以php网页的并发请求跟fastcgi关系不大。其实可以把fastcgi对于php的作用当作一个编译器,编译完后,php都有了缓存,再请求就不需要再次跑fastcgi来解析php脚本了,php就是个该死的脚本啊~~
我自己也不知道讲清楚没。其实我自己也不知道自己清楚没。:-)
________________对cblog进行设置在原来基础上加上: -F 1000 ________________
root@192.168.137.128:/usr/local/htdocs# ps aux|grep cblog|wc
491 5402 35846
==============================================================
对其扩展为多个FastCGI的进程后分别以Unix socket和9002进行较为深入的研究并证明其调度及和程序里cookie在多进程里出现登录失败的问题研究
=======================================================================================
/usr/local/webserver/fastcgi/spawn-fcgi/bin/spawn-fcgi -f ./cblog -s /tmp/fcgi-blog.sock -F 3
/usr/local/webserver/fastcgi/spawn-fcgi/bin/spawn-fcgi -a 127.0.0.1 -p 9002 -C 25 -f ./cblog
以下结论:其写的blog不支持多个进程的登录,上面起了进程均后只有3个进程,而其中走的是unix socket不是端口有两个:2392、2394。
其它一个是端口:9002,它个没有疑义。对于2392、2394两个进程是可能被fastcgi轮流来接请求的,于是出现cookie登录失败,实践知而只起一个这样的进程ID号,不会存在这样的情况,估计其cookie没有写得兼容多个fastcgi罢。
同时发现只起动/usr/local/webserver/fastcgi/spawn-fcgi/bin/spawn-fcgi -f ./cblog -s /tmp/fcgi-blog.sock -F 3,出现其进程有时只有2个,说明程序相当不稳定,所以只能说是起研究之用:
root@192.168.137.128:/usr/local/webserver/nginx# sh /root/runfastcgi.sh
spawn-fcgi: child signaled: 11
spawn-fcgi: child spawned successfully: PID: 2638
spawn-fcgi: child spawned successfully: PID: 2639
root@192.168.137.128:/usr/local/webserver/nginx# sh /root/runfastcgi.sh
spawn-fcgi: child signaled: 11
spawn-fcgi: child spawned successfully: PID: 2655
spawn-fcgi: child spawned successfully: PID: 2656
root@192.168.137.128:/usr/local/webserver/nginx# sh /root/runfastcgi.sh
spawn-fcgi: child spawned successfully: PID: 2671
spawn-fcgi: child spawned successfully: PID: 2673
spawn-fcgi: child spawned successfully: PID: 2674
只启动上面这一个本地unix socket后出现,如果连接:http://blogtest2.com/panel-user-login.html 也就是9002出现:
The page you are looking for is temporarily unavailable.
Please try again later.
说明这两者:Unix socket和9002是独立的。
(第二:再次证明之反证。)反之,如只起用9002多个pid后,是什么情况?实践一下:
起3个依旧不稳定: /usr/local/webserver/fastcgi/spawn-fcgi/bin/spawn-fcgi -a 127.0.0.1 -p 9002 -C 25 -f ./cblog -F 3
root@192.168.137.128:/usr/local/webserver/nginx# sh /root/runfastcgi.sh
spawn-fcgi: child signaled: 8
spawn-fcgi: child spawned successfully: PID: 2736
spawn-fcgi: child spawned successfully: PID: 2737
root@192.168.137.128:/usr/local/webserver/nginx# sh /root/runfastcgi.sh
spawn-fcgi: child signaled: 11
spawn-fcgi: child spawned successfully: PID: 2752
spawn-fcgi: child spawned successfully: PID: 2753
root@192.168.137.128:/usr/local/webserver/nginx# sh /root/runfastcgi.sh
spawn-fcgi: child spawned successfully: PID: 2763
spawn-fcgi: child spawned successfully: PID: 2765
spawn-fcgi: child spawned successfully: PID: 2766
此时访问 Unix socket出现得到确实是独立的再次证晨:
http://blogtest.com/panel-user-login.html The page you are looking for is temporarily unavailable.Please try again later.
root@192.168.137.128:/usr/local/webserver/nginx# strace -p 2763 -p 2765
http://blogtest2.com/panel-user-login.html
Process 2763 attached - interrupt to quit
Process 2765 attached - interrupt to quit
[pid 2765] accept(0, <unfinished ...>
[pid 2763] accept(0, {sa_family=AF_INET, sin_port=htons(56906), sin_addr=inet_addr("127.0.0.1")}, [16]) = 5
[pid 2763] setsockopt(5, SOL_TCP, TCP_NODELAY, [1], 4) = 0
[pid 2763] read(5, "\1\1\0\1\0\10\0\0\0\1\0\0\0\0\0\0\1\4\0\1\3\277\1\0\17\32SCRIPT"..., 8192) = 1000
[pid 2763] time(NULL) = 1386912681
[pid 2763] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb778e000
[pid 2763] munmap(0xb778e000, 4096) = 0
[pid 2763] write(5, "\1\6\0\1\0005\3\0X-Accel-Redirect: /templ"..., 88) = 88
[pid 2763] shutdown(5, 1 /* send */) = 0
[pid 2763] select(6, [5], NULL, NULL, {2, 0}) = 1 (in [5], left {1, 999995})
[pid 2763] read(5, "", 1024) = 0
[pid 2763] close(5) = 0
[pid 2763] accept(0,
登录action:
[pid 2765] <... accept resumed> {sa_family=AF_INET, sin_port=htons(56908), sin_addr=inet_addr("127.0.0.1")}, [16]) = 5
[pid 2765] setsockopt(5, SOL_TCP, TCP_NODELAY, [1], 4) = 0
[pid 2765] read(5, "\1\1\0\1\0\10\0\0\0\1\0\0\0\0\0\0\1\4\0\1\4f\2\0\17\32SCRIPT"..., 8192) = 1240
[pid 2765] time(NULL) = 1386912715
[pid 2765] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7758000
[pid 2765] gettimeofday({1386912715, 783922}, NULL) = 0
[pid 2765] open("/dev/urandom", O_RDONLY|O_LARGEFILE) = 6
[pid 2765] fcntl64(6, F_GETFD) = 0
[pid 2765] fcntl64(6, F_SETFD, FD_CLOEXEC) = 0
[pid 2765] getuid32() = 0
[pid 2765] getppid() = 1
[pid 2765] gettimeofday({1386912715, 801719}, NULL) = 0
[pid 2765] gettimeofday({1386912715, 802502}, NULL) = 0
[pid 2765] read(6, "\304\264\345M\0?\352V\4\320\323\257u$\16\325", 16) = 16
[pid 2765] gettid() = 2765
[pid 2765] time(NULL) = 1386912715
[pid 2765] open("/etc/localtime", O_RDONLY) = 7
[pid 2765] fstat64(7, {st_mode=S_IFREG|0644, st_size=405, ...}) = 0
[pid 2765] fstat64(7, {st_mode=S_IFREG|0644, st_size=405, ...}) = 0
[pid 2765] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7757000
[pid 2765] read(7, "TZif2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\0\0\0\3\0\0\0\0"..., 4096) = 405
[pid 2765] _llseek(7, -7, [398], SEEK_CUR) = 0
[pid 2765] read(7, "\nCST-8\n", 4096) = 7
[pid 2765] close(7) = 0
[pid 2765] munmap(0xb7757000, 4096) = 0
[pid 2765] munmap(0xb7758000, 4096) = 0
[pid 2765] write(5, "\1\6\0\1\0\274\4\0Set-Cookie: session=05ef"..., 224) = 224
[pid 2765] shutdown(5, 1 /* send */) = 0
[pid 2765] select(6, [5], NULL, NULL, {2, 0}) = 1 (in [5], left {1, 999994})
[pid 2765] read(5, "", 1024) = 0
[pid 2765] close(5) = 0
[pid 2765] accept(0,
跳转到管理页面又变回2763:
[pid 2763] <... accept resumed> {sa_family=AF_INET, sin_port=htons(56909), sin_addr=inet_addr("127.0.0.1")}, [16]) = 5
[pid 2763] setsockopt(5, SOL_TCP, TCP_NODELAY, [1], 4) = 0
[pid 2763] read(5, "\1\1\0\1\0\10\0\0\0\1\0\0\0\0\0\0\1\4\0\1\3\374\4\0\17\36SCRIPT"..., 8192) = 1064
[pid 2763] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb778e000
[pid 2763] munmap(0xb778e000, 4096) = 0
[pid 2763] write(5, "\1\6\0\1\0m\3\0Content-type: text/html\r"..., 144) = 144
[pid 2763] shutdown(5, 1 /* send */) = 0
[pid 2763] select(6, [5], NULL, NULL, {2, 0}) = 1 (in [5], left {1, 999150})
[pid 2763] read(5, "", 1024) = 0
[pid 2763] close(5) = 0
[pid 2763] accept(0,
说明这个第一个Unix的socket也好,9002端口也好,都存在我们常说的一个问题就是都会通过fastcgi协议分派到不同的进程中去处理,是有统一调度的!!!
第二:两者是独立的,一个是访问句柄,一个是访问端口进行通讯,独立而不干扰。但是这块七夜写的Cookie的登录判断这块可能写得不够严谨,有时间得看下这块的代码实现才行,同时借鉴PHP的cookie实现机制才能实现真正的cookie在多进程下不会出现失效的问题。EOF
——————第一:混合的情况:Unix Socket和9002同时————
作登录请求
root@192.168.137.128:~# sh /root/runfastcgi.sh
spawn-fcgi: child spawned successfully: PID: 2386
spawn-fcgi: child spawned successfully: PID: 2392
spawn-fcgi: child spawned successfully: PID: 2394
spawn-fcgi: child spawned successfully: PID: 2395
root@192.168.137.128:~# ps aux|grep cblog
root 2386 0.0 0.2 13868 1112 ? Ssl 13:15 0:00 ./cblog
root 2392 0.0 0.2 13868 1112 ? Ssl 13:15 0:00 ./cblog
root 2394 0.0 0.2 13868 1112 ? Ssl 13:15 0:00 ./cblog
root@192.168.137.128:~# strace -p 2386 -p 2392 -p 2394
从:http://blogtest2.com/panel-user-login.html
到登录:登陆成功!的action都是:2386进程在干(见:)。
root@192.168.137.128:~# strace -p 2386 -p 2392 -p 2394
Process 2386 attached - interrupt to quit
Process 2392 attached - interrupt to quit
Process 2394 attached - interrupt to quit
[pid 2394] accept(0, <unfinished ...>
[pid 2392] accept(0, <unfinished ...>
[pid 2386] accept(0, {sa_family=AF_INET, sin_port=htons(56887), sin_addr=inet_addr("127.0.0.1")}, [16]) = 5
[pid 2386] setsockopt(5, SOL_TCP, TCP_NODELAY, [1], 4) = 0
[pid 2386] read(5, "\1\1\0\1\0\10\0\0\0\1\0\0\0\0\0\0\1\4\0\1\3\221\7\0\17\32SCRIPT"..., 8192) = 960
[pid 2386] time(NULL) = 1386911788
[pid 2386] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb77d3000
[pid 2386] munmap(0xb77d3000, 4096) = 0
[pid 2386] write(5, "\1\6\0\1\0005\3\0X-Accel-Redirect: /templ"..., 88) = 88
[pid 2386] shutdown(5, 1 /* send */) = 0
[pid 2386] select(6, [5], NULL, NULL, {2, 0}) = 1 (in [5], left {1, 999727})
[pid 2386] read(5, "", 1024) = 0
[pid 2386] close(5) = 0
[pid 2386] accept(0, {sa_family=AF_INET, sin_port=htons(56889), sin_addr=inet_addr("127.0.0.1")}, [16]) = 5
[pid 2386] setsockopt(5, SOL_TCP, TCP_NODELAY, [1], 4) = 0
[pid 2386] read(5, "\1\1\0\1\0\10\0\0\0\1\0\0\0\0\0\0\1\4\0\1\0048\0\0\17\32SCRIPT"..., 8192) = 1192
[pid 2386] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb77d3000
[pid 2386] gettimeofday({1386911862, 145842}, NULL) = 0
[pid 2386] open("/dev/urandom", O_RDONLY|O_LARGEFILE) = 6
[pid 2386] fcntl64(6, F_GETFD) = 0
[pid 2386] fcntl64(6, F_SETFD, FD_CLOEXEC) = 0
[pid 2386] getuid32() = 0
[pid 2386] getppid() = 1
[pid 2386] gettimeofday({1386911862, 155096}, NULL) = 0
[pid 2386] gettimeofday({1386911862, 155738}, NULL) = 0
[pid 2386] read(6, "\3218\03774\374\342\3\f\330\377M{\214y\24", 16) = 16
[pid 2386] gettid() = 2386
[pid 2386] time(NULL) = 1386911862
[pid 2386] open("/etc/localtime", O_RDONLY) = 7
[pid 2386] fstat64(7, {st_mode=S_IFREG|0644, st_size=405, ...}) = 0
[pid 2386] fstat64(7, {st_mode=S_IFREG|0644, st_size=405, ...}) = 0
[pid 2386] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb77d2000
[pid 2386] read(7, "TZif2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\0\0\0\3\0\0\0\0"..., 4096) = 405
[pid 2386] _llseek(7, -7, [398], SEEK_CUR) = 0
[pid 2386] read(7, "\nCST-8\n", 4096) = 7
[pid 2386] close(7) = 0
[pid 2386] munmap(0xb77d2000, 4096) = 0
[pid 2386] munmap(0xb77d3000, 4096) = 0
[pid 2386] write(5, "\1\6\0\1\0\274\4\0Set-Cookie: session=44ad"..., 224) = 224
[pid 2386] shutdown(5, 1 /* send */) = 0
[pid 2386] select(6, [5], NULL, NULL, {2, 0}) = 1 (in [5], left {1, 982622})
[pid 2386] read(5, "", 1024) = 0
[pid 2386] close(5) = 0
[pid 2386] accept(0,
登录后进入管理:还是2386
方式:fastcgi_pass 127.0.0.1:9002;
http://blogtest.com/panel-user-login.html
[pid 2392] <... accept resumed> {sa_family=AF_FILE, NULL}, [2]) = 5
[pid 2392] select(6, [5], NULL, NULL, {2, 0}) = 1 (in [5], left {1, 999999})
[pid 2392] read(5, "\1\1\0\1\0\10\0\0\0\1\0\0\0\0\0\0\1\4\0\1\3\211\7\0\f\0QUERY_"..., 8192) = 952
[pid 2392] time(NULL) = 1386912018
[pid 2392] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7796000
[pid 2392] munmap(0xb7796000, 4096) = 0
[pid 2392] write(5, "\1\6\0\1\0005\3\0X-Accel-Redirect: /templ"..., 88) = 88
[pid 2392] shutdown(5, 1 /* send */) = 0
[pid 2392] select(6, [5], NULL, NULL, {2, 0}) = 1 (in [5], left {1, 999999})
[pid 2392] read(5, "", 1024) = 0
[pid 2392] close(5) = 0
[pid 2392] accept(0,
提交action:
[pid 2394] <... accept resumed> {sa_family=AF_FILE, NULL}, [2]) = 5
[pid 2394] select(6, [5], NULL, NULL, {2, 0}) = 1 (in [5], left {1, 999991})
[pid 2394] read(5, "\1\1\0\1\0\10\0\0\0\1\0\0\0\0\0\0\1\4\0\1\4/\1\0\f\0QUERY_"..., 8192) = 1184
[pid 2394] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb77dc000
[pid 2394] gettimeofday({1386912056, 976899}, NULL) = 0
[pid 2394] open("/dev/urandom", O_RDONLY|O_LARGEFILE) = 6
[pid 2394] fcntl64(6, F_GETFD) = 0
[pid 2394] fcntl64(6, F_SETFD, FD_CLOEXEC) = 0
[pid 2394] getuid32() = 0
[pid 2394] getppid() = 1
[pid 2394] gettimeofday({1386912056, 978495}, NULL) = 0
[pid 2394] gettimeofday({1386912056, 978630}, NULL) = 0
[pid 2394] read(6, "\366\377\210C\247\350\367\231\221a7\271sE}\251", 16) = 16
[pid 2394] gettid() = 2394
[pid 2394] time(NULL) = 1386912056
[pid 2394] open("/etc/localtime", O_RDONLY) = 7
[pid 2394] fstat64(7, {st_mode=S_IFREG|0644, st_size=405, ...}) = 0
[pid 2394] fstat64(7, {st_mode=S_IFREG|0644, st_size=405, ...}) = 0
[pid 2394] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb77db000
[pid 2394] read(7, "TZif2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\0\0\0\3\0\0\0\0"..., 4096) = 405
[pid 2394] _llseek(7, -7, [398], SEEK_CUR) = 0
[pid 2394] read(7, "\nCST-8\n", 4096) = 7
[pid 2394] close(7) = 0
[pid 2394] munmap(0xb77db000, 4096) = 0
[pid 2394] munmap(0xb77dc000, 4096) = 0
[pid 2394] write(5, "\1\6\0\1\0\274\4\0Set-Cookie: session=c605"..., 224) = 224
[pid 2394] shutdown(5, 1 /* send */) = 0
[pid 2394] select(6, [5], NULL, NULL, {2, 0}) = 1 (in [5], left {1, 999992})
[pid 2394] read(5, "", 1024) = 0
[pid 2394] close(5) = 0
[pid 2394] accept(0,
http://blogtest.com/cpanel.htm [未登录]
[pid 2392] <... accept resumed> {sa_family=AF_FILE, NULL}, [2]) = 5
[pid 2392] select(6, [5], NULL, NULL, {2, 0}) = 1 (in [5], left {1, 999989})
[pid 2392] read(5, "\1\1\0\1\0\10\0\0\0\1\0\0\0\0\0\0\1\4\0\1\3\357\1\0\f\0QUERY_"..., 8192) = 1048
[pid 2392] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7796000
[pid 2392] munmap(0xb7796000, 4096) = 0
[pid 2392] write(5, "\1\6\0\1\0m\3\0Content-type: text/html\r"..., 144) = 144
[pid 2392] shutdown(5, 1 /* send */) = 0
[pid 2392] select(6, [5], NULL, NULL, {2, 0}) = 1 (in [5], left {1, 999993})
[pid 2392] read(5, "", 1024) = 0
[pid 2392] close(5) = 0
[pid 2392] accept(0,
方式:fastcgi_pass unix:/tmp/fcgi-blog.sock;
[安全扫描]记录在案的一些需要禁用的PHP危险函数
Php/Js/Shell/Go jackxiang 2013-5-17 10:04
背景:外包项目代码审查主要是对delete相关,where里的索引,再就是对相关函数的检查,其SQL注入等,一般框架有很好的支持和过滤,这块弱化,但上线得提交一下安全扫描来弥补,对这些函数最好是用linux的grep来实现,简单点的如下:。
更详细的去svn目录的(新版本的svn好像没有了),最好去那个开发的目录grep,否则出一堆乱七八糟的东东出来:
当然也可以自己编写脚本实现,用一个系统来完成也成。
阅读全文
更详细的去svn目录的(新版本的svn好像没有了),最好去那个开发的目录grep,否则出一堆乱七八糟的东东出来:
当然也可以自己编写脚本实现,用一个系统来完成也成。
阅读全文
背景:手机抓apk产生的日志包,及用adb对包进行更新、安装操作及adb里进行tcpdump是非常有用的操作,分两个大步骤去讲。
==========第一大步骤:试图在eclipse里用logcat抓手机里的包=============
Eclipse下配置LogCat步骤及可能出现的问题解决:
一)挂载android的sdk,logcat和那个ddms都在里面:
eclipse下的菜单:windows下有一个;preferences里有一个Android,里有一个:
sdk location:选:D:\Program Files\adt-bundle-windows-x86-20130219\sdk。
(在eclipse里windows ->preference 找不到android这个选项,是啥原图?没装eclipse的android插件,后面会讲。)
(D:\Program Files\adt-bundle-windows-x86-20130219\sdk\tools\ddms.bat)
二)打开DDMS 会自动调出logcat:
Eclipse 用DDMS 调试Android 程序,抓android手机连接电脑里的包,
单击window->open Pespective 里面应该有,没有就到other里找到ddms,这个前提是要安装eclipse的安卓插件。
logcat在:windows->show view->ohter->logcat(没有就在输入框里输入就能找到,前提是要安装了eclipse的android插件。)
来自:http://zhidao.baidu.com/link?url=IjJjp4Y3An_C25G3BDfQvj66WRsUlAAHvubwmM-DYOhRv8WEIpqWToykpNElwfO_rf8sxvBsrQPXyBYtA2myqa
关于,加入写代码如何调试?
Log.v(String tag, String msg);
Log.d(String tag, String msg);
Log.i(String tag, String msg);
Log.w(String tag, String msg);
Log.e(String tag, String msg);
这 5种方法的首字母分别对应VERBOSE、DEBUG、INFO、WARN、ERROR。当利用DDMS进行调试时,它们的区别并不大,只是显示的颜色不 同,我们可以控制要显示的某一类错误,一般我们如果使用'断点'方式来调试程序,则使用Log.e比较合适。但是根据规范建议Log.v,Log.d信息 应当只存在于开发过程中,最终版本只可以包含Log.i, Log.w,Log.e这三种日志信息。
http://blog.sina.com.cn/s/blog_53a99cf30100tha3.html
eclipse的DDMS中找不到安卓模拟设备?怎么办:
其一:
1. 打开cmd命令行,切换到adb命令目录,如果你已经加入了环境变量,切换目录就省了。
2. 输入命令:adb kill-server,adb被杀死了。
3. 接着输入命令:adb start-server,重新启动adb。
4. 再用adb devices命令,是不是看到设备了。
主要原因是可能某个程序占用了adb端口,操作一下下面方法:
5037为adb默认端口 查看该端口情况如下:
netstat -aon|findstr "5037"
TCP 127.0.0.1:5037 0.0.0.0:0 LISTENING 6540
找到那个程序,kill掉。在cmd命令行下输入taskkill /pid 7024 /f
实践如下:
C:\Users\admin>netstat -ano|findstr 5037
TCP 127.0.0.1:5037 0.0.0.0:0 LISTENING 4296
TCP 127.0.0.1:5037 127.0.0.1:36183 TIME_WAIT 0
TCP 127.0.0.1:5037 127.0.0.1:36184 TIME_WAIT 0
TCP 127.0.0.1:5037 127.0.0.1:36186 TIME_WAIT 0
TCP 127.0.0.1:5037 127.0.0.1:36188 TIME_WAIT 0
C:\Users\admin>taskkill /pid 4296 /f
成功: 已终止 PID 为 4296 的进程。
C:\Users\admin>netstat -ano|findstr 5037 //还有,是tcp协议上的事情一会就没了。
TCP 127.0.0.1:5037 127.0.0.1:36859 TIME_WAIT 0
TCP 127.0.0.1:5037 127.0.0.1:36860 TIME_WAIT 0
TCP 127.0.0.1:5037 127.0.0.1:36861 TIME_WAIT 0
TCP 127.0.0.1:5037 127.0.0.1:36862 TIME_WAIT 0
TIME_WAIT里这儿有说明,里面的图:
http://blog.csdn.net/mhfh611/article/details/8769617
三)在ddms里的logcat对包过滤:
在左下可以选:save filters,加一个PID,就是进程Id进行过滤,这样就好弄多了,
可以对某个进程进行过滤了。(在Logcat选项卡中就能看到Saved Filters处点击那个绿色的加号+,然后看改成如下截图:(把下图中的包名换成你app的包名即可)
)
==========直接ddms.bat不使用eclipse===============
D:\Program Files\adt-bundle-windows-x86-20130219\sdk\tools\ddms.bat
adb start-server
——————————————————————————————————————————————————————
在eclipse里windows ->preference 找不到android这个选项,是啥原图:
因为 (http://jingyan.baidu.com/article/7908e85c6b4a52af481ad2ee.html)
里的google插件被屏蔽了,在eclipse里的update里的插件地址给国内国家防火墙屏蔽了(https://dl-ssl.google.com/android/eclipse/(如果出错,请将https改成http))打不开了,于是否,
直接用ddms,eclipse其实就是集成这个ddms到里面了,位置如下:D:\Program Files\adt-bundle-windows-x86-20130219\sdk\tools\ddms.bat 双击即可。
如果,非要从国外下载下来得设置代理:
Eclipse Update时代理设置,androidSDK 和 eclipse 的下载安装和代理设置:更新或安装插件前最好看一下代理,打开 windows/preference 看到这个配置:general network connection.....
这里可以设置你的代理,设置好代理的IP和端口就可以了。eclipse很智能,能检测你正在打开的代理,然后自动帮你配置好,但以防万一还是打开看看是否配置正确了。
然后安装插件即可 就是 help/install new software ,地址:http://dl-ssl.google.com/android/eclipse
来自:http://my.oschina.net/tdONEmadao/blog/281873?p={{currentPage-1}}
http://dl-ssl.google.com/android/eclipse/ 无法访问的解决办法:
很明显,国内网络和谐掉了google这个服务器,可以强制指向下Host ,以下是添加内容:
74.125.237.1 dl-ssl.google.com
具体操作方式:http://blog.163.com/angel_boa/blog/static/1906800912014015105249315/
点击桌面左下角开始菜单中的搜索,把以下路径,复制到搜索窗口中,c:\windows\system32\drivers\etc,点击立即搜索 ,就找到该文件,其实是一个纯文本的文件,
1、用记事本打开
2、将:203.208.46.146 dl-ssl.google.com 添加至最后一行
3、保存关闭Host
android sdk代理设置:
D:\Program Files\adt-bundle-windows-x86-20130219\SDK Manager.exe 打开后:tools->option ->http proxy(others force to https...)
——————————————————————————————————————————————————————————————
摘自:
http://bbs.51cto.com/thread-947038-1.html
=============第二大步骤:Adb控制手机里的应用应用程序及抓包=============
1.如何用adb获得手机里面某个apk的应用信息、版本信息
adb shell dumpsys package com.examle.xx
adb shell dumpsys 列出所有
2 如何用adb启动apk
adb shell am start -n breakan.test/breakan.test.TestActivity
卸载一个apk包方法:
adb uninstall SpareParts.apk
3.获取进程列表好删掉这些安装包:
删除程序方法一:
C:\Users\admin>adb shell pm list packages
package:com.baidu.searchbox
...
...
adb uninstall com.baidu.searchbox
http://mytiankong.com/?p=11755
删除程序之方法二:
需要安卓设备已ROOT,电脑已安装adb工具,直接删除程序包,
adb shell ls /system/app/ //查看系统apk列表
adb remount //挂载读写权限
adb shell rm /system/app/browser.apk //删除程序
adb shell rm /system/app/browser.apk回车,这个程序就被删除了,删除其它的程序把browser.apk改成需要删除的程序名即可,有些设备系统程序还有odex文件,也需要同时删除。
http://sspai.com/23641
会提示失败
原因在于安装后的包名已将改变,变为AndroidMainifest.xml文件中<manifest>节点下,package元素所指定的名字
正确方法是(后面这个;com.andorid什么的运行后通过logcat能够看到apk的日志):
adb uninstall com.android.spare_parts
完成!
摘自:http://blog.csdn.net/ydt_lwj/article/details/7766742
阅读全文
==========第一大步骤:试图在eclipse里用logcat抓手机里的包=============
Eclipse下配置LogCat步骤及可能出现的问题解决:
一)挂载android的sdk,logcat和那个ddms都在里面:
eclipse下的菜单:windows下有一个;preferences里有一个Android,里有一个:
sdk location:选:D:\Program Files\adt-bundle-windows-x86-20130219\sdk。
(在eclipse里windows ->preference 找不到android这个选项,是啥原图?没装eclipse的android插件,后面会讲。)
(D:\Program Files\adt-bundle-windows-x86-20130219\sdk\tools\ddms.bat)
二)打开DDMS 会自动调出logcat:
Eclipse 用DDMS 调试Android 程序,抓android手机连接电脑里的包,
单击window->open Pespective 里面应该有,没有就到other里找到ddms,这个前提是要安装eclipse的安卓插件。
logcat在:windows->show view->ohter->logcat(没有就在输入框里输入就能找到,前提是要安装了eclipse的android插件。)
来自:http://zhidao.baidu.com/link?url=IjJjp4Y3An_C25G3BDfQvj66WRsUlAAHvubwmM-DYOhRv8WEIpqWToykpNElwfO_rf8sxvBsrQPXyBYtA2myqa
关于,加入写代码如何调试?
Log.v(String tag, String msg);
Log.d(String tag, String msg);
Log.i(String tag, String msg);
Log.w(String tag, String msg);
Log.e(String tag, String msg);
这 5种方法的首字母分别对应VERBOSE、DEBUG、INFO、WARN、ERROR。当利用DDMS进行调试时,它们的区别并不大,只是显示的颜色不 同,我们可以控制要显示的某一类错误,一般我们如果使用'断点'方式来调试程序,则使用Log.e比较合适。但是根据规范建议Log.v,Log.d信息 应当只存在于开发过程中,最终版本只可以包含Log.i, Log.w,Log.e这三种日志信息。
http://blog.sina.com.cn/s/blog_53a99cf30100tha3.html
eclipse的DDMS中找不到安卓模拟设备?怎么办:
其一:
1. 打开cmd命令行,切换到adb命令目录,如果你已经加入了环境变量,切换目录就省了。
2. 输入命令:adb kill-server,adb被杀死了。
3. 接着输入命令:adb start-server,重新启动adb。
4. 再用adb devices命令,是不是看到设备了。
主要原因是可能某个程序占用了adb端口,操作一下下面方法:
5037为adb默认端口 查看该端口情况如下:
netstat -aon|findstr "5037"
TCP 127.0.0.1:5037 0.0.0.0:0 LISTENING 6540
找到那个程序,kill掉。在cmd命令行下输入taskkill /pid 7024 /f
实践如下:
C:\Users\admin>netstat -ano|findstr 5037
TCP 127.0.0.1:5037 0.0.0.0:0 LISTENING 4296
TCP 127.0.0.1:5037 127.0.0.1:36183 TIME_WAIT 0
TCP 127.0.0.1:5037 127.0.0.1:36184 TIME_WAIT 0
TCP 127.0.0.1:5037 127.0.0.1:36186 TIME_WAIT 0
TCP 127.0.0.1:5037 127.0.0.1:36188 TIME_WAIT 0
C:\Users\admin>taskkill /pid 4296 /f
成功: 已终止 PID 为 4296 的进程。
C:\Users\admin>netstat -ano|findstr 5037 //还有,是tcp协议上的事情一会就没了。
TCP 127.0.0.1:5037 127.0.0.1:36859 TIME_WAIT 0
TCP 127.0.0.1:5037 127.0.0.1:36860 TIME_WAIT 0
TCP 127.0.0.1:5037 127.0.0.1:36861 TIME_WAIT 0
TCP 127.0.0.1:5037 127.0.0.1:36862 TIME_WAIT 0
TIME_WAIT里这儿有说明,里面的图:
http://blog.csdn.net/mhfh611/article/details/8769617
三)在ddms里的logcat对包过滤:
在左下可以选:save filters,加一个PID,就是进程Id进行过滤,这样就好弄多了,
可以对某个进程进行过滤了。(在Logcat选项卡中就能看到Saved Filters处点击那个绿色的加号+,然后看改成如下截图:(把下图中的包名换成你app的包名即可)
)
==========直接ddms.bat不使用eclipse===============
D:\Program Files\adt-bundle-windows-x86-20130219\sdk\tools\ddms.bat
adb start-server
——————————————————————————————————————————————————————
在eclipse里windows ->preference 找不到android这个选项,是啥原图:
因为 (http://jingyan.baidu.com/article/7908e85c6b4a52af481ad2ee.html)
里的google插件被屏蔽了,在eclipse里的update里的插件地址给国内国家防火墙屏蔽了(https://dl-ssl.google.com/android/eclipse/(如果出错,请将https改成http))打不开了,于是否,
直接用ddms,eclipse其实就是集成这个ddms到里面了,位置如下:D:\Program Files\adt-bundle-windows-x86-20130219\sdk\tools\ddms.bat 双击即可。
如果,非要从国外下载下来得设置代理:
Eclipse Update时代理设置,androidSDK 和 eclipse 的下载安装和代理设置:更新或安装插件前最好看一下代理,打开 windows/preference 看到这个配置:general network connection.....
这里可以设置你的代理,设置好代理的IP和端口就可以了。eclipse很智能,能检测你正在打开的代理,然后自动帮你配置好,但以防万一还是打开看看是否配置正确了。
然后安装插件即可 就是 help/install new software ,地址:http://dl-ssl.google.com/android/eclipse
来自:http://my.oschina.net/tdONEmadao/blog/281873?p={{currentPage-1}}
http://dl-ssl.google.com/android/eclipse/ 无法访问的解决办法:
很明显,国内网络和谐掉了google这个服务器,可以强制指向下Host ,以下是添加内容:
74.125.237.1 dl-ssl.google.com
具体操作方式:http://blog.163.com/angel_boa/blog/static/1906800912014015105249315/
点击桌面左下角开始菜单中的搜索,把以下路径,复制到搜索窗口中,c:\windows\system32\drivers\etc,点击立即搜索 ,就找到该文件,其实是一个纯文本的文件,
1、用记事本打开
2、将:203.208.46.146 dl-ssl.google.com 添加至最后一行
3、保存关闭Host
android sdk代理设置:
D:\Program Files\adt-bundle-windows-x86-20130219\SDK Manager.exe 打开后:tools->option ->http proxy(others force to https...)
——————————————————————————————————————————————————————————————
摘自:
http://bbs.51cto.com/thread-947038-1.html
=============第二大步骤:Adb控制手机里的应用应用程序及抓包=============
1.如何用adb获得手机里面某个apk的应用信息、版本信息
adb shell dumpsys package com.examle.xx
adb shell dumpsys 列出所有
2 如何用adb启动apk
adb shell am start -n breakan.test/breakan.test.TestActivity
卸载一个apk包方法:
adb uninstall SpareParts.apk
3.获取进程列表好删掉这些安装包:
删除程序方法一:
C:\Users\admin>adb shell pm list packages
package:com.baidu.searchbox
...
...
adb uninstall com.baidu.searchbox
http://mytiankong.com/?p=11755
删除程序之方法二:
需要安卓设备已ROOT,电脑已安装adb工具,直接删除程序包,
adb shell ls /system/app/ //查看系统apk列表
adb remount //挂载读写权限
adb shell rm /system/app/browser.apk //删除程序
adb shell rm /system/app/browser.apk回车,这个程序就被删除了,删除其它的程序把browser.apk改成需要删除的程序名即可,有些设备系统程序还有odex文件,也需要同时删除。
http://sspai.com/23641
会提示失败
原因在于安装后的包名已将改变,变为AndroidMainifest.xml文件中<manifest>节点下,package元素所指定的名字
正确方法是(后面这个;com.andorid什么的运行后通过logcat能够看到apk的日志):
adb uninstall com.android.spare_parts
完成!
摘自:http://blog.csdn.net/ydt_lwj/article/details/7766742
阅读全文
背景: 要点是:各互联网公司的业务在对Oauth2.0的实现上并没有完全按照Oauth2.0的标准来做。 我最近也在研究这一块发现确实也有这样的问题,作下备案。
Oauth2.0相比较Oauth1.0步骤简化,通过HTTPS和限制回调地址来提高安全性。但是各互联网公司的业务在对Oauth2.0的实现上并没有完全按照Oauth2.0的标准来做。所以就会有一些问题存在。比如对回调地址限制不严格就会造成问题。
详细的步骤如下:
1、结合www.hack6.com
2、百度账号可以登录qunar网站,通过百度账号连接服务
3、授权模式中的Implicit grant模式只需要client_id和redirect_uri就可以完成账号的授权流程,从而把获取到的access_token返回到redirect_uri页面中
4、构造如下的URL:
http://openapi.baidu.com/oauth/2.0/authorize?scope=super_msg&response_type=token&client_id=RCKbWANx8KewnXs9rwGWFtZV&redirect_uri=http://lvtu.qunar.com/mobile_ugc/web/album.htm?albumId=4228
client_id为qunar网的百度应用ID
redirect_uri为获取access_token后的回调地址
response_type=token是采用Implicit grant授权模式
scope为申请的权限
5、可以把该地址发给他人诱使别人连接,最方便的利用是结合点击劫持来让用户完成授权流程。从而劫持到用户的access_token
6、获取到的token可以利用api接口来操作该账号(百度的api少的可怜)。
下面图是劫持后的。
修复方案:
1、最好是严格限制redirect_uri,我知道很难。
2、可以在授权页面加入放点击劫持代码,降低风险
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
现在访问第四步里构造如下的URL地址,出现如下提示:
错误码:1107
错误信息:Invalid Referer
详细描述:当前页面的Referer错误。使用Implicit Grant方式获取Access Token时,Referer必须与应用的根域名绑定同域,请在开发者在应用安全设置中进行绑定。
本文章原创来自:http://www.hack6.com/wzle/gf/2012/baidukaifangpingtaioauthshouquanjiekoukeyijiechiaccess_token_2525525255.html
Oauth2.0相比较Oauth1.0步骤简化,通过HTTPS和限制回调地址来提高安全性。但是各互联网公司的业务在对Oauth2.0的实现上并没有完全按照Oauth2.0的标准来做。所以就会有一些问题存在。比如对回调地址限制不严格就会造成问题。
详细的步骤如下:
1、结合www.hack6.com
2、百度账号可以登录qunar网站,通过百度账号连接服务
3、授权模式中的Implicit grant模式只需要client_id和redirect_uri就可以完成账号的授权流程,从而把获取到的access_token返回到redirect_uri页面中
4、构造如下的URL:
http://openapi.baidu.com/oauth/2.0/authorize?scope=super_msg&response_type=token&client_id=RCKbWANx8KewnXs9rwGWFtZV&redirect_uri=http://lvtu.qunar.com/mobile_ugc/web/album.htm?albumId=4228
client_id为qunar网的百度应用ID
redirect_uri为获取access_token后的回调地址
response_type=token是采用Implicit grant授权模式
scope为申请的权限
5、可以把该地址发给他人诱使别人连接,最方便的利用是结合点击劫持来让用户完成授权流程。从而劫持到用户的access_token
6、获取到的token可以利用api接口来操作该账号(百度的api少的可怜)。
下面图是劫持后的。
修复方案:
1、最好是严格限制redirect_uri,我知道很难。
2、可以在授权页面加入放点击劫持代码,降低风险
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
现在访问第四步里构造如下的URL地址,出现如下提示:
错误码:1107
错误信息:Invalid Referer
详细描述:当前页面的Referer错误。使用Implicit Grant方式获取Access Token时,Referer必须与应用的根域名绑定同域,请在开发者在应用安全设置中进行绑定。
本文章原创来自:http://www.hack6.com/wzle/gf/2012/baidukaifangpingtaioauthshouquanjiekoukeyijiechiaccess_token_2525525255.html
PHP Tokenizer 的学习笔记
Php/Js/Shell/Go jackxiang 2013-5-13 15:20
在某个项目中需要分析 PHP 代码,分离出对应的函数调用(以及源代码对应的位置)。固然这使用正则也可以实现,但无论从效率还是代码复杂度方面考虑,这都不是最优的方式。
查询了 PHP 手册,发现实在 PHP 已经内置解析器的接口,那就是 PHP Tokenizer,这工具正是我想要的。使用 PHP Tokenizer 能简单、高效、正确的分析出 PHP 源代码的组成。
实例:
---------- 调试PHP ----------
1 - T_OPEN_TAG <?php
1 - T_ECHO echo
1 - T_WHITESPACE
1 - T_CONSTANT_ENCAPSED_STRING "string1"
1 - T_CONSTANT_ENCAPSED_STRING "string2"
1 - T_WHITESPACE
1 - T_CLOSE_TAG ?>
输出完成 (耗时 0 秒) - 正常终止
参考:http://php.mirror.camelnetwork.com/manual/zh/ref.tokenizer.php
查询了 PHP 手册,发现实在 PHP 已经内置解析器的接口,那就是 PHP Tokenizer,这工具正是我想要的。使用 PHP Tokenizer 能简单、高效、正确的分析出 PHP 源代码的组成。
实例:
---------- 调试PHP ----------
1 - T_OPEN_TAG <?php
1 - T_ECHO echo
1 - T_WHITESPACE
1 - T_CONSTANT_ENCAPSED_STRING "string1"
1 - T_CONSTANT_ENCAPSED_STRING "string2"
1 - T_WHITESPACE
1 - T_CLOSE_TAG ?>
输出完成 (耗时 0 秒) - 正常终止
参考:http://php.mirror.camelnetwork.com/manual/zh/ref.tokenizer.php
Download:
http://www.grid.net.ru/nginx/download/nginx_upload_module-2.2.0.tar.gz
configure and make :
实践Ok如下:
能到到Get的配置: upload_pass /up.php?$args; ,并重新启动Nginx即可。
阅读全文
http://www.grid.net.ru/nginx/download/nginx_upload_module-2.2.0.tar.gz
configure and make :
实践Ok如下:
能到到Get的配置: upload_pass /up.php?$args; ,并重新启动Nginx即可。
阅读全文
问题描述:
在wordpress后台编辑文章,上传图片的时候出现“无法建立目录 是否上级目录没有写权限?”错误。
还有个提示说:
无法建立目录E:\wwwroot\****\web/wp-content/uploads是否上级目录没有写权限?查阅了一些wordpress的解决方法都没有解决问题,只到看到某个博客上写着改键值的方法。于是试了一下,问题得到了解决。
方法:
使用PHPMyAdmin进入数据库。数据库管理的高级管理可以进去。
找到wordpress数据库,打开wp_options表
修改表中键名为upload_path的键值 这个值是一个路径(可能在表的第二页)
将类似“/home/****/web/wp-content/uploads”直接改成“wp-content/uploads”就解决了。注意:只是去掉了一个“/”而已。
WordPress 默认的上传目录位于 wp-content/uploads ,并且根据设置还可以按照年月归档。可是,如果我要上传一个头像,或者幻灯片的话,也跟附件混在一起总是不太好吧?幸好 WordPress 知道会有用户有这种需求,我们可以通过 filter 来临时改变文件上传目录。filter 函数如下:
function slider_upload_dir($uploads) {
$siteurl = get_option( 'siteurl' );
$uploads['path'] = WP_CONTENT_DIR . '/slider';
$uploads['url'] = $siteurl . '/wp-content/slider';
$uploads['subdir'] = '';
$uploads['basedir'] = $uploads['path'];
$uploads['baseurl'] = $uploads['url'];
$uploads['error'] = false;
return $uploads;
}
在 WordPress 处理上传文件之前,加载这个 filter 函数:
add_filter('upload_dir', 'slider_upload_dir');
这样上传的文件将会上传到 wp-content/slider 目录!这个方法特别适合于有上传头像或者幻灯片需求的项目,可以避免这些文件和文章附件混淆。
来自:www.codecto.com/2012/04/wordpress-handle-upload-path/
在wordpress后台编辑文章,上传图片的时候出现“无法建立目录 是否上级目录没有写权限?”错误。
还有个提示说:
无法建立目录E:\wwwroot\****\web/wp-content/uploads是否上级目录没有写权限?查阅了一些wordpress的解决方法都没有解决问题,只到看到某个博客上写着改键值的方法。于是试了一下,问题得到了解决。
方法:
使用PHPMyAdmin进入数据库。数据库管理的高级管理可以进去。
找到wordpress数据库,打开wp_options表
修改表中键名为upload_path的键值 这个值是一个路径(可能在表的第二页)
将类似“/home/****/web/wp-content/uploads”直接改成“wp-content/uploads”就解决了。注意:只是去掉了一个“/”而已。
WordPress 默认的上传目录位于 wp-content/uploads ,并且根据设置还可以按照年月归档。可是,如果我要上传一个头像,或者幻灯片的话,也跟附件混在一起总是不太好吧?幸好 WordPress 知道会有用户有这种需求,我们可以通过 filter 来临时改变文件上传目录。filter 函数如下:
function slider_upload_dir($uploads) {
$siteurl = get_option( 'siteurl' );
$uploads['path'] = WP_CONTENT_DIR . '/slider';
$uploads['url'] = $siteurl . '/wp-content/slider';
$uploads['subdir'] = '';
$uploads['basedir'] = $uploads['path'];
$uploads['baseurl'] = $uploads['url'];
$uploads['error'] = false;
return $uploads;
}
在 WordPress 处理上传文件之前,加载这个 filter 函数:
add_filter('upload_dir', 'slider_upload_dir');
这样上传的文件将会上传到 wp-content/slider 目录!这个方法特别适合于有上传头像或者幻灯片需求的项目,可以避免这些文件和文章附件混淆。
来自:www.codecto.com/2012/04/wordpress-handle-upload-path/
背景:在一些做唯一值时,有些视频网站用UUID来做视频的唯一值,所以这个是怎么保持不重复的哩?
阅读全文
阅读全文
目录情况:里面的php文件都在下面
root@192.168.136.128:~/software/xhprof-0.9.2# ls
CHANGELOG CREDITS examples extension LICENSE README xhprof_html xhprof_lib
文件来源:把上面的文件都放在/data0/htdocs/tools.jackxiang.com/xhprof/下
Host:192.168.136.128 tools.jackxiang.com
htdocs:/data0/htdocs/tools.jackxiang.com
访问地址:
http://tools.jackxiang.com/xhprof/xhprof_html/index.php?run=528c8c8a00e2b&source=hx
程序编写:
访问:http://tools.jackxiang.com/index.php
背景:以前用xdebug,现在听群里说有这么个玩意,是轻量级的,于是找了下,说是这xhprof比xdebug提示更明显,前面有一篇文章说过,我在此也再作下备注。
有人说自从xhprof出来之后分析PHP性能方便多了
以前都是自己写Trace工具,手工打点,记录 trace信息:
http://www.yiibase.com/php/view/180.html
作者:老王
调试PHP时,XDebug一直是大众的不二选择,搭配上Webgrind,可以获得不错的效果。今天看某人的栖息地里的介绍,才发现了XHProf,于是体验了一下,感觉很酷,与XDebug相比,运行更轻便,表现更易懂,下面记录一下体验过程。
安装XHProf:
wget http://pecl.php.net/get/xhprof-0.9.2.tgz
tar zxf xhprof-0.9.2.tgz
cd xhprof-0.9.2
cp -r xhprof_html xhprof_lib <directory_for_htdocs>
cd extension
phpize
./configure
make
make install
编辑php.ini:
[xhprof]
extension=xhprof.so
;
; directory used by default implementation of the iXHProfRuns
; interface (namely, the XHProfRuns_Default class) for storing
; XHProf runs.
;
xhprof.output_dir=<directory_for_storing_xhprof_runs>
重启服务让修改生效,现在就可以使用XHProf了,不过为了显示效果更炫,最好继续安装Graphviz。
安装Graphviz:
wget http://www.graphviz.org/pub/graphviz/stable/SOURCES/graphviz-2.24.0.tar.gz
tar zxf graphviz-2.24.0.tar.gz
cd graphviz-2.24.0
./configure
make
make install
安装完成后,会生成/usr/local/bin/dot文件,你应该确保路径在PATH环境变量里,以便XHProf能找到它。
使用XHProf:
// start profiling
xhprof_enable();
// run program
....
// stop profiler
$xhprof_data = xhprof_disable();
//
// Saving the XHProf run
// using the default implementation of iXHProfRuns.
//
include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_lib.php";
include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_runs.php";
$xhprof_runs = new XHProfRuns_Default();
// Save the run under a namespace "xhprof_foo".
//
// **NOTE**:
// By default save_run() will automatically generate a unique
// run id for you. [You can override that behavior by passing
// a run id (optional arg) to the save_run() method instead.]
//
$run_id = $xhprof_runs->save_run($xhprof_data, "xhprof_foo");
echo "---------------\n".
"Assuming you have set up the http based UI for \n".
"XHProf at some address, you can view run at \n".
"http://<xhprof-ui-address>/index.php?run=$run_id&source=xhprof_foo\n".
"---------------\n";
如此一来,会在上面设定的xhprof.output_dir目录里生成名字类似49bafaa3a3f66.xhprof_foo的数据文件,可以很方便的通过Web方式浏览效果:
http://<xhprof-ui-address>/index.php?run=49bafaa3a3f66&source=xhprof_foo
目前显示的是表格形式的显示,点击页面上的[View Full Callgraph],就能看到精美的图片显示了。
补充:发现一个名为XLOG:http://tekrat.com/php/xlog/ 的扩展,看上去不错,可以记录URL信息。和XDEBUG这样的扩展相比,XLOG更轻便,所以部署在生产服务器上不会对性能造成过大影响。
来源:http://hi.baidu.com/thinkinginlamp/item/6488cd3bc8e0f6be134b14cb
___________________________
简述:XHProf是一个分层PHP性能分析工具。它报告函数级别的请求次数和各种指标,包括阻塞时间,CPU时间和内存使用情况。一个函数的开 销,可细分成调用者和被调用者的开销,XHProf数据收集阶段,它记录调用次数的追踪和包容性的指标弧在动态callgraph的一个程序。它独有的数 据计算的报告/后处理阶段。在数据收集时,XHProfd通过检测循环来处理递归的函数调用,并通过给递归调用中每个深度的调用一个有用的命名来避开死循 环。XHProf分析报告有助于理解被执行的代码的结构,它有一个简单的HTML的用户界面( PHP写成的)。基于浏览器的性能分析用户界面能更容易查看,或是与同行们分享成果。也能绘制调用关系图。
环境:CentOS 5.5 x64
安装:
cd /root/tools
wget http://pecl.php.net/get/xhprof-0.9.2.tgz
tar zxf xhprof-0.9.2.tgz
cd xhprof-0.9.2
cd extension
/elain/apps/php/bin/phpize
./configure --with-php-config=/elain/apps/php/bin/php-config
make && make install
cd ../../
#2.安装Graphviz
wget http://www.graphviz.org/pub/graphviz/stable/SOURCES/graphviz-2.28.0.tar.gz
这个能下载:http://www.graphviz.org/pub/graphviz/stable/SOURCES/graphviz-2.24.0.tar.gz
目前最新:http://www.graphviz.org/pub/graphviz/stable/SOURCES/graphviz-2.34.0.tar.gz
tar zxf graphviz-2.28.0.tar.gz
cd graphviz-2.28.0
./configure --prefix=/elain/apps/graphviz
make && make install
cd ..
ln -s /elain/apps/graphviz/bin/* /bin/
安装完成后,会生成/usr/local/bin/dot文件,你应该确保路径在PATH环境变量里,以便XHProf能找到它。
文库:http://wenku.baidu.com/view/d2908ba9d1f34693daef3e84.html
#3.安装libpng
wget http://cdnetworks-kr-2.dl.sourceforge.net/project/libpng/libpng15/1.5.2/libpng-1.5.2.tar.gz
tar zxf libpng-1.5.2.tar.gz
cd libpng-1.5.2
./configure --prefix=/elain/apps/libpng
make && make install
cd ..
编辑php.ini
vi /elain/apps/php/etc/php.ini
extension = "xhprof.so"
[xhprof]
xhprof.output_dir="/elain/logs/xhprof/log"
重启php即可
来自:http://elain.blog.51cto.com/3339379/632303
root@192.168.136.128:~/software/xhprof-0.9.2# ls
CHANGELOG CREDITS examples extension LICENSE README xhprof_html xhprof_lib
文件来源:把上面的文件都放在/data0/htdocs/tools.jackxiang.com/xhprof/下
Host:192.168.136.128 tools.jackxiang.com
htdocs:/data0/htdocs/tools.jackxiang.com
访问地址:
http://tools.jackxiang.com/xhprof/xhprof_html/index.php?run=528c8c8a00e2b&source=hx
程序编写:
访问:http://tools.jackxiang.com/index.php
背景:以前用xdebug,现在听群里说有这么个玩意,是轻量级的,于是找了下,说是这xhprof比xdebug提示更明显,前面有一篇文章说过,我在此也再作下备注。
有人说自从xhprof出来之后分析PHP性能方便多了
以前都是自己写Trace工具,手工打点,记录 trace信息:
http://www.yiibase.com/php/view/180.html
作者:老王
调试PHP时,XDebug一直是大众的不二选择,搭配上Webgrind,可以获得不错的效果。今天看某人的栖息地里的介绍,才发现了XHProf,于是体验了一下,感觉很酷,与XDebug相比,运行更轻便,表现更易懂,下面记录一下体验过程。
安装XHProf:
wget http://pecl.php.net/get/xhprof-0.9.2.tgz
tar zxf xhprof-0.9.2.tgz
cd xhprof-0.9.2
cp -r xhprof_html xhprof_lib <directory_for_htdocs>
cd extension
phpize
./configure
make
make install
编辑php.ini:
[xhprof]
extension=xhprof.so
;
; directory used by default implementation of the iXHProfRuns
; interface (namely, the XHProfRuns_Default class) for storing
; XHProf runs.
;
xhprof.output_dir=<directory_for_storing_xhprof_runs>
重启服务让修改生效,现在就可以使用XHProf了,不过为了显示效果更炫,最好继续安装Graphviz。
安装Graphviz:
wget http://www.graphviz.org/pub/graphviz/stable/SOURCES/graphviz-2.24.0.tar.gz
tar zxf graphviz-2.24.0.tar.gz
cd graphviz-2.24.0
./configure
make
make install
安装完成后,会生成/usr/local/bin/dot文件,你应该确保路径在PATH环境变量里,以便XHProf能找到它。
使用XHProf:
// start profiling
xhprof_enable();
// run program
....
// stop profiler
$xhprof_data = xhprof_disable();
//
// Saving the XHProf run
// using the default implementation of iXHProfRuns.
//
include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_lib.php";
include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_runs.php";
$xhprof_runs = new XHProfRuns_Default();
// Save the run under a namespace "xhprof_foo".
//
// **NOTE**:
// By default save_run() will automatically generate a unique
// run id for you. [You can override that behavior by passing
// a run id (optional arg) to the save_run() method instead.]
//
$run_id = $xhprof_runs->save_run($xhprof_data, "xhprof_foo");
echo "---------------\n".
"Assuming you have set up the http based UI for \n".
"XHProf at some address, you can view run at \n".
"http://<xhprof-ui-address>/index.php?run=$run_id&source=xhprof_foo\n".
"---------------\n";
如此一来,会在上面设定的xhprof.output_dir目录里生成名字类似49bafaa3a3f66.xhprof_foo的数据文件,可以很方便的通过Web方式浏览效果:
http://<xhprof-ui-address>/index.php?run=49bafaa3a3f66&source=xhprof_foo
目前显示的是表格形式的显示,点击页面上的[View Full Callgraph],就能看到精美的图片显示了。
补充:发现一个名为XLOG:http://tekrat.com/php/xlog/ 的扩展,看上去不错,可以记录URL信息。和XDEBUG这样的扩展相比,XLOG更轻便,所以部署在生产服务器上不会对性能造成过大影响。
来源:http://hi.baidu.com/thinkinginlamp/item/6488cd3bc8e0f6be134b14cb
___________________________
简述:XHProf是一个分层PHP性能分析工具。它报告函数级别的请求次数和各种指标,包括阻塞时间,CPU时间和内存使用情况。一个函数的开 销,可细分成调用者和被调用者的开销,XHProf数据收集阶段,它记录调用次数的追踪和包容性的指标弧在动态callgraph的一个程序。它独有的数 据计算的报告/后处理阶段。在数据收集时,XHProfd通过检测循环来处理递归的函数调用,并通过给递归调用中每个深度的调用一个有用的命名来避开死循 环。XHProf分析报告有助于理解被执行的代码的结构,它有一个简单的HTML的用户界面( PHP写成的)。基于浏览器的性能分析用户界面能更容易查看,或是与同行们分享成果。也能绘制调用关系图。
环境:CentOS 5.5 x64
安装:
cd /root/tools
wget http://pecl.php.net/get/xhprof-0.9.2.tgz
tar zxf xhprof-0.9.2.tgz
cd xhprof-0.9.2
cd extension
/elain/apps/php/bin/phpize
./configure --with-php-config=/elain/apps/php/bin/php-config
make && make install
cd ../../
#2.安装Graphviz
wget http://www.graphviz.org/pub/graphviz/stable/SOURCES/graphviz-2.28.0.tar.gz
这个能下载:http://www.graphviz.org/pub/graphviz/stable/SOURCES/graphviz-2.24.0.tar.gz
目前最新:http://www.graphviz.org/pub/graphviz/stable/SOURCES/graphviz-2.34.0.tar.gz
tar zxf graphviz-2.28.0.tar.gz
cd graphviz-2.28.0
./configure --prefix=/elain/apps/graphviz
make && make install
cd ..
ln -s /elain/apps/graphviz/bin/* /bin/
安装完成后,会生成/usr/local/bin/dot文件,你应该确保路径在PATH环境变量里,以便XHProf能找到它。
文库:http://wenku.baidu.com/view/d2908ba9d1f34693daef3e84.html
#3.安装libpng
wget http://cdnetworks-kr-2.dl.sourceforge.net/project/libpng/libpng15/1.5.2/libpng-1.5.2.tar.gz
tar zxf libpng-1.5.2.tar.gz
cd libpng-1.5.2
./configure --prefix=/elain/apps/libpng
make && make install
cd ..
编辑php.ini
vi /elain/apps/php/etc/php.ini
extension = "xhprof.so"
[xhprof]
xhprof.output_dir="/elain/logs/xhprof/log"
重启php即可
来自:http://elain.blog.51cto.com/3339379/632303
有没有打开d盘的快捷键?在进行别的操作的时候,想打开d盘又不想返回桌面:
1)打开我的电脑,直接选中你要的盘符(D盘),用拖拽的到桌面
即可创建快捷方式,
2)右击 D盘的快捷方式 在 属性 中 编辑 快捷键(按个人喜好编辑,如
CTRL+ALT+B,注意不要和其他组合键冲突了 即可)
WIN+E,打开我的电脑,然后你选盘。好像没办法用快捷键直接打开D的哦。
WIN+R,输入:d: 就打开了D盘符。
来自:http://zhidao.baidu.com/question/128238695.html
1)打开我的电脑,直接选中你要的盘符(D盘),用拖拽的到桌面
即可创建快捷方式,
2)右击 D盘的快捷方式 在 属性 中 编辑 快捷键(按个人喜好编辑,如
CTRL+ALT+B,注意不要和其他组合键冲突了 即可)
WIN+E,打开我的电脑,然后你选盘。好像没办法用快捷键直接打开D的哦。
WIN+R,输入:d: 就打开了D盘符。
来自:http://zhidao.baidu.com/question/128238695.html
背景:近来对Nginx的上传模块这一块,Flash上传时进度条都过了,但是那个文件还没有出现,一会儿后才出现那个文件,并慢慢增大,我用的是Nginx的上传插件,这种问题怎么去查?我刚用了strace,我在想它是把上传的东东放在哪儿去了呢?
http://www.grid.net.ru/nginx/download/nginx_upload_module-2.2.0.tar.gz
Rango 上午 11:56:57
用apache来做吧,apache是交给php来处理的,
回忆未来-向东-Jàck 下午 12:01:57
嗯,我再看看,兄弟觉得Apache下的PHP比起Nginx的PHP在上传一块有更高的效率是么?
Rango 下午 12:02:23
都差不多吧
apache比较成熟
=================================================================================
Rango 下午 01:45:42
你看下 man pwrite
回忆未来-向东-Jàck 下午 01:55:19
好看到了,这个PHP上传大文件和Nginx上传大文件,是先接进来放到内存后,在写到文件里吧?
Rango 下午 01:55:30
嗯,是的,都是这样做了
pwrite就是相当于 fseek + fwrite
回忆未来-向东-Jàck 下午 01:56:55
至于内存里放在什么时候开始写,那应该是由nginx程序里的配置来实现的吧?
如果我猜测没错的话
=================================================================================
upload_buffer_size 上传缓冲区大小
upload_max_file_size 指定上传文件最大大小,软限制。client_max_body_size硬限制。
upload_limit_rate 上传限速,如果设置为0则表示不限制。
upload_pass_args 是否转发参数。
=============================================================================
=============================================================================
ack 1460:
第一个报文的TCP头里通过MSS这个可选项告知对方本端能够接收的最大报文(当然,这个大小是TCP净荷的大小),以太网上这个值一般设置成1460,因为1460Byte净荷+20Byte TCP头+20Byte IP头 = 1500字节,正好符合链路层最大报文的要求。
http://wenku.baidu.com/view/d77645d533d4b14e84246800.html
strace -p 7269 -o s.log
Nginx太多了进程:
[root@test tmp]# cat strace.sh
都是读4096个字符一次写,pwrite64和这个相当应该:
ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset);
原型 char * fgets(char * s, int n,FILE *stream);
参数:
s: 字符型指针,指向存储读入数据的缓冲区的地址。
n: 从流中读入n-1个字符
stream : 指向读取的流。
函数原型
ssize_t pwrite(intfd, const void *buf, size_tcount, off_toffset);
编辑本段
用法
返回值:成功,返回写入到文件中的字节数;失败,返回-1;
参数:
(1) fd:要写入数据的文件描述符
(2) buf:数据缓存区指针,存放要写入文件中的数据
(3) count:写入文件中的数据的字节数
(4) offset:写入起始地址的偏移量,写入地址=文件开始+offset。注意,执行后,文件偏移指针不变
什么是字节,字节数相关学习备案:
字节(Byte 发音:/‘bait/):字节是通过网络传输信息(或在硬盘或内存中存储信息)的单位。在ASCII码中,一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间。符号:英文标点占一个字节,中文标点占两个字节。举例:英文句号“.”占1个字节的大小,中文句号“。”占2个字节的大小 。一个二进制数字序列,在计算机中作为一个数字单元,一般为8位二进制数,换算为十进制。最小值:0 最大值:255 。如一个ASCII码就是一个字节,此类单位的换算为: 1KB(Kilobyte 千字节)=1024B,1MB(Megabyte 兆字节 简称“兆”)=1024KB,1GB(Gigabyte 吉字节 又称“千兆”)=1024MB,
数据包是信息在通行通道上传递的形式~~
字节是信息的单位~~一字节等于8个比特位!
wc - c 统计字节数:
[root@test ~]# cat a.txt |wc -c
2 [里面写:a的字节数]
[root@test ~]# vi a.txt
[root@test ~]# cat a.txt |wc -c
8 [里面写:a向东 的字节数]
比特(bit)即一个二进制位 例如100011就是6比特
字节(byte)这是计算机中数据类型最基本的单位了,8bit 组成1byte
字(word)两个byte称为一个word,所以字大小应该是16位bit,共两字节。(Shell里的)
双字(double word 简写为DWORD)见名知意,两个字,四个字节,32bit。
C语言:char 字符型 占1byte 即8位,一个char型数据(例如:a、#、!之类的)用了1个字节来存储:
root@192.168.137.128:~# ./a.out
size of char a=1
size of char =1
中间断开测试,浏览器突然断开:
accept4(5, {sa_family=AF_INET, sin_port=htons(58438), sin_addr=inet_addr("192.168.137.1")}, [16], SOCK_NONBLOCK) = 3
epoll_ctl(13, EPOLL_CTL_ADD, 3, {EPOLLIN|EPOLLET, {u32=3039736117, u64=722997274181808437}}) = 0
epoll_wait(13, {{EPOLLIN, {u32=3039736117, u64=722997274181808437}}}, 512, 60000) = 1
gettimeofday({1368072732, 443326}, NULL) = 0
recv(3, "POST /upload HTTP/1.1\r\nHost: tes"..., 32768, 0) = 32768
recv(3, "\0\1\0\0*0\0\0\0\2\0\0\0\0\0\0\0\1\0\0*0\0\0\0\2\0\0\0\0\0\0"..., 8192, 0) = 8192
epoll_wait(13, {{EPOLLIN, {u32=3039736117, u64=722997274181808437}}}, 512, 7) = 1
gettimeofday({1368072732, 446037}, NULL) = 0
epoll_wait(13, {}, 512, 4) = 0
gettimeofday({1368072732, 451445}, NULL) = 0
open("/data/app/test.local/upload_tmp/0000000005", O_RDWR|O_CREAT|O_EXCL|O_LARGEFILE, 0600) = 4
pwrite64(4, "\0\0\0\24ftypisom\0\0\0\1isom\0\rx\373moov\0\0\0l"..., 4096, 0) = 4096
pwrite64(4, "\0\2\0\0\0\0\0\0\0\3\0\0\16\20\0\0\0\1\0\0*0\0\0\0\2\0\0\0\0\0\0"..., 4096, 4096) = 4096
pwrite64(4, "\0\1\0\0*0\0\0\0\2\0\0\0\0\0\0\0\1\0\0*0\0\0\0\2\0\0\0\0\0\0"..., 4096, 8192) = 4096
.........................................
pwrite64(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 7622656) = 4096
pwrite64(4, "e\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\240\5\343\t\240\335d\t@\327d\t\240.\341\t"..., 4096, 7626752) = 4096
recv(3, 0xa0a9048, 8192, 0) = -1 EAGAIN (Resource temporarily unavailable)
epoll_wait(13, {{EPOLLIN|EPOLLERR|EPOLLHUP, {u32=3039736117, u64=722997274181808437}}}, 512, 60000) = 1
gettimeofday({1368072745, 256485}, NULL) = 0
recv(3, 0xa0a9048, 8192, 0) = -1 ECONNRESET (Connection reset by peer)
pwrite64(4, "s\0i\0t\0o\0r\0y\0\0\0\0\0\36\0\0\0\2\0\0\0\0\0\0\0\0\0\0\0"..., 2800, 7630848) = 2800
close(4) = 0
unlink("/data/app/test.local/upload_tmp/0000000005") = 0
write(9, "2013/05/09 12:12:25 [alert] 7269"..., 240) = 240
close(3) = 0
epoll_wait(13, <unfinished ...>
阅读全文
http://www.grid.net.ru/nginx/download/nginx_upload_module-2.2.0.tar.gz
Rango 上午 11:56:57
用apache来做吧,apache是交给php来处理的,
回忆未来-向东-Jàck 下午 12:01:57
嗯,我再看看,兄弟觉得Apache下的PHP比起Nginx的PHP在上传一块有更高的效率是么?
Rango 下午 12:02:23
都差不多吧
apache比较成熟
=================================================================================
Rango 下午 01:45:42
你看下 man pwrite
回忆未来-向东-Jàck 下午 01:55:19
好看到了,这个PHP上传大文件和Nginx上传大文件,是先接进来放到内存后,在写到文件里吧?
Rango 下午 01:55:30
嗯,是的,都是这样做了
pwrite就是相当于 fseek + fwrite
回忆未来-向东-Jàck 下午 01:56:55
至于内存里放在什么时候开始写,那应该是由nginx程序里的配置来实现的吧?
如果我猜测没错的话
=================================================================================
upload_buffer_size 上传缓冲区大小
upload_max_file_size 指定上传文件最大大小,软限制。client_max_body_size硬限制。
upload_limit_rate 上传限速,如果设置为0则表示不限制。
upload_pass_args 是否转发参数。
=============================================================================
=============================================================================
ack 1460:
第一个报文的TCP头里通过MSS这个可选项告知对方本端能够接收的最大报文(当然,这个大小是TCP净荷的大小),以太网上这个值一般设置成1460,因为1460Byte净荷+20Byte TCP头+20Byte IP头 = 1500字节,正好符合链路层最大报文的要求。
http://wenku.baidu.com/view/d77645d533d4b14e84246800.html
strace -p 7269 -o s.log
Nginx太多了进程:
[root@test tmp]# cat strace.sh
都是读4096个字符一次写,pwrite64和这个相当应该:
ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset);
原型 char * fgets(char * s, int n,FILE *stream);
参数:
s: 字符型指针,指向存储读入数据的缓冲区的地址。
n: 从流中读入n-1个字符
stream : 指向读取的流。
函数原型
ssize_t pwrite(intfd, const void *buf, size_tcount, off_toffset);
编辑本段
用法
返回值:成功,返回写入到文件中的字节数;失败,返回-1;
参数:
(1) fd:要写入数据的文件描述符
(2) buf:数据缓存区指针,存放要写入文件中的数据
(3) count:写入文件中的数据的字节数
(4) offset:写入起始地址的偏移量,写入地址=文件开始+offset。注意,执行后,文件偏移指针不变
什么是字节,字节数相关学习备案:
字节(Byte 发音:/‘bait/):字节是通过网络传输信息(或在硬盘或内存中存储信息)的单位。在ASCII码中,一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间。符号:英文标点占一个字节,中文标点占两个字节。举例:英文句号“.”占1个字节的大小,中文句号“。”占2个字节的大小 。一个二进制数字序列,在计算机中作为一个数字单元,一般为8位二进制数,换算为十进制。最小值:0 最大值:255 。如一个ASCII码就是一个字节,此类单位的换算为: 1KB(Kilobyte 千字节)=1024B,1MB(Megabyte 兆字节 简称“兆”)=1024KB,1GB(Gigabyte 吉字节 又称“千兆”)=1024MB,
数据包是信息在通行通道上传递的形式~~
字节是信息的单位~~一字节等于8个比特位!
wc - c 统计字节数:
[root@test ~]# cat a.txt |wc -c
2 [里面写:a的字节数]
[root@test ~]# vi a.txt
[root@test ~]# cat a.txt |wc -c
8 [里面写:a向东 的字节数]
比特(bit)即一个二进制位 例如100011就是6比特
字节(byte)这是计算机中数据类型最基本的单位了,8bit 组成1byte
字(word)两个byte称为一个word,所以字大小应该是16位bit,共两字节。(Shell里的)
双字(double word 简写为DWORD)见名知意,两个字,四个字节,32bit。
C语言:char 字符型 占1byte 即8位,一个char型数据(例如:a、#、!之类的)用了1个字节来存储:
root@192.168.137.128:~# ./a.out
size of char a=1
size of char =1
中间断开测试,浏览器突然断开:
accept4(5, {sa_family=AF_INET, sin_port=htons(58438), sin_addr=inet_addr("192.168.137.1")}, [16], SOCK_NONBLOCK) = 3
epoll_ctl(13, EPOLL_CTL_ADD, 3, {EPOLLIN|EPOLLET, {u32=3039736117, u64=722997274181808437}}) = 0
epoll_wait(13, {{EPOLLIN, {u32=3039736117, u64=722997274181808437}}}, 512, 60000) = 1
gettimeofday({1368072732, 443326}, NULL) = 0
recv(3, "POST /upload HTTP/1.1\r\nHost: tes"..., 32768, 0) = 32768
recv(3, "\0\1\0\0*0\0\0\0\2\0\0\0\0\0\0\0\1\0\0*0\0\0\0\2\0\0\0\0\0\0"..., 8192, 0) = 8192
epoll_wait(13, {{EPOLLIN, {u32=3039736117, u64=722997274181808437}}}, 512, 7) = 1
gettimeofday({1368072732, 446037}, NULL) = 0
epoll_wait(13, {}, 512, 4) = 0
gettimeofday({1368072732, 451445}, NULL) = 0
open("/data/app/test.local/upload_tmp/0000000005", O_RDWR|O_CREAT|O_EXCL|O_LARGEFILE, 0600) = 4
pwrite64(4, "\0\0\0\24ftypisom\0\0\0\1isom\0\rx\373moov\0\0\0l"..., 4096, 0) = 4096
pwrite64(4, "\0\2\0\0\0\0\0\0\0\3\0\0\16\20\0\0\0\1\0\0*0\0\0\0\2\0\0\0\0\0\0"..., 4096, 4096) = 4096
pwrite64(4, "\0\1\0\0*0\0\0\0\2\0\0\0\0\0\0\0\1\0\0*0\0\0\0\2\0\0\0\0\0\0"..., 4096, 8192) = 4096
.........................................
pwrite64(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 7622656) = 4096
pwrite64(4, "e\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\240\5\343\t\240\335d\t@\327d\t\240.\341\t"..., 4096, 7626752) = 4096
recv(3, 0xa0a9048, 8192, 0) = -1 EAGAIN (Resource temporarily unavailable)
epoll_wait(13, {{EPOLLIN|EPOLLERR|EPOLLHUP, {u32=3039736117, u64=722997274181808437}}}, 512, 60000) = 1
gettimeofday({1368072745, 256485}, NULL) = 0
recv(3, 0xa0a9048, 8192, 0) = -1 ECONNRESET (Connection reset by peer)
pwrite64(4, "s\0i\0t\0o\0r\0y\0\0\0\0\0\36\0\0\0\2\0\0\0\0\0\0\0\0\0\0\0"..., 2800, 7630848) = 2800
close(4) = 0
unlink("/data/app/test.local/upload_tmp/0000000005") = 0
write(9, "2013/05/09 12:12:25 [alert] 7269"..., 240) = 240
close(3) = 0
epoll_wait(13, <unfinished ...>
阅读全文
背景: 我也想升级一把,如果直接上6.4,以前6.3里面的vim配置,服务器等重新安,太麻烦了。
-------------------------------------------------------------------------------------------------------------------------------
最后,发现我的那个已经升级了,不用去修改grub,参考:http://tieba.baidu.com/p/2249307319
阅读全文
-------------------------------------------------------------------------------------------------------------------------------
最后,发现我的那个已经升级了,不用去修改grub,参考:http://tieba.baidu.com/p/2249307319
阅读全文
背景:搞游戏的相关公司要用这个玩意儿,但怎么用的不了解,先写这儿作下Mark。 阅读全文
背景:前些日子有一外面抓视频的,用那个时间来查20条(大于某个时间Limit 20),因存的是这样的:2013-08-08 21:50:00 ,这样在Mysql数据量大,且没有建立索引(也不好建立索引的情况下),很容易把数据库拖死,其实应该用Unix的时间整数来进行查就快多了,因为这样建立起来的索引的势就高(老外好像是这样说的),查询就快,但现在就是存的时间了,查询时还得以时间来查,前端是输入的Unix时间戳(Unix timestamp),后面还得转一次。
涉及到:js unix时间戳转换 ,PHP时间戳转为Unix时间戳。
阅读全文
涉及到:js unix时间戳转换 ,PHP时间戳转为Unix时间戳。
阅读全文