windows/linux文件夹分割符:PHP里的DIRECTORY_SEPARATOR 与 PATH_SEPARATOR
Php/Js/Shell/Go jackxiang 2013-4-10 20:43
黑客X档案2011年12月刊:小菜也来写PHP木马说到这个变量,再就是在进行一些目录的截取时可能会用到这些变量:
DIRECTORY_SEPARATOR:
路径分隔符,
linux上就是’/’
windows上是’\’
PATH_SEPARATOR:
include多个路径使用,在win下,当你要include多个路径的话,你要用”;”隔开,但在linux下就使用”:”隔开的。
这2个常量的使用能够避免不同平台的兼容性问题。
来自:http://gaoke0820.blog.163.com/blog/static/216649652010726101431997/
DIRECTORY_SEPARATOR:
路径分隔符,
linux上就是’/’
windows上是’\’
PATH_SEPARATOR:
include多个路径使用,在win下,当你要include多个路径的话,你要用”;”隔开,但在linux下就使用”:”隔开的。
这2个常量的使用能够避免不同平台的兼容性问题。
来自:http://gaoke0820.blog.163.com/blog/static/216649652010726101431997/
用户写成的脚本.js或.lua被打包进DirectUI 的皮肤文件中:
DirectUI的界面逻辑既可以在用户程 序中调用进行控制也可以采用脚本进行 控制。目前支持的脚本为Javascript与Lua 两种,用户可以选择其中的一种来使 用。何为界面逻辑?为何需要脚本来控 制呢?所谓界面逻辑,指的是与界面操 作相关的一系列方法与事件。比如在界 面中有一个按钮用来控制左侧面板的缩 进与展开。在传统的界面开发方式下, 我们需要在应用程序里面响应该按钮的 Click事件来对左侧面板进行位置的控 制。这样的处理方式会导致界面逻辑的 修改而影响到应用程序的重新编译。而 界面逻辑的变化与调整在整个软件的生 命周期内是非常频繁与普遍的。所以找 到一种界面逻辑的变化不会影响到应用 软件的重新编译的方式成为第三代界面 库的一大技术要点。DirectUI很巧妙地运 用了脚本特有一些特性,将内部生成的 控件实例对象通过脚本规则导出到外 部,由脚本来调用控件的接口与方法。 用户写成的脚本.js或.lua被打包进DirectUI 的皮肤文件中。这样,当程序切换皮肤 文件时,也把相应的界面逻辑也一同切 换了。没有脚本支持的界面库是无法做 到界面与业务逻辑的彻底分离的。所 以,是否支持脚本控制就成为界面库能 否真正实现界面与业务逻辑彻底分离的 标志性技术点。
阅读全文
DirectUI的界面逻辑既可以在用户程 序中调用进行控制也可以采用脚本进行 控制。目前支持的脚本为Javascript与Lua 两种,用户可以选择其中的一种来使 用。何为界面逻辑?为何需要脚本来控 制呢?所谓界面逻辑,指的是与界面操 作相关的一系列方法与事件。比如在界 面中有一个按钮用来控制左侧面板的缩 进与展开。在传统的界面开发方式下, 我们需要在应用程序里面响应该按钮的 Click事件来对左侧面板进行位置的控 制。这样的处理方式会导致界面逻辑的 修改而影响到应用程序的重新编译。而 界面逻辑的变化与调整在整个软件的生 命周期内是非常频繁与普遍的。所以找 到一种界面逻辑的变化不会影响到应用 软件的重新编译的方式成为第三代界面 库的一大技术要点。DirectUI很巧妙地运 用了脚本特有一些特性,将内部生成的 控件实例对象通过脚本规则导出到外 部,由脚本来调用控件的接口与方法。 用户写成的脚本.js或.lua被打包进DirectUI 的皮肤文件中。这样,当程序切换皮肤 文件时,也把相应的界面逻辑也一同切 换了。没有脚本支持的界面库是无法做 到界面与业务逻辑的彻底分离的。所 以,是否支持脚本控制就成为界面库能 否真正实现界面与业务逻辑彻底分离的 标志性技术点。
阅读全文
centos6.3源更新网易源,以求通过yum 安装gdb的实践过程记录。
Unix/LinuxC技术 jackxiang 2013-4-8 21:28
最近还是在centos官网上找到了,下面的实践没有达到想要的要求。
http://mirror.centos.org/centos/6.3/os/i386/Packages/gdb-7.2-56.el6.i686.rpm
=========================================================================
root@192.168.137.159:~/software# wget http://mirror.centos.org/centos/6.3/os/i386/Packages/gdb-7.2-56.el6.i686.rpm
--2013-04-08 21:55:46-- http://mirror.centos.org/centos/6.3/os/i386/Packages/gdb-7.2-56.el6.i686.rpm
正在解析主机 mirror.centos.org... 202.76.233.2
正在连接 mirror.centos.org|202.76.233.2|:80...败:连接超时。
重试中。
http://mirrors.163.com/centos/6/os/i386/repodata/repomd.xml
试了N种方法,没法解决,后来发现是因为文件yum.conf里面设置了proxy,注释掉就行了
运行yum clean all清楚缓存
运行yum makecache生成缓存
出现如下错误:
Loading mirror speeds from cached hostfile
http://mirrors.163.com/centos/6/os/i386/repodata/repomd.xml: [Errno 14] PYCURL ERROR 7 - "couldn't connect to host"
Trying other mirror.
Error: Cannot retrieve repository metadata (repomd.xml) for repository: base. Please verify its path and try again
vi ./etc/yum.conf
proxy=http://10.33.26.112:808
--2013-04-08 21:56:50-- (尝试次数: 2)
......
卡在这儿了。
=========================================================================
得出:是自己虚拟机的配置或网络的缘故,和163的源无太大关系,NAT配置正确,宽带这块好像有限定,对某些域名都无法ping通呀,嗨,什么玩意,想换个联通的ADSL,小宽带运营商这些都太多限定了。
解决办法:直接通过浏览器下载后,通过rz放入centos6.3的系统里,再rpm -ihv gdb-7.2-56.el6.i686.rpm
=========================================================================
写在前面:网易给人感觉有点像中国IT业的脊梁,低调耐用实用实在,其掌门人丁磊在很久前就有这样那样的源开放出来供下载,想法比较特立独行,其颇具执行力,我觉得这也算是作为IT业的一份贡献吧,从这个角度来看就不难想像丁磊去养猪了,呵呵。
背景:家里的vmware里的centos6.3没法安gdb,出现:
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
配置网易163的yum源
1. 下载repo文件
下载地址:http://mirrors.163.com/.help/CentOS6-Base-163.repo
2. 备份并替换系统的repo文件
[root@localhost ~]# cd /etc/yum.repos.d/
[root@localhost ~]# mv CentOS-Base.repo CentOS-Base.repo.bak
[root@localhost ~]# mv /root/CentOS6-Base-163.repo CentOS-Base.repo
3. 执行yum源更新
[root@localhost ~]# yum clean all
[root@localhost ~]# yum makecache
[root@localhost ~]# yum update
4. 到此已结束,用yum安装一下文件,看是否OK
[root@localhost ~]# yum install vim*
5. 安装centos常用的软件包及工具
常见压缩工具 zip unzip bzip2
[root@localhost ~]# yum -y install unzip zip bzip2 bzip2-devel
gcc gcc++编译器
[root@localhost ~]# yum install gcc gcc-c++ -y
cmake编译器
[root@localhost ~]# yum install cmake make -y
图片资源
[root@localhost ~]# yum -y install gd libjpeg libjpeg-devel libpng libpng-devel freetype-devel
其它常用资源包工具
[root@localhost ~]# yum -y install autoconf bison automake zlib* fiex* libxml* ncurses-devel libmcrypt* libtool-ltdl-devel*
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
CentOS 6.3安装第三方yum源
# wget http://www.atomicorp.com/installers/atomic[/url]
下载完成后执行以下命令
# sh ./atomic
里面涉及到的rpm:http://3es.atomicrocketturtle.com/packages/atomic-release/atomic-release-1.0-16.el6.art.noarch.rpm
阅读全文
http://mirror.centos.org/centos/6.3/os/i386/Packages/gdb-7.2-56.el6.i686.rpm
=========================================================================
root@192.168.137.159:~/software# wget http://mirror.centos.org/centos/6.3/os/i386/Packages/gdb-7.2-56.el6.i686.rpm
--2013-04-08 21:55:46-- http://mirror.centos.org/centos/6.3/os/i386/Packages/gdb-7.2-56.el6.i686.rpm
正在解析主机 mirror.centos.org... 202.76.233.2
正在连接 mirror.centos.org|202.76.233.2|:80...败:连接超时。
重试中。
http://mirrors.163.com/centos/6/os/i386/repodata/repomd.xml
试了N种方法,没法解决,后来发现是因为文件yum.conf里面设置了proxy,注释掉就行了
运行yum clean all清楚缓存
运行yum makecache生成缓存
出现如下错误:
Loading mirror speeds from cached hostfile
http://mirrors.163.com/centos/6/os/i386/repodata/repomd.xml: [Errno 14] PYCURL ERROR 7 - "couldn't connect to host"
Trying other mirror.
Error: Cannot retrieve repository metadata (repomd.xml) for repository: base. Please verify its path and try again
vi ./etc/yum.conf
proxy=http://10.33.26.112:808
--2013-04-08 21:56:50-- (尝试次数: 2)
......
卡在这儿了。
=========================================================================
得出:是自己虚拟机的配置或网络的缘故,和163的源无太大关系,NAT配置正确,宽带这块好像有限定,对某些域名都无法ping通呀,嗨,什么玩意,想换个联通的ADSL,小宽带运营商这些都太多限定了。
解决办法:直接通过浏览器下载后,通过rz放入centos6.3的系统里,再rpm -ihv gdb-7.2-56.el6.i686.rpm
=========================================================================
写在前面:网易给人感觉有点像中国IT业的脊梁,低调耐用实用实在,其掌门人丁磊在很久前就有这样那样的源开放出来供下载,想法比较特立独行,其颇具执行力,我觉得这也算是作为IT业的一份贡献吧,从这个角度来看就不难想像丁磊去养猪了,呵呵。
背景:家里的vmware里的centos6.3没法安gdb,出现:
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
配置网易163的yum源
1. 下载repo文件
下载地址:http://mirrors.163.com/.help/CentOS6-Base-163.repo
2. 备份并替换系统的repo文件
[root@localhost ~]# cd /etc/yum.repos.d/
[root@localhost ~]# mv CentOS-Base.repo CentOS-Base.repo.bak
[root@localhost ~]# mv /root/CentOS6-Base-163.repo CentOS-Base.repo
3. 执行yum源更新
[root@localhost ~]# yum clean all
[root@localhost ~]# yum makecache
[root@localhost ~]# yum update
4. 到此已结束,用yum安装一下文件,看是否OK
[root@localhost ~]# yum install vim*
5. 安装centos常用的软件包及工具
常见压缩工具 zip unzip bzip2
[root@localhost ~]# yum -y install unzip zip bzip2 bzip2-devel
gcc gcc++编译器
[root@localhost ~]# yum install gcc gcc-c++ -y
cmake编译器
[root@localhost ~]# yum install cmake make -y
图片资源
[root@localhost ~]# yum -y install gd libjpeg libjpeg-devel libpng libpng-devel freetype-devel
其它常用资源包工具
[root@localhost ~]# yum -y install autoconf bison automake zlib* fiex* libxml* ncurses-devel libmcrypt* libtool-ltdl-devel*
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
CentOS 6.3安装第三方yum源
# wget http://www.atomicorp.com/installers/atomic[/url]
下载完成后执行以下命令
# sh ./atomic
里面涉及到的rpm:http://3es.atomicrocketturtle.com/packages/atomic-release/atomic-release-1.0-16.el6.art.noarch.rpm
阅读全文
材料有四样,准备如下模块和代码,用python脚本也是可以很快测试一下断点上传的,链接在:https://jackxiang.com/post/8331/
1.php的支持,自带的,就是建立一个fast-cgi跑php,提供一个test.php显示最终结果
2.nginx_upload_module 上传插件
http://www.grid.net.ru/nginx/download/nginx_upload_module-2.2.0.tar.gz
3.nginx_upload_progress_module,上传进度条插件
akostrikov-nginx-upload-progress-module-v0.8.2-1-g3d8e105.zip
http://wiki.nginx.org/HttpUploadProgressModule
下载
https://nodeload.github.com/akostrikov/nginx-upload-progress-module/zipball/master
4.https://github.com/drogus/jquery-upload-progress ,显示进度条的jquery插件
__________________________________________________________________
编译:
疑难问题,nginx: [emerg] zero size shared memory zone "proxied",在nginx.conf里加一行upload_progress proxied 1m;:
解决nginx上传模块nginx_upload_module传递GET参数的方法总结:
http://www.cnblogs.com/lidabo/p/4169752.html
Download:
http://www.grid.net.ru/nginx/download/nginx_upload_module-2.2.0.tar.gz
configure and make :
Nginx配置文件:
较靠谱的文章:http://blog.sina.com.cn/s/blog_704836f401014bpj.html
因为nginx upload module已经做完了最费时的mime解析工作,后端的PHP代码只需要简单的移动文件到合适的位置就可以了。因为upload module是使用C语言写的,比起PHP作解析工作的效率高多了,因此极大地提高了文件上传的效率。
二、upload module的配置参数简要说明
下边是一些配置参数的说明:
upload_pass 指明了需要后续处理的php地址
upload_cleanup 如果php出现400 404 499 500-505之类的错误,则删除上传的文件
upload_store 上传文件存放地址
upload_store_access 上传文件的访问权限,user:r是指用户可读
upload_limit_rate 上传限速,如果设置为0则表示不限制
upload_pass_form_field 从表单原样转到后端的参数,可以正则表达式表示
官方的例子是upload_pass_form_field "^submit$|^description$";
意思是把submit,description这两个字段也原样通过upload_pass传递到后端php处理。如果希望把所有的表单字段都传给后端可以用upload_pass_form_field "^.*$";
---------------
背景:追求极致,由服务器脚本(比如PHP)来负责接收上传的数据。这种方式存在性能和效率的问题。所以,决定采用Nginx的上传模块来完成接收数据的功能,接收完数据后,再去转给后端脚本语言进行后续处理(比如:移动文件、插入文件的信息到数据库中)。
RFC 1867:
module for nginx web server for handling file uploads using multipart/form-data encoding (RFC 1867) and resumable uploads according to this protocol.
Description
The module parses request body storing all files being uploaded to a directory specified by upload_store directive. The files are then being stripped from body and altered request is then passed to a location specified by upload_pass directive, thus allowing arbitrary handling of uploaded files. Each of file fields are being replaced by a set of fields specified by upload_set_form_field directive. The content of each uploaded file then could be read from a file specified by $upload_tmp_path variable or the file could be simply moved to ultimate destination. Removal of output files is controlled by directive upload_cleanup. If a request has a method other than POST, the module returns error 405 (Method not allowed). Requests with such methods could be processed in alternative location via error_page directive.
Nginx.conf
======================================================================
1.上面的#include fastcgi_params; 被我注释掉了,否则出现:405 Method not allowed ,查了下:
Nginx 静态文件中的 POST 请求返还 405 Method not allowed 错误,于是用了9000的PHP端口。
index.php 内容:
上传后返回:
Array
(
[file1_name] => 6597350142123536341.jpg
[file1_content_type] => image/jpeg
[file1_path] => /data/app/test.local/upload_tmp/0000000001
[file1_md5] => 5a84d879e497bf64acebdc84c4701a76
[file1_size] => 110001
[file2] =>
[file3] =>
[file4] =>
[file5] =>
[file6] =>
[submit] => Upload
[test] => value
)
先看一下这个上传目录的结构是这样的,这些编号的都是上传的素材,没有后缀:
/data/app/test.local/upload_tmp# ls
0000000001 0006630963 0006630964
查看目录下有没有这个文件:
ls /data/app/test.local/upload_tmp/0000000001
/data/app/test.local/upload_tmp/0000000001
sz 下来,更名为.jpg的:
sz /data/app/test.local/upload_tmp/0000000001 ==》0000000001.jpg ,打开一看果然是我上传的文件,得证!
把这个文件放到自己定义的目录下:
多个文件的一个情况,也就是多个文件的POST数组规律,去进行移动文件即可:
<input type="file" name="file2">
<input type="file" name="file2">
[file1_name] => 1332460275090024.jpg
[file1_content_type] => image/jpeg
[file1_path] => /data/app/test.local/upload_tmp/0000000034
[file1_md5] => 4e84aac3bc2cc25b7c69c7b506e4967f
[file1_size] => 73702
[file2_name] => desktop.ini
[file2_content_type] => application/octet-stream
[file2_path] => /data/app/test.local/upload_tmp/0000000035
[file2_md5] => dc723b859dec1526568ad581aec334d5
因为nginx upload module已经做完了最费时的mime解析工作,后端的PHP代码只需要简单的移动文件到合适的位置就可以了。因为upload module是使用C语言写的,比起PHP作解析工作的效率高多了,因此极大地提高了文件上传的效率。
upload_cleanup 如果php出现400 404 499 500-505之类的错误,则删除上传的文件,这块可以利用PHP进行逻辑判断后输出header头来进行操作是否删除文件。
======================================================================
补安装编译方法:
1.下载
wget http://www.grid.net.ru/nginx/download/nginx_upload_module-2.2.0.tar.gz
2.编译(在NGINX编译目录执行以下命令, 其中 --add-module=你下载解压的上传插件目录)
./configure --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 --add-module=/root/software/nginx_upload_module-2.2.0
3.上传界面:
参考来源:
1)nginx上传模块—nginx upload module安装:http://waynerqiu.com/7/136.html
2)写得很简洁的安装方法:http://foooy.me/nginx/158.html 【该文里提到的接受PHP,这块没有做详细的配置,参考上面这篇文章即可。】
3)http://anerg.com/read.php?55
//这一篇文章描述到:upload_pass /index.php?c=uploader&a=upload_server; 也就是有框架时怎么用框架的action来进行处理。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
最后,后记备查用相关模块的使用:
听说有一个哥们解决了get的问题,通过相关nginx的指令实现的,没实践:http://waynerqiu.com/7/139.html
还有实现断点续传,进度显示等的:
最近做一个产品,需要实现从网页上传文件给服务器。一般情况下都是采用Ajax异步方式,创建一个iframe,在iframe里面把数据以form方式提交给后端的服务器脚本,由服务器脚本(比如PHP)来负责接收上传的数据。这种方式存在性能和效率的问题。所以,决定采用Nginx的上传模块来完成接收数据的功能,接收完数据后,再去转给后端脚本语言进行后续处理(比如:移动文件、插入文件的信息到数据库中)。同时,由于需要在前端展现上传的进度,因此可以利用Nginx一个uploadprogress模块来获取。
整个处理框图如下:
实现步骤:
1、查看Nginx是否安装了这两个模块(nginx_upload_module和nginx_uploadprogress_module),命令nginx -V (注意是大写),可以查看Nginx当时编译时候的参数,如果发现有上述两个模块,说明Nginx已经安装了这两个模块。如果没有的话,就需要安装这两个Nginx模块。由于这两个模块不在Nginx源代码中,需要重新编译Nginx,在编译选项中加上
--add-module=/模块源代码路径/nginx_upload_module-2.2.0 --add-module=/模块源代码路径/nginx_uploadprogress_module-0.8.2 。
2、由于产品的前端使用的是jQuery框架,所以,找了一个现成的jQuery下的上传文件插件(ajaxfileupload)。该代码基本原理就是动态创建一个iframe,在iframe中再增加一个form,最后数据放到这个form中提交给服务器,代码量比较小也就200来行代码。前端的代码如下:
其中,success的回调函数参数是服务器返给浏览器的结果。
3、配置Nginx,实现上传模块来接收页面上传的文件。把下面配置添加到Nginx的配置文件中,注意是加在server的上下文中。
location = /upload {
upload_pass /service.php?path=uploadfile&a=upload_server;//表示Nginx接收完上传的文件后,然后交给后端处理的地址
upload_cleanup 400 404 499 500-505; //表示当发生这些http status代码的情况下,会把上传的文件删除
upload_store /tmp/upload_tmp 1;//上传模块接收到的文件临时存放的路径, 1 表示方式,该方式是需要在/tmp/upload_tmp下创建以0到9为目录名称的目录,上传时候会进行一个散列处理。
upload_store_access user:r; //指定访问模式
upload_limit_rate 128k; //设定上传速度上限
upload_set_form_field "${upload_field_name}_name" $upload_file_name; //设定后续脚本语言访问的变量,其中${upload_field_name}对照本例子就是addfile。比如后台PHP就可以通过$_POST['addfile_name']来获取上传文件的名称。
upload_set_form_field "${upload_field_name}_content_type" $upload_content_type;//同上
upload_set_form_field "${upload_field_name}_path" $upload_tmp_path;//由于在upload_store设置了临时文件存放根路径,该路径就是经过散裂后上传文件存在真实路径,比如后续处理可以根据这值把上传文件拷贝或者移动到指定的目录下。
upload_pass_form_field "^.*$";//
upload_pass_args on;// 打开开关,意思就是把前端脚本请求的参数会传给后端的脚本语言,比如:http://192.168.1.203:7100/upload/?k=23.PHP脚本可以通过$_POST['k']来访问。
track_uploads proxied 30s; #30s表示每次链接处理完毕后,链接会保持30s。
}
4、上述配置完了,就可以实现上传的功能了。但是,要获取上传的进度,那还是需要配置另外一个模块nginx_uploadprogress_module。其实,获取当前进度原理比较简单,就是通过javascript以异步方式定时给特定地址发送请求,这个模块会以json格式返回上传的进度。配置比较简单。
1)、首先打开这个模块功能,在Nginx配置文件中http上下文里面,增加upload_progress proxied 5m;其中,proxied表示名称(zone_name官方文档),5m表示每次链接存放跟踪信息的大小。另外,再设置返回格式为json,upload_progress_json_output;
2)、在上述的location = /upload中增加一个配置项track_uploads proxied 30s; 其中,proxied就是刚才在第一步设置的名字,30s表示每次链接处理完毕后,链接会保持30s。
3)、设置一个location来处理javascript发送请求。
location ^~ /progress {
report_uploads proxied; #GET此地址得到上传进度
}
4)、还有一个参数考虑设置upload_progress_header ,这个值缺省是X-Progress-ID。有点类似SessionID,主要用在前台需要在上传文件的时候需要设置这个参数值,比如设置为uuid值。这样javascript每次发送请求要获取上传进度时候,都需要带上这个参数,这样上传进度跟踪模块才知道是返回那个链接的进度。
经过这三步骤,就把上传进度跟踪模块配置好了。现在就需要对前台脚本就行修改
5、修改第2步的前台脚本
上述黑体就是增加的代码,其中,有些函数是调用产品封装好的函数,所以,不要全部照搬。主要是抓住以下几个要点就可以了:
1、在上传文件时候需要增加一个uuid,对应的参数就是upload_progress_header设置的,缺省是X-Progress-ID。
2、在请求获取进度的时候,都要带上这个uuid。
3、设定一个定时期,定时发送异步的GET方式请求,获取进度数据。
4、返回的json格式是{"state":"uploading", "size":3232,"received":34},其中上传完毕state值为done,如果发生错误会,state就是error,并且会返回status,错误编码。
步骤就介绍在这里了。另外,javascript方式上传文件,在用户上传文件时候,最好能获取上传文件大小,这样可以提前告诉用户是否超出允许上传的大小值。但是,目前javascript方式获取文件大小要兼容所有浏览器还是存在问题。我打算还是写个flash,通过flash方式来获取,比较保险。
来自:http://blog.csdn.net/waden/article/details/7040123
更多参考:http://blog.sina.com.cn/s/blog_704836f401014bpj.html
1.php的支持,自带的,就是建立一个fast-cgi跑php,提供一个test.php显示最终结果
2.nginx_upload_module 上传插件
http://www.grid.net.ru/nginx/download/nginx_upload_module-2.2.0.tar.gz
3.nginx_upload_progress_module,上传进度条插件
akostrikov-nginx-upload-progress-module-v0.8.2-1-g3d8e105.zip
http://wiki.nginx.org/HttpUploadProgressModule
下载
https://nodeload.github.com/akostrikov/nginx-upload-progress-module/zipball/master
4.https://github.com/drogus/jquery-upload-progress ,显示进度条的jquery插件
__________________________________________________________________
编译:
疑难问题,nginx: [emerg] zero size shared memory zone "proxied",在nginx.conf里加一行upload_progress proxied 1m;:
解决nginx上传模块nginx_upload_module传递GET参数的方法总结:
http://www.cnblogs.com/lidabo/p/4169752.html
Download:
http://www.grid.net.ru/nginx/download/nginx_upload_module-2.2.0.tar.gz
configure and make :
Nginx配置文件:
较靠谱的文章:http://blog.sina.com.cn/s/blog_704836f401014bpj.html
因为nginx upload module已经做完了最费时的mime解析工作,后端的PHP代码只需要简单的移动文件到合适的位置就可以了。因为upload module是使用C语言写的,比起PHP作解析工作的效率高多了,因此极大地提高了文件上传的效率。
二、upload module的配置参数简要说明
下边是一些配置参数的说明:
upload_pass 指明了需要后续处理的php地址
upload_cleanup 如果php出现400 404 499 500-505之类的错误,则删除上传的文件
upload_store 上传文件存放地址
upload_store_access 上传文件的访问权限,user:r是指用户可读
upload_limit_rate 上传限速,如果设置为0则表示不限制
upload_pass_form_field 从表单原样转到后端的参数,可以正则表达式表示
官方的例子是upload_pass_form_field "^submit$|^description$";
意思是把submit,description这两个字段也原样通过upload_pass传递到后端php处理。如果希望把所有的表单字段都传给后端可以用upload_pass_form_field "^.*$";
---------------
背景:追求极致,由服务器脚本(比如PHP)来负责接收上传的数据。这种方式存在性能和效率的问题。所以,决定采用Nginx的上传模块来完成接收数据的功能,接收完数据后,再去转给后端脚本语言进行后续处理(比如:移动文件、插入文件的信息到数据库中)。
RFC 1867:
module for nginx web server for handling file uploads using multipart/form-data encoding (RFC 1867) and resumable uploads according to this protocol.
Description
The module parses request body storing all files being uploaded to a directory specified by upload_store directive. The files are then being stripped from body and altered request is then passed to a location specified by upload_pass directive, thus allowing arbitrary handling of uploaded files. Each of file fields are being replaced by a set of fields specified by upload_set_form_field directive. The content of each uploaded file then could be read from a file specified by $upload_tmp_path variable or the file could be simply moved to ultimate destination. Removal of output files is controlled by directive upload_cleanup. If a request has a method other than POST, the module returns error 405 (Method not allowed). Requests with such methods could be processed in alternative location via error_page directive.
Nginx.conf
======================================================================
1.上面的#include fastcgi_params; 被我注释掉了,否则出现:405 Method not allowed ,查了下:
Nginx 静态文件中的 POST 请求返还 405 Method not allowed 错误,于是用了9000的PHP端口。
index.php 内容:
上传后返回:
Array
(
[file1_name] => 6597350142123536341.jpg
[file1_content_type] => image/jpeg
[file1_path] => /data/app/test.local/upload_tmp/0000000001
[file1_md5] => 5a84d879e497bf64acebdc84c4701a76
[file1_size] => 110001
[file2] =>
[file3] =>
[file4] =>
[file5] =>
[file6] =>
[submit] => Upload
[test] => value
)
先看一下这个上传目录的结构是这样的,这些编号的都是上传的素材,没有后缀:
/data/app/test.local/upload_tmp# ls
0000000001 0006630963 0006630964
查看目录下有没有这个文件:
ls /data/app/test.local/upload_tmp/0000000001
/data/app/test.local/upload_tmp/0000000001
sz 下来,更名为.jpg的:
sz /data/app/test.local/upload_tmp/0000000001 ==》0000000001.jpg ,打开一看果然是我上传的文件,得证!
把这个文件放到自己定义的目录下:
多个文件的一个情况,也就是多个文件的POST数组规律,去进行移动文件即可:
<input type="file" name="file2">
<input type="file" name="file2">
[file1_name] => 1332460275090024.jpg
[file1_content_type] => image/jpeg
[file1_path] => /data/app/test.local/upload_tmp/0000000034
[file1_md5] => 4e84aac3bc2cc25b7c69c7b506e4967f
[file1_size] => 73702
[file2_name] => desktop.ini
[file2_content_type] => application/octet-stream
[file2_path] => /data/app/test.local/upload_tmp/0000000035
[file2_md5] => dc723b859dec1526568ad581aec334d5
因为nginx upload module已经做完了最费时的mime解析工作,后端的PHP代码只需要简单的移动文件到合适的位置就可以了。因为upload module是使用C语言写的,比起PHP作解析工作的效率高多了,因此极大地提高了文件上传的效率。
upload_cleanup 如果php出现400 404 499 500-505之类的错误,则删除上传的文件,这块可以利用PHP进行逻辑判断后输出header头来进行操作是否删除文件。
======================================================================
补安装编译方法:
1.下载
wget http://www.grid.net.ru/nginx/download/nginx_upload_module-2.2.0.tar.gz
2.编译(在NGINX编译目录执行以下命令, 其中 --add-module=你下载解压的上传插件目录)
./configure --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 --add-module=/root/software/nginx_upload_module-2.2.0
3.上传界面:
参考来源:
1)nginx上传模块—nginx upload module安装:http://waynerqiu.com/7/136.html
2)写得很简洁的安装方法:http://foooy.me/nginx/158.html 【该文里提到的接受PHP,这块没有做详细的配置,参考上面这篇文章即可。】
3)http://anerg.com/read.php?55
//这一篇文章描述到:upload_pass /index.php?c=uploader&a=upload_server; 也就是有框架时怎么用框架的action来进行处理。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
最后,后记备查用相关模块的使用:
听说有一个哥们解决了get的问题,通过相关nginx的指令实现的,没实践:http://waynerqiu.com/7/139.html
还有实现断点续传,进度显示等的:
最近做一个产品,需要实现从网页上传文件给服务器。一般情况下都是采用Ajax异步方式,创建一个iframe,在iframe里面把数据以form方式提交给后端的服务器脚本,由服务器脚本(比如PHP)来负责接收上传的数据。这种方式存在性能和效率的问题。所以,决定采用Nginx的上传模块来完成接收数据的功能,接收完数据后,再去转给后端脚本语言进行后续处理(比如:移动文件、插入文件的信息到数据库中)。同时,由于需要在前端展现上传的进度,因此可以利用Nginx一个uploadprogress模块来获取。
整个处理框图如下:
实现步骤:
1、查看Nginx是否安装了这两个模块(nginx_upload_module和nginx_uploadprogress_module),命令nginx -V (注意是大写),可以查看Nginx当时编译时候的参数,如果发现有上述两个模块,说明Nginx已经安装了这两个模块。如果没有的话,就需要安装这两个Nginx模块。由于这两个模块不在Nginx源代码中,需要重新编译Nginx,在编译选项中加上
--add-module=/模块源代码路径/nginx_upload_module-2.2.0 --add-module=/模块源代码路径/nginx_uploadprogress_module-0.8.2 。
2、由于产品的前端使用的是jQuery框架,所以,找了一个现成的jQuery下的上传文件插件(ajaxfileupload)。该代码基本原理就是动态创建一个iframe,在iframe中再增加一个form,最后数据放到这个form中提交给服务器,代码量比较小也就200来行代码。前端的代码如下:
其中,success的回调函数参数是服务器返给浏览器的结果。
3、配置Nginx,实现上传模块来接收页面上传的文件。把下面配置添加到Nginx的配置文件中,注意是加在server的上下文中。
location = /upload {
upload_pass /service.php?path=uploadfile&a=upload_server;//表示Nginx接收完上传的文件后,然后交给后端处理的地址
upload_cleanup 400 404 499 500-505; //表示当发生这些http status代码的情况下,会把上传的文件删除
upload_store /tmp/upload_tmp 1;//上传模块接收到的文件临时存放的路径, 1 表示方式,该方式是需要在/tmp/upload_tmp下创建以0到9为目录名称的目录,上传时候会进行一个散列处理。
upload_store_access user:r; //指定访问模式
upload_limit_rate 128k; //设定上传速度上限
upload_set_form_field "${upload_field_name}_name" $upload_file_name; //设定后续脚本语言访问的变量,其中${upload_field_name}对照本例子就是addfile。比如后台PHP就可以通过$_POST['addfile_name']来获取上传文件的名称。
upload_set_form_field "${upload_field_name}_content_type" $upload_content_type;//同上
upload_set_form_field "${upload_field_name}_path" $upload_tmp_path;//由于在upload_store设置了临时文件存放根路径,该路径就是经过散裂后上传文件存在真实路径,比如后续处理可以根据这值把上传文件拷贝或者移动到指定的目录下。
upload_pass_form_field "^.*$";//
upload_pass_args on;// 打开开关,意思就是把前端脚本请求的参数会传给后端的脚本语言,比如:http://192.168.1.203:7100/upload/?k=23.PHP脚本可以通过$_POST['k']来访问。
track_uploads proxied 30s; #30s表示每次链接处理完毕后,链接会保持30s。
}
4、上述配置完了,就可以实现上传的功能了。但是,要获取上传的进度,那还是需要配置另外一个模块nginx_uploadprogress_module。其实,获取当前进度原理比较简单,就是通过javascript以异步方式定时给特定地址发送请求,这个模块会以json格式返回上传的进度。配置比较简单。
1)、首先打开这个模块功能,在Nginx配置文件中http上下文里面,增加upload_progress proxied 5m;其中,proxied表示名称(zone_name官方文档),5m表示每次链接存放跟踪信息的大小。另外,再设置返回格式为json,upload_progress_json_output;
2)、在上述的location = /upload中增加一个配置项track_uploads proxied 30s; 其中,proxied就是刚才在第一步设置的名字,30s表示每次链接处理完毕后,链接会保持30s。
3)、设置一个location来处理javascript发送请求。
location ^~ /progress {
report_uploads proxied; #GET此地址得到上传进度
}
4)、还有一个参数考虑设置upload_progress_header ,这个值缺省是X-Progress-ID。有点类似SessionID,主要用在前台需要在上传文件的时候需要设置这个参数值,比如设置为uuid值。这样javascript每次发送请求要获取上传进度时候,都需要带上这个参数,这样上传进度跟踪模块才知道是返回那个链接的进度。
经过这三步骤,就把上传进度跟踪模块配置好了。现在就需要对前台脚本就行修改
5、修改第2步的前台脚本
上述黑体就是增加的代码,其中,有些函数是调用产品封装好的函数,所以,不要全部照搬。主要是抓住以下几个要点就可以了:
1、在上传文件时候需要增加一个uuid,对应的参数就是upload_progress_header设置的,缺省是X-Progress-ID。
2、在请求获取进度的时候,都要带上这个uuid。
3、设定一个定时期,定时发送异步的GET方式请求,获取进度数据。
4、返回的json格式是{"state":"uploading", "size":3232,"received":34},其中上传完毕state值为done,如果发生错误会,state就是error,并且会返回status,错误编码。
步骤就介绍在这里了。另外,javascript方式上传文件,在用户上传文件时候,最好能获取上传文件大小,这样可以提前告诉用户是否超出允许上传的大小值。但是,目前javascript方式获取文件大小要兼容所有浏览器还是存在问题。我打算还是写个flash,通过flash方式来获取,比较保险。
来自:http://blog.csdn.net/waden/article/details/7040123
更多参考:http://blog.sina.com.cn/s/blog_704836f401014bpj.html
client_max_body_size这个参数限制了上传文件的大小,默认是1M,此参数是在代理设置文件中配置的!!!
对于nginx+php的一些网站,上传文件大小会受到多个方面的限制,一个是nginx本身的限制,限制了客户端上传文件的大小,一个是php.ini文件中默认了多个地方的设置。所以为了解决上传文件大小限定的问题必须要做出多处修改。以下整理了几个地方。
1、修改/usr/local/nginx/conf/nginx.conf 文件,查找 client_max_body_size 将后面的值设置为你想设置的值。比如:
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
root /home/www/htdocs;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /home/www/htdocs$fastcgi_script_name;
include fastcgi_params;
client_max_body_size 35m; #客户端上传文件大小设为35M
client_body_temp_path /home/www/nginx_temp; #设置临时目录
}
测试一下配置文件/usr/local/nginx/sbin/nginx -t
重启nginx:kill -HUP `cat /usr/local/nginx/logs/nginx.pid`
这里我的设置是1000M的上限,通过修改client_max_body_size 设置的大小,重启nginx服务,解决了文件上传问题!
2、修改php.ini
在php.ini里面查看如下行:
upload_max_filesize = 8M
post_max_size = 10M
memory_limit = 20M
max_execution_time=300
file_uploads = On
默认允许HTTP文件上传,此选项不能设置为OFF。
upload_tmp_dir =/tmp/www
在上传大文件时,你会有上传速度慢的感觉,当超过一定的时间,会报脚本执行超过30秒的错误,这是因为在php.ini配置文件中max_execution_time配置选项在作怪,其表示每个脚本最大允许执行时间(秒),0 表示没有限制。你可以适当调整max_execution_time的值,不推荐设定为0。
来自:http://blog.csdn.net/babydavic/article/details/6031773
http://admirestator.diandian.com/post/2012-04-28/19237704
对于nginx+php的一些网站,上传文件大小会受到多个方面的限制,一个是nginx本身的限制,限制了客户端上传文件的大小,一个是php.ini文件中默认了多个地方的设置。所以为了解决上传文件大小限定的问题必须要做出多处修改。以下整理了几个地方。
1、修改/usr/local/nginx/conf/nginx.conf 文件,查找 client_max_body_size 将后面的值设置为你想设置的值。比如:
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
root /home/www/htdocs;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /home/www/htdocs$fastcgi_script_name;
include fastcgi_params;
client_max_body_size 35m; #客户端上传文件大小设为35M
client_body_temp_path /home/www/nginx_temp; #设置临时目录
}
测试一下配置文件/usr/local/nginx/sbin/nginx -t
重启nginx:kill -HUP `cat /usr/local/nginx/logs/nginx.pid`
这里我的设置是1000M的上限,通过修改client_max_body_size 设置的大小,重启nginx服务,解决了文件上传问题!
2、修改php.ini
在php.ini里面查看如下行:
upload_max_filesize = 8M
post_max_size = 10M
memory_limit = 20M
max_execution_time=300
file_uploads = On
默认允许HTTP文件上传,此选项不能设置为OFF。
upload_tmp_dir =/tmp/www
在上传大文件时,你会有上传速度慢的感觉,当超过一定的时间,会报脚本执行超过30秒的错误,这是因为在php.ini配置文件中max_execution_time配置选项在作怪,其表示每个脚本最大允许执行时间(秒),0 表示没有限制。你可以适当调整max_execution_time的值,不推荐设定为0。
来自:http://blog.csdn.net/babydavic/article/details/6031773
http://admirestator.diandian.com/post/2012-04-28/19237704
[实践OK]curl命令获取HTTP头文件,Curl下面用Post加-d访问后无法单独获取PUT方式的HTTP头,得用curl -s -d'test=test' -D- -o/tmp/null.txt http://xxxxxxxx.com/post.php 。
Unix/LinuxC技术 jackxiang 2013-4-8 10:33
经实践和抓包测试发现,不能将-d和-I一起用的原因是-d是POST方式,而 -I 则是PUT方式,且-I并没有内容返回,只是返回服务器的Header头部信息,两者混用就会出现矛盾,所以提示:Warning: You can only select one HTTP request method! You asked for both POST
Warning: (-d, --data) and HEAD (-I, --head).
一、下面这中方法,CURL的方式进行Post数据同时,并显示出头部Header信息:
curl -s -d'test=test' -D- -o/tmp/null.txt http://coding.jackxiang.com/src-ui/postcaptcha.php #注意-D 后面的-,表示输出“文件”是标准输出。
上面命令行细节如下:-D- :D后面有一个中间杠:
-s 不输出:Total % Received % Xferd Average Speed Time Time Time Current信息
HTTP/1.1 200 OK
Server: openresty
Date: Tue, 30 May 2023 08:19:58 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Accept-Encoding
Vary: Accept-Encoding
cat /tmp/null.txt
Array
(
[test] => test
)
======Wireshark抓包如下(有数据从服务器上返回)======
经实测发现并不是真正的Head方法:
二、而如果真用Head方法,则是这样的:
curl -I http://coding.jackxiang.com/src-ui/postcaptcha.php
HTTP/1.1 200 OK
Server: openresty
Date: Tue, 30 May 2023 08:21:39 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
Vary: Accept-Encoding
Vary: Accept-Encoding
======Wireshark抓包如下(只返回Header头,没有其它数据从服务器上返回)======
HEAD /src-ui/postcaptcha.php HTTP/1.1
Host: coding.jackxiang.com
User-Agent: curl/7.87.0
Accept: */*
HTTP/1.1 200 OK
Server: openresty
Date: Tue, 30 May 2023 08:16:52 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
Vary: Accept-Encoding
Vary: Accept-Encoding
POST的demo代码基础测试:
curl -d"test=test" http://coding.jackxiang.com/src-ui/postcaptcha.php
Array
(
[test] => test
)
postcaptcha.php
curl中的-I选项使用HEAD方法自动发出http请求,是指哪些请求呢?
在cURL中,使用-I选项会发出一个HEAD方法的HTTP请求。HEAD方法是HTTP协议中的一种请求方法,它类似于GET方法,但服务器只返回响应头部信息而不返回实际的响应内容主体。
当你使用curl -I <URL>命令时,-I选项会告诉cURL发送一个HEAD请求,并返回服务器对该请求的响应头部信息。这对于获取有关资源的元数据、检查资源的状态或验证资源是否存在等场景非常有用,而无需获取整个响应内容。
请注意,由于HEAD方法只返回响应头部信息,因此响应的主体部分为空。这使得HEAD请求比GET请求更轻量级,因为它不需要传输和处理响应的实际内容。
总结起来,curl -I <URL>会发送一个HEAD请求,并返回服务器对该请求的响应头部信息,而不返回响应的主体内容。
[/codes]
附:
The -I option tells curl to do a HEAD request while the -d'test=test' option tells curl to do a POST, so you're telling curl to do two different request types.
curl -s -d'test=test' -D- -o/dev/null http://coding.jackxiang.com/src-ui/postcaptcha.php
or, on Windows:
curl -s -d'test=test' -D- -onul: http://coding.jackxiang.com/src-ui/postcaptcha.php
背景:有时一个页面莫名奇妙变为:您请求的页面发生错误! 这显然是经过http做的http头的redirect,于是否怎么知道呢?用curl
curl命令获取HTTP头文件:
看下Cookie吧:
用Curl试试看,主要是看Cookie的过期时间,是怎么发送的:
一)其实用HttpWatcher也能看到Http给浏览器发送的头的Cookie时间,如下:
二)用Fiddler2也能看,在返回(下面),选 header也能看到Cookie的过期时间。(想了解整个可以在Url上右键,后选:Copy --> Header Only。)
三)用Firefox下的firebug也能看到时间。
四)Chrome也能看,F12调出开发者工具后,Resources Cookies 域名里就有它。(它对Cookie的时间作了列分割,前面都是大大的显示出来。)
看到了吧:Location: http://w.xiyou.cntv.cn/error.html ,它就是转向的根源,它向浏览器发送了这样一个http的头,于是你就看到了这个转向了的页面。
阅读全文
Warning: (-d, --data) and HEAD (-I, --head).
一、下面这中方法,CURL的方式进行Post数据同时,并显示出头部Header信息:
curl -s -d'test=test' -D- -o/tmp/null.txt http://coding.jackxiang.com/src-ui/postcaptcha.php #注意-D 后面的-,表示输出“文件”是标准输出。
上面命令行细节如下:-D- :D后面有一个中间杠:
-s 不输出:Total % Received % Xferd Average Speed Time Time Time Current信息
HTTP/1.1 200 OK
Server: openresty
Date: Tue, 30 May 2023 08:19:58 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Accept-Encoding
Vary: Accept-Encoding
cat /tmp/null.txt
Array
(
[test] => test
)
======Wireshark抓包如下(有数据从服务器上返回)======
经实测发现并不是真正的Head方法:
二、而如果真用Head方法,则是这样的:
curl -I http://coding.jackxiang.com/src-ui/postcaptcha.php
HTTP/1.1 200 OK
Server: openresty
Date: Tue, 30 May 2023 08:21:39 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
Vary: Accept-Encoding
Vary: Accept-Encoding
======Wireshark抓包如下(只返回Header头,没有其它数据从服务器上返回)======
HEAD /src-ui/postcaptcha.php HTTP/1.1
Host: coding.jackxiang.com
User-Agent: curl/7.87.0
Accept: */*
HTTP/1.1 200 OK
Server: openresty
Date: Tue, 30 May 2023 08:16:52 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
Vary: Accept-Encoding
Vary: Accept-Encoding
POST的demo代码基础测试:
curl -d"test=test" http://coding.jackxiang.com/src-ui/postcaptcha.php
Array
(
[test] => test
)
postcaptcha.php
curl中的-I选项使用HEAD方法自动发出http请求,是指哪些请求呢?
在cURL中,使用-I选项会发出一个HEAD方法的HTTP请求。HEAD方法是HTTP协议中的一种请求方法,它类似于GET方法,但服务器只返回响应头部信息而不返回实际的响应内容主体。
当你使用curl -I <URL>命令时,-I选项会告诉cURL发送一个HEAD请求,并返回服务器对该请求的响应头部信息。这对于获取有关资源的元数据、检查资源的状态或验证资源是否存在等场景非常有用,而无需获取整个响应内容。
请注意,由于HEAD方法只返回响应头部信息,因此响应的主体部分为空。这使得HEAD请求比GET请求更轻量级,因为它不需要传输和处理响应的实际内容。
总结起来,curl -I <URL>会发送一个HEAD请求,并返回服务器对该请求的响应头部信息,而不返回响应的主体内容。
[/codes]
附:
The -I option tells curl to do a HEAD request while the -d'test=test' option tells curl to do a POST, so you're telling curl to do two different request types.
curl -s -d'test=test' -D- -o/dev/null http://coding.jackxiang.com/src-ui/postcaptcha.php
or, on Windows:
curl -s -d'test=test' -D- -onul: http://coding.jackxiang.com/src-ui/postcaptcha.php
背景:有时一个页面莫名奇妙变为:您请求的页面发生错误! 这显然是经过http做的http头的redirect,于是否怎么知道呢?用curl
curl命令获取HTTP头文件:
看下Cookie吧:
用Curl试试看,主要是看Cookie的过期时间,是怎么发送的:
一)其实用HttpWatcher也能看到Http给浏览器发送的头的Cookie时间,如下:
二)用Fiddler2也能看,在返回(下面),选 header也能看到Cookie的过期时间。(想了解整个可以在Url上右键,后选:Copy --> Header Only。)
三)用Firefox下的firebug也能看到时间。
四)Chrome也能看,F12调出开发者工具后,Resources Cookies 域名里就有它。(它对Cookie的时间作了列分割,前面都是大大的显示出来。)
看到了吧:Location: http://w.xiyou.cntv.cn/error.html ,它就是转向的根源,它向浏览器发送了这样一个http的头,于是你就看到了这个转向了的页面。
阅读全文
背景:一般用ab压力测试一个server时,这个Requests per second是一个最关键的指标,如: ab -c 100 -n 1000 http://jackxiang.com/qpsTest.php 这样的格式。也就是说起100个客户端,每个客户端请求1000次,看这个服务器的一个并发输出能力。TPS才是其处理能力。
Requests per second 术语说明:
QPS = req/sec = 请求数/秒
【QPS计算PV和机器的方式】
QPS统计方式 [一般使用 http_load 进行统计]
QPS = 总请求数 / ( 进程总数 * 请求时间 )
QPS: 单个进程每秒请求服务器的成功次数
单台服务器每天PV计算
公式1:每天总PV = QPS * 3600 * 6
公式2:每天总PV = QPS * 3600 * 8
如:QPS=5000,每天有170万的PV,问是否需要进行接口压力测试或是增加服务器吗?
5000*3600*6=108000000 = 1亿多,不用,至于压力测试,有必要,是不是真的能上5000得压测下。
这170W一秒内来了,你也不挂了,得压测一下看接口真的能上5000QPS?
服务器计算
服务器数量 = ceil( 每天总PV / 单台服务器每天总PV )
【峰值QPS和机器计算公式】
原理:每天80%的访问集中在20%的时间里,这20%时间叫做峰值时间
公式:( 总PV数 * 80% ) / ( 每天秒数 * 20% ) = 峰值时间每秒请求数(QPS)
机器:峰值时间每秒QPS / 单台机器的QPS = 需要的机器
问:每天300w PV 的在单台机器上,这台机器需要多少QPS?
答:( 3000000 * 0.8 ) / (86400 * 0.2 ) = 139 (QPS)
问:如果一台机器的QPS是58,需要几台机器来支持?
答:139 / 58 = 3
http://blog.hummingbird-one.com/?tag=web-%E6%80%A7%E8%83%BD-qps-%E7%AD%89%E5%BE%85%E6%97%B6%E9%97%B4
Mysql的Innodb是有TPS的,要是MyISM的话用下面的脚本:(来自网络)
QPS (Query per second) (每秒查询量)
TPS(Transaction per second) (每秒事务量,如果是InnoDB会显示,没有InnoDB就不会显示)
计算方法
___________________________________________________________
QPS
Questions = SHOW GLOBAL STATUS LIKE 'Questions';
Uptime = SHOW GLOBAL STATUS LIKE 'Uptime';
QPS=Questions/Uptime
TPS
Com_commit = SHOW GLOBAL STATUS LIKE 'Com_commit';
Com_rollback = SHOW GLOBAL STATUS LIKE 'Com_rollback';
Uptime = SHOW GLOBAL STATUS LIKE 'Uptime';
TPS=(Com_commit + Com_rollback)/Uptime
MySQL的QPS计算
show global status where Variable_name in('com_select','com_insert','com_delete','com_update');
等待10秒
show global status where Variable_name in('com_select','com_insert','com_delete','com_update');
计算差值
MySQL的TPS计算
show global status where Variable_name in('com_insert','com_delete','com_update');
等待10秒
show global status where Variable_name in('com_insert','com_delete','com_update');
计算差值
Requests per second 术语说明:
QPS = req/sec = 请求数/秒
【QPS计算PV和机器的方式】
QPS统计方式 [一般使用 http_load 进行统计]
QPS = 总请求数 / ( 进程总数 * 请求时间 )
QPS: 单个进程每秒请求服务器的成功次数
单台服务器每天PV计算
公式1:每天总PV = QPS * 3600 * 6
公式2:每天总PV = QPS * 3600 * 8
如:QPS=5000,每天有170万的PV,问是否需要进行接口压力测试或是增加服务器吗?
5000*3600*6=108000000 = 1亿多,不用,至于压力测试,有必要,是不是真的能上5000得压测下。
这170W一秒内来了,你也不挂了,得压测一下看接口真的能上5000QPS?
服务器计算
服务器数量 = ceil( 每天总PV / 单台服务器每天总PV )
【峰值QPS和机器计算公式】
原理:每天80%的访问集中在20%的时间里,这20%时间叫做峰值时间
公式:( 总PV数 * 80% ) / ( 每天秒数 * 20% ) = 峰值时间每秒请求数(QPS)
机器:峰值时间每秒QPS / 单台机器的QPS = 需要的机器
问:每天300w PV 的在单台机器上,这台机器需要多少QPS?
答:( 3000000 * 0.8 ) / (86400 * 0.2 ) = 139 (QPS)
问:如果一台机器的QPS是58,需要几台机器来支持?
答:139 / 58 = 3
http://blog.hummingbird-one.com/?tag=web-%E6%80%A7%E8%83%BD-qps-%E7%AD%89%E5%BE%85%E6%97%B6%E9%97%B4
Mysql的Innodb是有TPS的,要是MyISM的话用下面的脚本:(来自网络)
QPS (Query per second) (每秒查询量)
TPS(Transaction per second) (每秒事务量,如果是InnoDB会显示,没有InnoDB就不会显示)
计算方法
___________________________________________________________
QPS
Questions = SHOW GLOBAL STATUS LIKE 'Questions';
Uptime = SHOW GLOBAL STATUS LIKE 'Uptime';
QPS=Questions/Uptime
TPS
Com_commit = SHOW GLOBAL STATUS LIKE 'Com_commit';
Com_rollback = SHOW GLOBAL STATUS LIKE 'Com_rollback';
Uptime = SHOW GLOBAL STATUS LIKE 'Uptime';
TPS=(Com_commit + Com_rollback)/Uptime
MySQL的QPS计算
show global status where Variable_name in('com_select','com_insert','com_delete','com_update');
等待10秒
show global status where Variable_name in('com_select','com_insert','com_delete','com_update');
计算差值
MySQL的TPS计算
show global status where Variable_name in('com_insert','com_delete','com_update');
等待10秒
show global status where Variable_name in('com_insert','com_delete','com_update');
计算差值
背景:对于Mysql下的单向同步Master/slave目前好多都在用,而对于双机热备确实是一个在为了解决多区域下的访问提速上有所应用。
阅读全文
阅读全文
背景:近来发现bo-blog确实快,但Wordpress有一个优势就是它有Iphone,Android,Ipad里的APP,开启 WordPress 键盘快捷键方法可以提高效率。
有时间是否有必要加上缓存插件,Hack下这个Wordpress让其速度更快?
官网:http://codex.wordpress.org/zh-cn:%E9%94%AE%E7%9B%98%E5%BF%AB%E6%8D%B7%E9%94%AE
开启 WordPress 键盘快捷键方法:
键盘快捷键的开启、关闭,并不是全局设定的,而是用户的个人选项 —— 用户可在其个人资料编辑页面(管理页面 > 用户 > 我的个人资料)进行启用。选中键盘快捷键的复选框来启用评论审核的快捷键。
使用键盘快捷键导航
a:审核通过当前选中的留言
s:标记当前选中的留言为 spam
d:删除选择的留言(没有确定,直接删除,小心操作)
u:标记当前选中留言为审核未通过。
r:打开回复当前留言(按Esc可取消当前回复)。
q:打开快捷编辑当前留言。
e:跳转到独立的编辑留言页面。
j:向下选择。当到达页面底部时,如果有下一页,将翻到下一页
k:向上选择。当到达页面顶部时,如果有上一页,将反倒上一页
Shift-a:审核通过当前选中的留言
Shift-s:标记当前选中的留言为 spam
Shift-d:删除选中的留言
Shift-u:标记当前选中留言为审核未通过
对鼠标特依赖的网友可以尝试一下这个。。
快捷键编辑文章:
加粗: Alt+SHIFT+b
斜体: Alt+SHIFT+i
链接: Alt+SHIFT+a
Blockquote引用: Alt+SHIFT+q
代码: Alt+SHIFT+c
Read More 截断文章: Alt+SHIFT+t
无序列表 (ul): Alt+SHIFT+u
有序列表 (ol): Alt+SHIFT+o
列表项目 (li): Alt+SHIFT+l
发布文章: Alt+SHIFT+p
插入当前时间: Alt+SHIFT+s
加删除线: Alt+SHIFT+d
撤消: Alt+SHIFT+u
重做: Alt+SHIFT+y
切换到富文本编辑器: Alt+SHIFT+v
切换到HTML编辑模式: Alt+SHIFT+e
居左: Alt+SHIFT+f
居中: Alt+SHIFT+c
居左: Alt+SHIFT+r
有时间是否有必要加上缓存插件,Hack下这个Wordpress让其速度更快?
官网:http://codex.wordpress.org/zh-cn:%E9%94%AE%E7%9B%98%E5%BF%AB%E6%8D%B7%E9%94%AE
开启 WordPress 键盘快捷键方法:
键盘快捷键的开启、关闭,并不是全局设定的,而是用户的个人选项 —— 用户可在其个人资料编辑页面(管理页面 > 用户 > 我的个人资料)进行启用。选中键盘快捷键的复选框来启用评论审核的快捷键。
使用键盘快捷键导航
a:审核通过当前选中的留言
s:标记当前选中的留言为 spam
d:删除选择的留言(没有确定,直接删除,小心操作)
u:标记当前选中留言为审核未通过。
r:打开回复当前留言(按Esc可取消当前回复)。
q:打开快捷编辑当前留言。
e:跳转到独立的编辑留言页面。
j:向下选择。当到达页面底部时,如果有下一页,将翻到下一页
k:向上选择。当到达页面顶部时,如果有上一页,将反倒上一页
Shift-a:审核通过当前选中的留言
Shift-s:标记当前选中的留言为 spam
Shift-d:删除选中的留言
Shift-u:标记当前选中留言为审核未通过
对鼠标特依赖的网友可以尝试一下这个。。
快捷键编辑文章:
加粗: Alt+SHIFT+b
斜体: Alt+SHIFT+i
链接: Alt+SHIFT+a
Blockquote引用: Alt+SHIFT+q
代码: Alt+SHIFT+c
Read More 截断文章: Alt+SHIFT+t
无序列表 (ul): Alt+SHIFT+u
有序列表 (ol): Alt+SHIFT+o
列表项目 (li): Alt+SHIFT+l
发布文章: Alt+SHIFT+p
插入当前时间: Alt+SHIFT+s
加删除线: Alt+SHIFT+d
撤消: Alt+SHIFT+u
重做: Alt+SHIFT+y
切换到富文本编辑器: Alt+SHIFT+v
切换到HTML编辑模式: Alt+SHIFT+e
居左: Alt+SHIFT+f
居中: Alt+SHIFT+c
居左: Alt+SHIFT+r
ext4禁用日志功能--听说ext4有丢失数据的可能。
Unix/LinuxC技术 jackxiang 2013-4-3 15:06
正在使用 Ext4 文件系统的同学可得当心了。据某些用户反映,它可能会造成你的数据丢失。国外一位 Kubuntu Jaunty 的用户称,使用 Ext4 文件系统使他丢失了大量的数据,相关描述可参见位于 launchpad 上的 bug 报告。
无独有偶,国内的 albert748 也遇到了类似的问题。他描述道,X 无缘无故死掉,断电重启后,发现 Firefox 的配置丢了很多。与上面那位国外用户一样,albert748 也使用 2.6.28 内核和 Ext4 文件系统。
今天,H-Online 刊登了一篇文章 Ext4 data loss; explanations and workarounds,其中对此进行了解释,并包含 Ext4 开发者 Ted Ts'o 提供的解决方案,有兴趣的同学可去看看。
http://linuxtoy.org/archives/ext4-data-loss.html
阅读全文
无独有偶,国内的 albert748 也遇到了类似的问题。他描述道,X 无缘无故死掉,断电重启后,发现 Firefox 的配置丢了很多。与上面那位国外用户一样,albert748 也使用 2.6.28 内核和 Ext4 文件系统。
今天,H-Online 刊登了一篇文章 Ext4 data loss; explanations and workarounds,其中对此进行了解释,并包含 Ext4 开发者 Ted Ts'o 提供的解决方案,有兴趣的同学可去看看。
http://linuxtoy.org/archives/ext4-data-loss.html
阅读全文
PHP用CURL伪造IP和来源
Php/Js/Shell/Go jackxiang 2013-4-3 12:08
今天群里一个朋友在问这个问题。
查了下,CURL确实很强悍的可以伪造IP和来源。
1.php 请求 2.php 。
1.php代码:
2.php代码如下:
伪造成功,这是不是给“刷票”的朋友提供了很好的换IP的方案!!
哈哈。
结果:
HTTP/1.1 200 OK Date: Wed, 03 Apr 2013 06:20:42 GMT Server: Apache/2.2.22 (Win32) PHP/5.3.13 X-Powered-By: PHP/5.3.13 Content-Length: 44 Content-Type: text/html
IP: 8.8.8.8
referer: http://www.gosoa.com.cn/
来自:http://www.gosoa.com.cn/php%E7%94%A8curl%E4%BC%AA%E9%80%A0ip%E5%92%8C%E6%9D%A5%E6%BA%90
用Post方式在手机上传,PHP做接收文件,出现了411:
关于411,看是不是你们发送时的问题呢?
在使用jquery 的ajax提交时,在FireFox中会出现411 Length Required的返回错误,而IE6却没问题,郁闷好久,今天搜到一篇文章终于解决。
http://www.cnblogs.com/RChen/archive/2007/11/22/968992.html
原来是 dataType:'text', data:'',需要指定,晕。
E文解释:
HTTP Error 411 - Length Required:
411 Status Code Explained
The 411 status code occurs when the server refuses to process a request because the content length was not specified.
Why it occurs
Your client did not define the length of the requested content in the request header. The server will not accept the request without a valid Content-Length header field.
Fixing 411 Error Code
The problem can only be resolved by examining what your client system is trying to do then discussing with your ISP why the Web server expects a 'Content-Length' specification. If you are monitor your website through 100pulse, we will intimate whenever you encounter 411 status code error through e-mail or Short message service.
http://100pulse.com/http-statuscode/411.jsp
具体问题,有待进一步分析,先备案在这儿...
关于411,看是不是你们发送时的问题呢?
在使用jquery 的ajax提交时,在FireFox中会出现411 Length Required的返回错误,而IE6却没问题,郁闷好久,今天搜到一篇文章终于解决。
http://www.cnblogs.com/RChen/archive/2007/11/22/968992.html
原来是 dataType:'text', data:'',需要指定,晕。
E文解释:
HTTP Error 411 - Length Required:
411 Status Code Explained
The 411 status code occurs when the server refuses to process a request because the content length was not specified.
Why it occurs
Your client did not define the length of the requested content in the request header. The server will not accept the request without a valid Content-Length header field.
Fixing 411 Error Code
The problem can only be resolved by examining what your client system is trying to do then discussing with your ISP why the Web server expects a 'Content-Length' specification. If you are monitor your website through 100pulse, we will intimate whenever you encounter 411 status code error through e-mail or Short message service.
http://100pulse.com/http-statuscode/411.jsp
具体问题,有待进一步分析,先备案在这儿...
大家知道,vmware若使用动态增加 虚拟硬盘的方式,在使用一段时间后, 虚拟硬盘会变得越来越大,此时我们可 能会尝试去删除一些文件,可是当我们 删除文件后会发现:实际使用的空间是 变小了,但是真正占用的硬盘物理空间 并没有真正被释放出来。值得高兴的 是,vmware提供了vmware-vdiskmanager.exe工具,可以用来压缩 (或者说释放)未使用的虚拟硬盘空 间。 一般情况下,我们使用如下步骤就 可以压缩虚拟硬盘空间了:
1、停止虚拟机
2、cd "C:\Program Files\VMware\VMware Workstation"
3、vmware-vdiskmanager.exe -k path\to\your\VirtualDisk.vmdk
不幸的是,目前的vmware提供的 vmware-vdiskmanager.exe工具不能很好地 压缩ext4格式的文件系统(ext4是一种日 志文件系统,ubuntu默认采用该格式的 文件系统,在系统突然掉电时可以保护 我们的系统不会crash)。若你的系统的 文件系统格式是ext4格式,
则需要采用 如下操作方式才可顺利对虚拟硬盘进行 压缩:
1、sudo apt-get clean
2、sudo dd if=/dev/zero of=/0bits bs=20971520
3、sudo rm /0bits
4、停止虚拟机
5、cd "C:\Program Files\VMware\VMware Workstation"
6、vmware-vdiskmanager.exe -k path\to\your\VirtualDisk.vmdk
经过上述6个步骤后,你的系统是否 变“苗条”了许多呢? 压缩完成后,第一次启动系统可能 会出现gnome错误。没关系,停止虚拟 机,再重新start后就恢复正常啦!
来自:http://www.360doc.com/content/11/0510/17/3406069_115755307.shtml
1、停止虚拟机
2、cd "C:\Program Files\VMware\VMware Workstation"
3、vmware-vdiskmanager.exe -k path\to\your\VirtualDisk.vmdk
不幸的是,目前的vmware提供的 vmware-vdiskmanager.exe工具不能很好地 压缩ext4格式的文件系统(ext4是一种日 志文件系统,ubuntu默认采用该格式的 文件系统,在系统突然掉电时可以保护 我们的系统不会crash)。若你的系统的 文件系统格式是ext4格式,
则需要采用 如下操作方式才可顺利对虚拟硬盘进行 压缩:
1、sudo apt-get clean
2、sudo dd if=/dev/zero of=/0bits bs=20971520
3、sudo rm /0bits
4、停止虚拟机
5、cd "C:\Program Files\VMware\VMware Workstation"
6、vmware-vdiskmanager.exe -k path\to\your\VirtualDisk.vmdk
经过上述6个步骤后,你的系统是否 变“苗条”了许多呢? 压缩完成后,第一次启动系统可能 会出现gnome错误。没关系,停止虚拟 机,再重新start后就恢复正常啦!
来自:http://www.360doc.com/content/11/0510/17/3406069_115755307.shtml
背景:用word2010的修订功能用习惯经,一外包兄弟过来里面是Word 2003,我日,找不到放在哪儿了。
不知道你的Word是哪个版本的,是2003还是2007的?
2007版:
打开一个Word文档,再页面上方的功能栏中有一个审阅按钮,点击进入在中间的位置有一个“修订”按钮,选中后,对文档中的文字编辑,会留下修改痕迹。
2003版:
打开一个Word文档,在上方的“工具”下拉框中,选择“修订”选项,即可以对文档内容进行编辑,修改,会出现修改痕迹。
参考:http://zhidao.baidu.com/question/151344740.html
接受和拒绝批注:无法接受或拒绝批注本身。接受批注就是不管它。拒绝批注则是删除它。
接受和拒绝修订:当接受修订时,它将从修订转换为常规文字。当接受删除时,它将从整个文档中删除。拒绝插入内容即是将其删除。拒绝删除内容即是保留原始文本。如果接受格式更改,它们就会应用于文本的最终版本。拒绝格式更改,格式将被删除。
“审阅”功能区中的“接受”和“拒绝”按钮分为上下两部分。“接受”按钮下部分的功能选项下图所示,拒绝选项与此类似。注意第三个选项“接受所有显示的修订”只有在一种或多种更改隐藏在“显示标记”工具中才可用。
不知道你的Word是哪个版本的,是2003还是2007的?
2007版:
打开一个Word文档,再页面上方的功能栏中有一个审阅按钮,点击进入在中间的位置有一个“修订”按钮,选中后,对文档中的文字编辑,会留下修改痕迹。
2003版:
打开一个Word文档,在上方的“工具”下拉框中,选择“修订”选项,即可以对文档内容进行编辑,修改,会出现修改痕迹。
参考:http://zhidao.baidu.com/question/151344740.html
接受和拒绝批注:无法接受或拒绝批注本身。接受批注就是不管它。拒绝批注则是删除它。
接受和拒绝修订:当接受修订时,它将从修订转换为常规文字。当接受删除时,它将从整个文档中删除。拒绝插入内容即是将其删除。拒绝删除内容即是保留原始文本。如果接受格式更改,它们就会应用于文本的最终版本。拒绝格式更改,格式将被删除。
“审阅”功能区中的“接受”和“拒绝”按钮分为上下两部分。“接受”按钮下部分的功能选项下图所示,拒绝选项与此类似。注意第三个选项“接受所有显示的修订”只有在一种或多种更改隐藏在“显示标记”工具中才可用。
hosts文件拒绝访问解决办法,host文件给隐藏了并不能覆盖提示权限不够的问题解决。
Php/Js/Shell/Go jackxiang 2013-4-2 09:50
一、
一电脑只能通过editplus到路径下输入hosts文件,但是看不到文件,通过文件夹选项:查看,去掉隐藏受保护的操作系统文件,能看到文件,但是通过在文件上点属性,后发现其后面的隐藏还是一个disabled的勾勾,也就是属性上还是有隐藏这一项,于是,想去掉都去不掉,最后在网上找了一工具:
http://iask.sina.com.cn/b/15491022.html
我找到了三个不同的修复工具,见附件。
附件:隐藏文件恢复.rar
DownLoad:
里面的,U盘MP3隐藏文件夹病毒修复工具.exe 运行后,就Ok了。
至于权限不够,无法覆盖该文件,可采用文件属性里的安全里添加相关权限即可。
二、
hosts文件拒绝访问解决办法:
1,对于第一种原因,自然是杀毒,这里就不详细解释了; 360卸载了就好了。(一直提示要administrator才能啥啥啥的...卸载后成功了。)
2,杀毒软件或其他安全软件为系统安全禁止了hosts文件的修改权限。
3,如果以上两个方法都行不通,可以尝试通过手工修改hosts文件写入权限的方法。
a,右键点击hosts文件,去掉只读属性,增加存档属性;
b,在xp下,点击开始->运行,请输入:attrib %SystemRoot%\system32\drivers\etc\hosts -h -r –s 点”确定”按钮。
一电脑只能通过editplus到路径下输入hosts文件,但是看不到文件,通过文件夹选项:查看,去掉隐藏受保护的操作系统文件,能看到文件,但是通过在文件上点属性,后发现其后面的隐藏还是一个disabled的勾勾,也就是属性上还是有隐藏这一项,于是,想去掉都去不掉,最后在网上找了一工具:
http://iask.sina.com.cn/b/15491022.html
我找到了三个不同的修复工具,见附件。
附件:隐藏文件恢复.rar
DownLoad:
下载文件
里面的,U盘MP3隐藏文件夹病毒修复工具.exe 运行后,就Ok了。
至于权限不够,无法覆盖该文件,可采用文件属性里的安全里添加相关权限即可。
二、
hosts文件拒绝访问解决办法:
1,对于第一种原因,自然是杀毒,这里就不详细解释了; 360卸载了就好了。(一直提示要administrator才能啥啥啥的...卸载后成功了。)
2,杀毒软件或其他安全软件为系统安全禁止了hosts文件的修改权限。
3,如果以上两个方法都行不通,可以尝试通过手工修改hosts文件写入权限的方法。
a,右键点击hosts文件,去掉只读属性,增加存档属性;
b,在xp下,点击开始->运行,请输入:attrib %SystemRoot%\system32\drivers\etc\hosts -h -r –s 点”确定”按钮。
1.登录mysql,进入mysql命令提示符:mysql>
2.查看是否mysql支持InnoDB
执行命令:show engines;
如果没有InnoDB字样,就说明不支持。
3.查看mysql,plugin目录
执行命令:show variables like 'plugin_dir';
查看执行后结果的目录里是否有:ha_innodb.so,没有的话最好重新编译mysql
4.增加InnoDB
执行命令:INSTALL PLUGIN InnoDB SONAME 'ha_innodb.so';
执行完成后,用上面几个命令查看是否安装完成。
不用重启mysql服务,即可使用
来自赵卫的Qzone空间:
http://user.qzone.qq.com/57718700?ptlang=2052#!app=2&via=QZ.HashRefresh&pos=1309765858
2.查看是否mysql支持InnoDB
执行命令:show engines;
如果没有InnoDB字样,就说明不支持。
3.查看mysql,plugin目录
执行命令:show variables like 'plugin_dir';
查看执行后结果的目录里是否有:ha_innodb.so,没有的话最好重新编译mysql
4.增加InnoDB
执行命令:INSTALL PLUGIN InnoDB SONAME 'ha_innodb.so';
执行完成后,用上面几个命令查看是否安装完成。
不用重启mysql服务,即可使用
来自赵卫的Qzone空间:
http://user.qzone.qq.com/57718700?ptlang=2052#!app=2&via=QZ.HashRefresh&pos=1309765858