Fiddler 2对Flex开发和联调很有用,因为Flash Player的某些HTTP请求调的不是浏览器的HTTP接口,而是自己实现的,这类请求用httpwatch/firebug下是观察不到的。这类请求 就是文件上传请求(Flash Player按照RFC1867规范自行发的请求)。
    背景:在我们的开发测试中,往往是一些表单的提交,还时常带着Cookie,Session的后台验证才能提交,而我们最关心的还是提交,而不是前面的验证,在实际中往往浏览器提交一次后,再回来做二次测试时,其HTML数据控件已经没有了,得再次输入数据,这给我们带来了很大的不方便,为此,我们常常用的FireBug这样的插件也不能满足我们的需求,在这样的背景下催生出一个叫Filddler2的工具,能带给我们惊喜,也就是解决了这个问题,可以让我们自己对后台做多次调试,其模拟了Http协议的Cookie,Session表单数据提交,带来了方便,步骤如下:

(1)启动Filddler程序后,找到一个需要再做一次的URL连接, Firefox调试确保Filddler2界面左下角是:
   Capturing | All Processes | 空[这儿是可以阻塞的地方] | 通过个数是空[会显示捕获个数]。
   确保是让其在做下面模拟的URL时让其阻塞,后我们再放开,就再次模拟人为进交一次,这里带Session,Cookie等,给我们带
   来了实实在在的方便。

(2)打开Firefox后,工具>选项>网络>设置>手动配置代理勾选上>Http代理:127.0.0.1>端口:8888

(3)看步骤1中有All Processes  空[这儿是可以阻塞的地方],点可以阻塞的地方让其出现黑色T的红色背景框即可。

(4)点击Fiddler面板上某个需要再次调试的URL,右键-》Replay -》Reissue Requests,如直接点它,会自动出现一个一样的连接。
  如果按住Shift按扭再点Reissue Requests,会出现输入框让你输入要模拟多少次,这儿可以用来做简单的并发测试滴,我们就模拟一次。

(5)然后,看第4步,就是放开我们的那个阻塞的按钮,也就是然后取掉断点状态。

(6)点击软件上的“Resume All”,释放被拦截的请求,此时30多条记录就会并发向后台请求。
        新版本V4里找不到Resume All按钮了,直接在第3步里的下面命令行里输入 : g or  go  Resume all breakpointed sessions  g 也成。
(7)此时,观察我们待测试的页面,会自动弹出窗口,提示语句,SQL等等。

  可能出现的问题,如8888端口被占用会配置了代理后,Firefox访问页面出现访问不了,如何排查如下:
    如果Windows中查看Fiddler的8888端口是否开启或者被其它程序占用的简单方法。

   还不明白,可以参考:http://jackxiang.com/post/735/  如何通过端口看是哪个程序占用的方法。
   我对自己的博客修改文章做了下实验是Ok的,如下:
   1)自己先用Firefox保存一下自己写的这篇博文,并把这个保存的URL给找出来,http://jackxiang.com/admin.php,删除Fiddler的其他
的URL。

   2)用其他浏览器修改一个博文的文字和1保存时的不一样。

   3)直接跳过到上面第4步,再Replay一次,也就是不用柱塞,直接再提交一次,后返回200

   4)看DB,发现我的博文又给修改回1步骤时的文字了,模拟成功,Yeah。

   最后,还是上一张图吧,除开Firefox设置代理外,都放一块,有兴趣可以摸索摸索:阅读全文
post_max_size最大不能超过2048M:
特别注意,32位Linux当设置php.ini中的:post_max_size => 2048M 时会出现问题,最大只能是:post_max_size => 2047M!可能64位的机器没有这个问题。
为了大文件上传,将post_max_size=2048m,后来的表单提交完全没反应,通过高人指点,查看 sylog得知超过了最大值2047!
现象:没有反映,出现警告如下:
PHP Warning: Unknown: POST Content-Length of 0 bytes exceeds the limit of -1149239296 bytes in Unknown on line 0
最后查了下咨料发现:
Note: PHP allows shortcuts for bit values, including K (kilo), M (mega) and G (giga). PHP will do the conversions automatically if you use any of these. Be careful not to exceed the 32 bit signed integer limit (if you’re using 32bit versions) as it will cause your script to fail.
将POST_MAX_SIZE设为2047M,解决问题.  
阅读全文
以前查看PHP的php.ini文件的位置如下命令:
方法一:

方法二:


我今天看了下PHP的帮助命令:
php --help
发现有一项存在:
--ini            Show configuration file names
于是以后看php.ini的位置是这样的,更简单,更适用:
C++下有这一个Yaml的解析包,PHP也有一个Yaml的解析包,这样两者就能进行对文件的解析是一个规则,达到统一的目的,双方就可以通讯,这样语言之间对配置的解析一样,上层通过Socket来通信统一,进而实现大系统的搭建和和谐,呵呵。

首先要有CMake环境,需要编译一个CMake出来,然后才是在下载下来的文件目录下运行这个Cmake:
tar -zxvf cmake-2.8.4.tar.gz
首先,需要下载安装Cmake;
wget http://www.cmake.org/files/v2.8/cmake-2.8.4.tar.gz
安装cmake;

其次,下载YAML的C++解析器 yaml-cpp ,URL为:http://www.oschina.net/p/yaml-cpp
编译:


root@116.255.139.240:/home/admin/c++/yaml_4_C/yaml-cpp# cmake  -DBUILD_SHARED_LIBS=ON
-- The C compiler identification is GNU
-- The CXX compiler identification is GNU
-- Check for working C compiler: /usr/bin/gcc
-- Check for working C compiler: /usr/bin/gcc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Performing Test FLAG_WEXTRA
-- Performing Test FLAG_WEXTRA - Success
-- Configuring done
-- Generating done
-- Build files have been written to: /home/admin/c++/yaml_4_C/yaml-cpp
root@116.255.139.240:/home/admin/c++/yaml_4_C/yaml-cpp# make
Scanning dependencies of target yaml-cpp
[  3%] Building CXX object CMakeFiles/yaml-cpp.dir/src/emitter.cpp.o
[  6%] Building CXX object CMakeFiles/yaml-cpp.dir/src/emitterstate.cpp.o
[  9%] Building CXX object CMakeFiles/yaml-cpp.dir/src/simplekey.cpp.o
[ 12%] Building CXX object CMakeFiles/yaml-cpp.dir/src/parser.cpp.o

......

[ 96%] Building CXX object test/CMakeFiles/run-tests.dir/spectests.cpp.o
Linking CXX executable run-tests
[ 96%] Built target run-tests
Scanning dependencies of target parse
[100%] Building CXX object util/CMakeFiles/parse.dir/parse.cpp.o
Linking CXX executable parse
[100%] Built target parse


然后呢: make ,后生成:
/home/admin/c++/yaml_4_C/yaml-cpp/test3
libyaml-cpp.so.0.2.6
libyaml-cpp.so.0.2 -> libyaml-cpp.so.0.2.6
libyaml-cpp.so -> libyaml-cpp.so.0.2


查看H文件位置:
root@116.255.139.240:/home/admin/c++/yaml_4_C/yaml-cpp# find . -name "yaml.h"
./include/yaml-cpp/yaml.h
最后,进行Yaml的代码解析测试:
1)建立目录:
mkdir test3
目录位置:root@116.255.139.240:/home/admin/c++/yaml_4_C/yaml-cpp/test3
2)写入C++测试代码
1.vi test.cpp
加入:

3).把yaml.h拷贝到test3的目录下来:

4)后进行编译编译:
g++ -o test test.cpp -I../include/ ../libyaml-cpp.so

5)运行测试
root@116.255.139.240:/home/admin/c++/yaml_4_C/yaml-cpp/test3# ./test
./test: error while loading shared libraries: libyaml-cpp.so.0.2: cannot open shared object file: No such file or directory
6)解决问题:
/home/admin/c++/yaml_4_C/yaml-cpp/test3
libyaml-cpp.so.0.2.6
libyaml-cpp.so.0.2 -> libyaml-cpp.so.0.2.6
libyaml-cpp.so -> libyaml-cpp.so.0.2
root@116.255.139.240:/home/admin/c++/yaml_4_C/yaml-cpp# cp libyaml-cpp.so  /usr/lib/
root@116.255.139.240:/usr/lib# ln -s libyaml-cpp.so libyaml-cpp.so.0.2
7)再次执行,得到解决:
再执行就不报错了,原来是没有把这个so给放到/usr/lib下,再就是没有给重新软链接一个,Ok了。
root@116.255.139.240:/home/admin/c++/yaml_4_C/yaml-cpp/test3# ./test
root@116.255.139.240:/home/admin/c++/yaml_4_C/yaml-cpp/test3#
8)自由发挥,放到实际的开发中去。

Yaml实际解析测试:

component.yaml这个Yaml文件的内容:

编译:

测试Yaml解析是否成功:

解析成功!!!



最后,当然还有纯C语言的,来解析 YAML 1.1 数据,其编译估计差不多,下载URl:
http://www.oschina.net/p/libyaml

建议用eclipse来开发C++,还有PHP,因为eclipse 有PHP的插件,也有C++的插件,我是用的Zend for eclipse,现在eclipse还有一个Yaml的编辑插件,相关介绍情况如下:
安装YEdit
  YEdit是一个在Eclipse上编辑YAML文件的插件。当我们我们使用Python进行App Engine的开发,会涉及编辑一些YAML文件,这个插件提供了较好的支持。
    这个还是通过Eclipse的更新管理器来完成安装,在对话框中的在Work with中输入http://dadacoalition.org/yedit,然后勾选该插件,然后不断下一步,稍等片刻,安装成功。
eclipse 下的PHP插件参考:http://chenling1018.blog.163.com/blog/static/1480254201012234015728/
在PHP的高级编程群里有位兄弟问这个问题,于是我就写一个如下:
在/tmp/a.txt后面每行追加jackxiang.com,PHP代码如下:


注意:
1. file_put_contents的第一次写和第N次写的参数不同。
2.注意file读取出来的数组中有换行符号的,需要通过str_replace去掉。
3.Linux下Win下不同的回车
最后,直接全部读取出来进行替换也可以的。
其实,这个去换行符号也是在网上找的,有两种:
第一种:
$content=str_replace("\n","",$content);
echo $content;


第二种:
$content=preg_replace("/\s/","",$content);
echo $content;

呵呵。
代码片段:


输出:
From main function:
10
jackxiang
From fun function:
4
jackxiang

此例说明:在函数中,数组参数退化为指针,所以函数fun中的sizeof(a)的内容永远输出为4。
平时我们爱使用Curl来实现Http协议的接口调试,包括Post,Get,Etc。
然而,近来发现Suse enterprise sp2的64位机上没有这个Curl的PHP扩展,
于是,想了想,我使用了PHP的方法来实现了对其它接口的访问,包括Cookie头的发送,简单Demo如下:
vi file_get_contents.php


接收简单Demo代码,test3.php:

测试结果:

root@172.25.38.**:/home/jackxiang/php# php file_get_contents.php                

得证。EOF
                                            
突然问道让你回答:PHP除开Post,Get外还有什么提交方式?
相册-耀京-腾讯(50314234)  16:35:28
cookie
博客-武建(569676660)  16:35:59
socket
RD-解超-赶集(75744317)  16:36:11
socket应该是正解吧。。。
博客-路人甲(285882507)  16:36:14
SESSION
-----
蒙了,下来才想起,经常调试Flash图片的上传流不就是一个非Get,非Post的方式嘛。
HTTP_RAW_POST_DATA PHP输入流


越来越发现缺少思考,或者说总结归纳不够罢。
====================================================================

来处网上 http://www.5iphp.com/zh-hans/content/483.html:
通过Flash POST 图片的二进制数据给php,由php生成图片保存。

开始想到用$_POST来接受。后来发现行不通。
查阅了很多资料 明白了所以然,这里做一个笔记:

于PHP默认只识别application/x-www.form-urlencoded标准的数据类型。
因此,对型如text/xml 或者 soap 或者 application/octet-stream 之类的内容无法解析,如果用$_POST数组来接收就会失败!
故保留原型,交给$GLOBALS['HTTP_RAW_POST_DATA'] 来接收。

另外还有一项 php://input 也可以实现此这个功能

php://input 允许读取 POST 的原始数据。和 $HTTP_RAW_POST_DATA 比起来,它给内存带来的压力较小,并且不需要任何特殊的 php.ini 设置。php://input和 $HTTP_RAW_POST_DATA 不能用于 enctype="multipart/form-data"。

我在Flash中使用JPGEncoder把BitMapData转成二进制,然后post给php

php页面代码如下:

http://www.jackxiang.com/post/4411/
务必参考:http://www.perfgeeks.com/?p=150

时间上面的文章如下,可能根据实际情况做下代码变通:
在使用xml-rpc的时候,server端获取client数据,主要是通过php输入流input,而不是$_POST数组。所以,这里主要探讨php输入流php://input

对一php://input介绍,PHP官方手册文档有一段话对它进行了很明确地概述。

“php://input allows you to read raw POST data. It is a less memory intensive alternative to $HTTP_RAW_POST_DATA and does not need any special php.ini directives. php://input is not available with enctype=”multipart/form-data”.
翻译过来,是这样:
“php://input可以读取没有处理过的POST数据。相较于$HTTP_RAW_POST_DATA而言,它给内存带来的压力较小,并且不需要特殊的php.ini设置。php://input不能用于enctype=multipart/form-data”
我们应该怎么去理解这段概述呢?!我把它划分为三部分,逐步去理解。

    读取POST数据
    不能用于multipart/form-data类型
    php://input VS $HTTP_RAW_POST_DATA

读取POST数据

PHPer们一定很熟悉$_POST这个内置变量。$_POST与php://input存在哪些关联与区别呢?另外,客户端向服务端交互数据,最常用的方法除了POST之外,还有GET。既然php://input作为PHP输入流,它能读取GET数据吗?这二个问题正是我们这节需要探讨的主要内容。
经验告诉我们,从测试与观察中总结,会是一个很凑效的方法。这里,我写了几个脚本来帮助我们测试。

@file 172.25.38.70:/phpinput_server.php 打印出接收到的数据
@file 172.25.38.70:/phpinput_post.php 模拟以POST方法提交表单数据
@file 172.25.38.70:/phpinput_xmlrpc.php 模拟以POST方法发出xmlrpc请求.
@file 172.25.38.70:/phpinput_get.php 模拟以GET方法提交表单表数

phpinput_server.php与phpinput_post.php






我们可以通过使用工具ngrep抓取http请求包(因为我们需要探知的是php://input,所以我们这里只抓取http Request数据包)。我们来执行测试脚本phpinput_post.php
结果:
HTTP/1.1 200 OK
Date: Fri, 22 Jul 2011 04:00:58 GMT
Server: Apache/2.0.59 (Unix) PHP/5.2.6
X-Powered-By: PHP/5.2.6
Vary: Accept-Encoding
Content-Length: 175
Connection: close
Content-Type: text/html; charset=utf-8

-------$_POST------------------
array(2) {
  ["name"]=>
  string(9) "jackxiang"
  ["idnum"]=>
  string(4) "7788"
}

-------php://input-------------
name=jackxiang&idnum=7788

仔细观察,我们不难发现
1,$_POST数据,php://input 数据与httpd entity body数据是“一致”的
2,http请求中的Content-Type是application/x-www-form-urlencoded ,它表示http请求body中的数据是使用http的post方法提交的表单数据,并且进行了urlencode()处理。


我们再来看看脚本phpinput_xmlrpc.php的原文件内容,它模拟了一个POST方法提交的xml-rpc请求。




结果如下:
HTTP/1.1 200 OK
Date: Fri, 22 Jul 2011 03:56:41 GMT
Server: Apache/2.0.59 (Unix) PHP/5.2.6
X-Powered-By: PHP/5.2.6
Vary: Accept-Encoding
Content-Length: 151
Connection: close
Content-Type: text/html; charset=utf-8


-------$_GET------------------
array(0) {
}

-------php://input-------------
<?xml version="1.0"> <methodcall> <name>jt_userinfo</name> </methodcall>


同样,我样也可以很容易地发现:
1,http请求中的Content-Type是text/xml。它表示http请求中的body数据是xml数据格式。
2,服务端$_POST打印出来的是一个空数组,即与http entity body不一致了。这跟上个例子不一样了,这里的Content-Type是text/xml,而不是application/x-www-form-urlencoded
3,而php://input数据还是跟http entity body数据一致。也就是php://input数据和$_POST数据不一致了。

我们再来看看通过GET方法提交表单数据的情况,php://input能不能读取到GET方法的表单数据?在这里,我们稍加改动一下phpinput_server.php文件,将$_POST改成$_GET。







同样,我们执行下一phpinput_get.php测试脚本,它模拟了一个通常情况下的GET方法提交表单数据。
HTTP/1.1 200 OK
Date: Fri, 22 Jul 2011 03:59:38 GMT
Server: Apache/2.0.59 (Unix) PHP/5.2.6
X-Powered-By: PHP/5.2.6
Vary: Accept-Encoding
Content-Length: 149
Connection: close
Content-Type: text/html; charset=utf-8


-------$_GET------------------
array(2) {
  ["name"]=>
  string(9) "jackxiang"
  ["idnum"]=>
  string(4) "7788"
}

-------php://input-------------

比较POST方法提交的http请求,通常GET方法提交的请求中,entity body为空。同时,不会指定Content-Type和Content-Length。但是,如果强硬数据http entity body,并指明正确地Content-Type和Content-Length,那么php://input还可是读取得到http entity body数据,但不是$_GET数据。

所根据,上面几个探测,我们可以作出以下总结:
1,Content-Type取值为application/x-www-form-urlencoded时,php会将http请求body相应数据会填入到数组$_POST,填入到$_POST数组中的数据是进行urldecode()解析的结果。(其实,除了该Content-Type,还有multipart/form-data表示数据是表单数据,稍后我们介绍)
2,php://input数据,只要Content-Type不为multipart/form-data(该条件限制稍后会介绍)。那么php://input数据与http entity body部分数据是一致的。该部分相一致的数据的长度由Content-Length指定。
3,仅当Content-Type为application/x-www-form-urlencoded且提交方法是POST方法时,$_POST数据与php://input数据才是”一致”(打上引号,表示它们格式不一致,内容一致)的。其它情况,它们都不一致。
4,php://input读取不到$_GET数据。是因为$_GET数据作为query_path写在http请求头部(header)的PATH字段,而不是写在http请求的body部分。

这也帮助我们理解了,为什么xml_rpc服务端读取数据都是通过file_get_contents(‘php://input’, ‘r’)。而不是从$_POST中读取,正是因为xml_rpc数据规格是xml,它的Content-Type是text/xml。

php://input碰到了multipart/form-data

上传文件的时候,表单的写法是这样的

那么,enctype=multipart/form-data这里的意义,就是将该次http请求头部(head)中的Content-Type设置为multipart/form-data。请查阅RFC1867对它的描述。multipart/form-data也表示以POST方法提交表单数据,它还伴随了文件上传,所以会跟application/x-www-form-urlencoded数据格式不一样。它会以一更种更合理的,更高效的数据格式传递给服务端。我们提交该表单数据,并且打印出响应结果,如下:

-------$_POST------------------
array(1) {
  ["n"]=>
  string(9) "jackxiang"
}

-------php://input-------------


同时,我们通过ngrep抓取的相应的http请求数据包如下:
multipart/form-data; boundary=---------------------------7db9cf5042a
-----------------------------7db9cf5042a
Content-Disposition: form-data; name="n"

jackxiang
-----------------------------7db9cf5042a
Content-Disposition: form-data; name="f"; filename="yxp.jpg"
Content-Type: image/bmp

BM�





从响应输出来比对,$_POST数据跟请求提交数据相符,即$_POST = array(‘n’ => ‘perfgeeks’)。这也跟http请求body中的数据相呼应,同时说明PHP把相应的数据填入$_POST全局变量。而php://input输出为空,没有输出任何东西,尽管http请求数据包中body不为空。这表示,当Content-Type为multipart/form-data的时候,即便http请求body中存在数据,php://input也为空,PHP此时,不会把数据填入php://input流。所以,可以确定: php://input不能用于读取enctype=multipart/form-data数据。

我们再比较这次通过ngrep抓取的http请求数据包,我们会发现,最大不同的一点是Content-Type后面跟了boundary定义了数据的分界符,bounday是随机生成的。另外一个大不一样的,就是http entity body中的数据组织结构不一样了。

上一节,我们概述了,当Content-Type为application/x-www-form-urlencoded时,php://input和$_POST数据是“一致”的,为其它Content-Type的时候,php://input和$_POST数据数据是不一致的。因为只有在Content-Type为application/x-www-form-urlencoded或者为multipart/form-data的时候,PHP才会将http请求数据包中的body相应部分数据填入$_POST全局变量中,其它情况PHP都忽略。而php://input除了在数据类型为multipart/form-data之外为空外,其它情况都可能不为空。通过这一节,我们更加明白了php://input与$_POST的区别与联系。所以,再次确认,php://input无法读取enctype=multipart/form-data数据,当php://input遇到它时,永远为空,即便http entity body有数据。
php://input VS $http_raw_post_data

相信大家对php://input已经有一定深度地了解了。那么$http_raw_post_data是什么呢?$http_raw_post_data是PHP内置的一个全局变量。它用于,PHP在无法识别的Content-Type的情况下,将POST过来的数据原样地填入变量$http_raw_post_data。它同样无法读取Content-Type为multipart/form-data的POST数据。需要设置php.ini中的always_populate_raw_post_data值为On,PHP才会总把POST数据填入变量$http_raw_post_data。

把脚本phpinput_server.php改变一下,可以验证上述内容
@php phpinput_post.php
@php phpinput_get.php
@php phpinput_xmlrpc.php
如下:

HTTP/1.1 200 OK
Date: Fri, 22 Jul 2011 04:07:52 GMT
Server: Apache/2.0.59 (Unix) PHP/5.2.6
X-Powered-By: PHP/5.2.6
Vary: Accept-Encoding
Content-Length: 6
Connection: close
Content-Type: text/html; charset=utf-8

0



HTTP/1.1 200 OK
Date: Fri, 22 Jul 2011 04:07:59 GMT
Server: Apache/2.0.59 (Unix) PHP/5.2.6
X-Powered-By: PHP/5.2.6
Vary: Accept-Encoding
Content-Length: 6
Connection: close
Content-Type: text/html; charset=utf-8

1



HTTP/1.1 200 OK
Date: Fri, 22 Jul 2011 04:08:26 GMT
Server: Apache/2.0.59 (Unix) PHP/5.2.6
X-Powered-By: PHP/5.2.6
Vary: Accept-Encoding
Content-Length: 6
Connection: close
Content-Type: text/html; charset=utf-8

1


得出的结果输出都是一样的,即都为1,表示php://input和$HTTP_RAW_POST_DATA是相同的。至于对内存的压力,我们这里就不做细致地测试了。有兴趣的,可以通过xhprof进行测试和观察。

以此,我们这节可以总结如下:
1, php://input 可以读取http entity body中指定长度的值,由Content-Length指定长度,不管是POST方式或者GET方法提交过来的数据。但是,一般GET方法提交数据时,http request entity body部分都为空。
2,php://input 与$HTTP_RAW_POST_DATA读取的数据是一样的,都只读取Content-Type不为multipart/form-data的数据。
学习笔记

1,Coentent-Type仅在取值为application/x-www-data-urlencoded和multipart/form-data两种情况下,PHP才会将http请求数据包中相应的数据填入全局变量$_POST
2,PHP不能识别的Content-Type类型的时候,会将http请求包中相应的数据填入变量$HTTP_RAW_POST_DATA
3,  只有Coentent-Type不为multipart/form-data的时候,PHP不会将http请求数据包中的相应数据填入php://input,否则其它情况都会。填入的长度,由Coentent-Length指定。
4,只有Content-Type为application/x-www-data-urlencoded时,php://input数据才跟$_POST数据相一致。
5,php://input数据总是跟$HTTP_RAW_POST_DATA相同,但是php://input比$HTTP_RAW_POST_DATA更凑效,且不需要特殊设置php.ini
6,PHP会将PATH字段的query_path部分,填入全局变量$_GET。通常情况下,GET方法提交的http请求,body为空。
Tags:
现在你想看函数里的变量和值,你只需要在js里某个地输入:debugger; 即可,否则,你要想看变量是不可能的,或者加断点也成。

断点继续运行:F8
单步进入嵌套调用的函数体实现内部:F11
单步跳过:F10
单步退出:Shift+F11

从知道函数入口的函数中嵌套的函数在另外一个文件,可以通过单步进入查看进入后,就能知道另外一个文件的Js文件的名称,知道文件名后是快速解决Js问题的基础,如下图:
点击在新窗口中浏览此图片
阅读全文
其实协议是一个规化,代码是一个实现,久而久之,规划成为了规则,如:RFC协议就是一个大家在开发浏览器必须遵守的协议(http的(RFC 1867):让HTML表单可以提交文件。它对HTML表单的扩展),而也具有开放性,为此,各种程序都可以实现这个协议,程序为协议而生,协议为功能而用,下面我们来实现一个通过PHP的Socket来模拟一次浏览器上传一张图片的提交代码,如下:

模拟浏览器遵循的Http协议发送图片程序,boundary开始时有一个 --,结束时:也有有 --,真正结束后有\r\n\r\n:



PHP接收发送过来的图片程序:


测试返回:

为何出现这样的情况呢?查找代码片段imageaaa,这个修改为file即可,修改后如下所示,上传成功:

说明是Ok的,查下upload目录下,果然是在这个图片的,证明PHP是完全可以通过fsocket来模拟Http上传图片协议来实现浏览器上传的。
阅读全文
写CDB类库的时候,就有一个查询是要求写出一个,具有可变参数个数的函数,类似于sprintf,fsql定义了数据格式,v1, v2等变量定义了要替换的值,然后将替换后的字符串作为数据库查询进行执行.
先举一个实现后的例子:
queryf("select * from glove_user where name = '%s' and site = '%s'", 'glove', 'glovely.info');
这其实就是一个select语句,其中不同的地方就是第一个参数中的name的值%s用后面的’glove’来替换,site的值%s用后面的’glovely.info’来替换,这些可以替换的参数是不限定个数的.
也就是说这个函数像我们用的sprintf一样,是带有不定个数的参数的.阅读全文
我用的bo-blog,刚才,发现博客的服务器的负载很高,就一博客,不致与:

Top一看:

Mysql:

如下:


一看索引没有,赶紧加上索引:


SELECT `blogid`,`pubtime`,`edittime`,`blogalias` FROM `boblog_blogs` WHERE `property`<2  ORDER BY
alter table `boblog_blogs` add index property(property);

SELECT `blogid`,`title`,`blogalias` FROM `boblog_blogs` WHERE `property`<'2' AND `pubtime`<'13040783';
alter table `boblog_blogs` add index property_pubtime(property,pubtime);

SELECT * FROM `boblog_blogs` WHERE `property`<2 AND `frontpage`=0 ORDER BY `sticky`DESC, `pubtime`;
alter table `boblog_blogs` add index property_frontpage(property,frontpage);

博客次数和上面是一个表,索引加多了,update效率会不会下降?如下:
UPDATE LOW_PRIORITY `boblog_blogs` SET `views`=`views`+1 WHERE `blogid`='4257'
看来一个博客的访问设计仍旧需要考究和研究,我的博文也就3000多,DB性能就显现出来了。
后记:
查看后依旧有这样那样的小问题,但sleep和锁表大为缓解。


后来,负载降低,由25降低到5,说明还是有点效果滴嘛:




+----+-------------+--------------+-------+----------------------------------------------+----------+---------+------+------+-----------------------------+
| id | select_type | table        | type  | possible_keys                                | key      | key_len | ref  | rows | Extra                       |
+----+-------------+--------------+-------+----------------------------------------------+----------+---------+------+------+-----------------------------+
|  1 | SIMPLE      | boblog_blogs | range | property,property_pubtime,property_frontpage | property | 4       | NULL | 3526 | Using where; Using filesort |
+----+-------------+--------------+-------+----------------------------------------------+----------+---------+------+------+-----------------------------+
Mysql版本号:
mysql> select version();
+------------+
| version()  |
+------------+
| 5.0.26-log |
+------------+
配置:
vi /etc/my.cnf
有一行:
local-infile=1
但是导入DB的时候就是不行:

最后解决方法:

导入OK!
反过来证明其配置可能有问题。
具体原因待查,估计得从show variables入手思路:

不加参数:


一样的,奇怪了!!!
Mysql手册摘抄:
你可以用--local-infile=0选项启动mysqld从服务器端禁用所有LOAD DATA LOCAL命令。
对于mysql命令行客户端,可以通过指定--local-infile[=1]选项启用LOAD DATA LOCAL,或通过--local-infile=0选项禁用。类似地,对于mysqlimport,--local or -L选项启用本地数据文件装载。在任何情况下,成功进行本地装载需要服务器启用相关选项。
如果你使用LOAD DATA LOCAL Perl脚本或其它读选项文件中的[client]组的程序,你可以在组内添加local-infile=1选项。但是,为了便面不理解local-infile的程序产生问题,则规定使用loose- prefix:
·[client]
·loose-local-infile=1
·如果LOAD DATA LOCAL INFILE在服务器或客户端被禁用,试图执行该语句的客户端将收到下面的错误消息:
ERROR 1148: The used command is not  allowed with this MySQL version

参考来源:
http://wenku.baidu.com/view/4b93ac10f18583d0496459a0.html
(1)chmod: cannot access `ext/phar/phar.phar': No such file or directory:
wget http://pear.php.net/go-pear.phar
[root@localhost phar]# /usr/local/webserver/php/bin/php go-pear.phar
Below is a suggested file layout for your new PEAR installation.  To
change individual locations, type the number in front of the
directory.  Type 'all' to change all of them or simply press Enter to
accept these locations.

1. Installation base ($prefix)                   : /usr/local/webserver/php
2. Temporary directory for processing            : /tmp/pear/install
3. Temporary directory for downloads             : /tmp/pear/install
4. Binaries directory                            : /usr/local/webserver/php/bin
5. PHP code directory ($php_dir)                 : /usr/local/webserver/php/lib/php
6. Documentation directory                       : /usr/local/webserver/php/docs
7. Data directory                                : /usr/local/webserver/php/data
8. User-modifiable configuration files directory : /usr/local/webserver/php/cfg
9. Public Web Files directory                    : /usr/local/webserver/php/www
10. Tests directory                               : /usr/local/webserver/php/tests
11. Name of configuration file                    : /usr/local/webserver/php/etc/pear.conf

1-11, 'all' or Enter to continue: all
这个根据个人环境进行修改。(我是直接回车即可)
(2)chmod: cannot access `ext/phar/phar.phar': No such file or directory:
make: [ext/phar/phar.phar] Error 1 (ignored)
解决方法:./configure的时候 要加上--without-pear
背景:用sed进行删除一行时用@或#均不行,最后还得用斜杠,
sed -i '@^worker_cpu_affinity.*@d'  nginx.conf
sed: -e expression #1, char 1: unknown command: `@'
用@符号,即使没有提示啥错误,但实践发现其并没有被替换:
sed -s  "s@jenkins@@" /etc/hosts    


用斜杠就对了,以行打头进行匹配:


比如删除Nginx里的nginx.conf里的    include vhosts/mini.conf,注意:如果有多个可能会删除多行;

阅读全文
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Js的onload和js表单提交submit的demo示例</title>
<script language="javascript">
window.onload=function()
{
  document.forms.registerform.submit();

}
</script>
</head>

<body>
<form  id="registerform" name="register"  method="post" action="www.baidu.com">
  <label for="name"></label>
  <input name="name" type="text" id="name" value="name" />
</form>
</body>
</html>
不用加正则参数也成,直接用egrep:

rpm -qf /bin/egrep
grep-2.20-3.el6_7.1.x86_64
rpm -ql grep-2.20-3.el6_7.1.x86_64|grep grep
/bin/egrep
/bin/fgrep
/bin/grep


cat videoupload.php |grep upload --color //给加点颜色。

背景:实现一次性查找多个函数的awk实现,以及grep一个文件里的所有IP行:
-n :grep 行输出,--line-number         print line number with output lines
一)Grep -E参数,加上正则表达式实现,多个函数查找,如下:
grep -Erin 'atoi|itoa|atol|ltoa|intval'  ./

配上shell 文件 findfunPath.sh如下:
#!/bin/bash
findPath=$1
#judge folder is exist
if [ ! -d "$findPath" ]; then
    echo "Sorry,Input path is not exist.";
    echo "You can try follow command to check it: ls ${findPath}";
    exit 0
fi
grep -Erin 'atoi|itoa|atol|ltoa|intval'  ${findPath}|awk -F":" '{print "\nFileLineNumber=" $2 "     ExistFileName=" $1 "\nDetailInfo
=" $0}'

简单示例:
findfunPath.sh /usr/local/pro/




二)查看所查找单词的前三行后两行的环绕搜索:


[root@iZ25dcp92ckZ multepoolserver]# grep  -rin -B 3 -A 2 "pthread_create Failed" ./multepoolser.c
569-        threadNum[i]=i;//给数组赋值,传入线程编号值,后传入线程里。
570-        //if(pthread_create(&handleEpollRd[i],NULL,pthread_handle_message, (void *)&i)){
571-        if(pthread_create(&handleEpollRd[i],NULL,pthread_handle_message, (void *)&threadNum[i])){
572:                sprintf(errOut,"pthread_create Failed : %s - %m\n",strerror(errno));
573-                loger(errOut);
574-                return -1;
--
591-        writeThreadNum[i]=i;//给数组赋值,传入线程编号值,后传入线程里。
592-        //if(pthread_create(&saveUpFilePart2Diskk[i],NULL,sync_additional_writing_worker, NULL )){
593-        if(pthread_create(&saveUpFilePart2Diskk[i],NULL,sync_additional_writing_worker, (void *)&writeThreadNum[i])){
594:                sprintf(errOut,"pthread_create Failed : %s - %m\n",strerror(errno));
595-                loger(errOut);
596-                return -1;

三)grep一个多行单独IP间隔包含文字里的IP列表出来:



四)grep查找时显示找到那行的后面N行-A,和前面N行参数-B的实际应用之查找域名里的root有哪些路径:
grep -Er "common.jackxiang.com|vote.jackxiang.com|answer.jackxiang.com|scratch.jackxiang.com|api.itv.jackxiang.com|common.itv.jackxiang.com|api.itv.cctv.com|common.itv.cctv.com" ./  -A 7|grep root
./answer.jackxiang.com.conf-        root /data/www/api.jackxiang.com/;
./api.itv.jackxiang.com.conf:        root /data/www/api.itv.jackxiang.com/;
./vote.jackxiang.com.conf-        root /data/www/api.jackxiang.com/;
./scratch.jackxiang.com.conf-        root /data/www/api.jackxiang.com/;
./common.jackxiang.com.conf-        root /data/www/api.jackxiang.com/;
    在PHP出现至今,一直在不断的更新版本,增加新的功能,供我们大家使用,满足我们的需求。PHP 5.2以及更高的版本,PHP filter被绑定于系统,它可以对数据进行自动的过滤和判断。
第一种、PHP filter判断一个变量的内容是否符合要求
使用函数filter_var,第一个参数是要判断的变量。第二个参数是判断的要求,FILTER_VALIDATE_EMAIL表示判断是否符合email格式。如果变量是类似’boy@163.com’的数据,系统就会完整的输出‘boy@163.com’。如果是错误的格式,比如’boy’,就会输出false。如果没有填写表单中的email字段,系统输出空字符串。
$email = ‘boy@163.com’;  
echo filter_var($email,
FILTER_VALIDATE_EMAIL);  

第二种、PHP filter根据要求过滤一个变量的内容
和上面唯一的不同是第二个参数使用FILTER_SANITIZE_EMAIL,输出的结果会不同。如果变量是类似’boy@163.com’的数据,系统就会完整的输出’boy@163.com’。如果是错误的格式,比如’boy-afds3′,只要是数字和字母和划线等email格式中可以出现的内容,系统同样会完整的输出’boy-afds3′。如果变量没有设置内容,系统输出空字符串。如果是’boy阿三’,系统会把email格式中不允许的东西去除,输出’boy’。
$email = ‘boy@163.com’;  
echo filter_var($email,
FILTER_SANITIZE_EMAIL);  

第三种、PHP filter判断输入的变量的内容是否符合要求
使用函数filter_input。第一个参数表示从那里获得的数据,INPUT_POST表示通过POST方法传递过来,还可以使用INPUT_GET, INPUT_COOKIE, INPUT_SERVER, INPUT_ENV,代表相应的途径。第二个参数就是数据的名称。第三个参数代表过滤的要求,FILTER_VALIDATE_EMAIL表示判断数据是否符合email格式。
假设通过表单的POST过来的一个字段email。如果是类似’boy@163.com’的数据,系统就会完整的输出’boy@163.com’。如果是错误的格式,比如’boy’,就会输出false。如果没有填写表单中的email字段,系统输出null,也就是空。
echo filter_input(INPUT_POST,
‘email’, FILTER_VALIDATE_EMAIL);

第四种、PHP filter根据要求过滤输入的变量的内容
和上面唯一的不同是第二个参数使用FILTER_SANITIZE_EMAIL,输出的结果会不同。假设通过表单的POST过来的一个字段email。
如果是类似’boy@163.com’的数据,系统就会完整的输出’boy@163.com’。如果是错误的格式,比如’boy-afds3′,只要是数字和字母和划线等email格式中可以出现的内容,系统同样会完整的输出’boy-afds3′。如果没有填写表单中的email字段,系统输出null,也就是空。如果是’boy阿三’源码天空,系统会把email格式中不允许的东西去除,输出’boy’。
echo filter_input
(INPUT_POST, ‘email’,
FILTER_SANITIZE_EMAIL);  
以上就是PHP filter的具体功能介绍,希望对又需要的朋友有所帮助。

来自:http://www.codesky.net/article/200912/140526.html
阅读全文
方法零,直接截取:

方法一,替换:


方法二,正则匹配:


php reg.php
Array
(
    [0] => Array
        (
            [0] => 372647693
        )

    [1] => Array
        (
            [0] => 3726476
        )

)
取array的下标1即是$out3[1][0]后,加上**,即可!

方法2:
<?php
$st['FQQ']='372647693';
$parttern="/^(\d)(\d+)(\d{2})$/";
$replace="\$1$2**";
$qq=preg_replace($parttern,$replace,$st['FQQ']);
echo $qq;
?>


php reg.php
3726476**

方法3:

<?php
$qq="372647693";
$result = preg_replace('/^(.+).{2}$/', '\1**', $qq);
echo $result;
?>


php reg.php  
3726476**

shell的awk方法实现:

cat  xyz_zizuan.txt  |awk '{print substr($1,1,length($1)-2) "**"}' > xyz_zizuan2.txt
[~/shell]# xxd -g 1 concat.sh

-g 1,2:1和2的区别就是:1 2分别是:66  6669  明白了吧,呵呵!
主要用途:可以用来查看PHP在windows下的utf8记事本编码的bom,会导致session,cookie,输出图片出现异常的bom,大名鼎鼎啊,ef bb bf 就是utf-8 bom,如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。
如,注意efbb这个就是bom啦:

[~/shell]# hexdump bom.txt -C        

00000000  ef bb bf 64 66 64 66 64  0a                       |...dfdfd.|

---------------------------------------------------------------------------------------------------------------------------------------------

[~/shell]# xxd -g 2 bom.txt        

0000000: efbb bf64 6664 6664 0a                   ...dfdfd.
---------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------------

vi在linux下查看16进制文件的方法。
xxd
Creates a hex dump of the given file; it can also do the
reverse, so it can be used for binary patching
用法很简单:
在vi的命令状态下
:%!xxd               ——将当前文本转换为16进制格式。
:%!xxd -r            ——将当前文件转换回文本格式。
于是乎:
将当前文本转换为16进制格式,Vi命令行模式,输入:
:%!xxd

将当前文件转换回文本格式,Vi命令行模式,输入:
:%!xxd -r

哈哈,就在这一转16进制后又转回来的时候,你就发现bom,露出了原型,0000000: efbb bfef bbbf 6466 6466 640a            ......dfdfd.到转回来后出现<feff>dfdfd,哈哈哈哈,原形毕露了吧!
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||


[~/shell]# xxd -g 1 test.sh  
0000000: 66 69 6c 65 6e 61 6d 65 3d 24 31 0a 73 74 72 69  filename=$1.stri
0000010: 6e 67 31 3d 65 78 69 73 74 0a 73 74 72 69 6e 67  ng1=exist.string
0000020: 32 3d 78 69 0a 63 6f 6d 6d 61 6e 64 3d 22 63 61  2=xi.command="ca
0000030: 74 20 24 66 69 6c 65 6e 61 6d 65 20 7c 20 67 72  t $filename | gr
0000040: 65 70 20 24 73 74 72 69 6e 67 31 20 7c 20 67 72  ep $string1 | gr
0000050: 65 70 20 24 73 74 72 69 6e 67 32 22 0a 65 76 61  ep $string2".eva
0000060: 6c 20 24 63 6f 6d 6d 61 6e 64 0a                 l $command.

---------------------------------------------------------------------------------------------------------------------------------------------
[~/shell]# xxd -g 2 test.sh  

0000000: 6669 6c65 6e61 6d65 3d24 310a 7374 7269  filename=$1.stri
0000010: 6e67 313d 6578 6973 740a 7374 7269 6e67  ng1=exist.string
0000020: 323d 7869 0a63 6f6d 6d61 6e64 3d22 6361  2=xi.command="ca
0000030: 7420 2466 696c 656e 616d 6520 7c20 6772  t $filename | gr
0000040: 6570 2024 7374 7269 6e67 3120 7c20 6772  ep $string1 | gr
0000050: 6570 2024 7374 7269 6e67 3222 0a65 7661  ep $string2".eva
0000060: 6c20 2463 6f6d 6d61 6e64 0a              l $command.

---------------------------------------------------------------------------------------------------------------------------------------------
当然你也可以这样:
[~/shell]# hexdump test.sh -C            

00000000  66 69 6c 65 6e 61 6d 65  3d 24 31 0a 73 74 72 69  |filename=$1.stri|
00000010  6e 67 31 3d 65 78 69 73  74 0a 73 74 72 69 6e 67  |ng1=exist.string|
00000020  32 3d 78 69 0a 63 6f 6d  6d 61 6e 64 3d 22 63 61  |2=xi.command="ca|
00000030  74 20 24 66 69 6c 65 6e  61 6d 65 20 7c 20 67 72  |t $filename | gr|
00000040  65 70 20 24 73 74 72 69  6e 67 31 20 7c 20 67 72  |ep $string1 | gr|
00000050  65 70 20 24 73 74 72 69  6e 67 32 22 0a 65 76 61  |ep $string2".eva|
00000060  6c 20 24 63 6f 6d 6d 61  6e 64 0a                 |l $command.|
0000006b
今天,在写shell的时候,需要读取一个sh文件的内容,然后给予拼接字符串后执行这个字符串,出现换行的情况,于是,经过苦心查找,原来是读取vi编辑文件的后面有换行符,通过php的trim对其做了处理,OK,以前一直没有注意,原来Linux的vi一直都在干这个事情,哈哈哈,特别写下这个记录!
----------------------------------------------------------------------------------------------------------------------------------------------------
Linux下vi一个jackxiang.txt,然后,sz下来,用编辑器:FlexHEX.ext打开Jackxiang.txt,换行符的查看:
16进制:6A 61 63 6B 78 69 61 6E 67 0A
原文:jackxiang

换行符(\n) 相当于ASCII 换行字符(十六进制0A),
因此,在文本模式下打开的文件作为新行字符读入CR/LF 对,并且作为CR/LF 写入新行字符。
原来是vi编辑器自己在行尾加了个\n换行符。用od命令可看的很清楚:od -A  d -t c jackxiang.txt

Onecent:/usr/local/tads/htdocs/*****_2010/bin # od -A  d -t c jackxiang.txt
0000000   j   a   c   k   x   i   a   n   g  \n
0000010

PHP用trim去掉换行符,即可!  "\n" (ASCII 10 (0x0A)), a new line (line feed).
阅读全文
分页: 17/18 第一页 上页 7 8 9 10 11 12 13 14 15 16 17 18 下页 最后页 [ 显示模式: 摘要 | 列表 ]