fopen / fsockopen

fopen 与 fsockopen 均可以打开一个URL地址,那么究竟有什么区别呢?

第一、用法

Example. Not

   $viart_xml = fopen("http://www.viart.com/viart_shop.xml", "r");

But

   $viart_xml = fsockopen("www.viart.com", 80, $errno, $errstr, 12);

   fputs($viart_xml, "GET /viart_shop.xml HTTP/1.0\r\n");
   fputs($viart_xml, "Host: www.viart.com\r\n");
   fputs($viart_xml, "Referer: http://www.viart.com\r\n");
   fputs($viart_xml, "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)\r\n\r\n");
从上面的代码可以看到,fopen的参数是 URL 地址,而fsockopen的参数是一个域名。

第二、实现
fopen
1. 更高级,对一些调用细节有一定的封装。
2. 可使用场合:http/ ftp / 本地文件
fsockopen
1. 更底层,基于端口来连接。
2. 可以实现与网络连接相关的所有功能,但是如果要打开一个普通的URL地址,fsockopen还需要指定端口,而fopen却可以根据http协议用默认的80端口,因此在这种情况下,fopen更方便。
3. 对于本地文件,fsockopen好像也是无能为力。

26
Sep 2013
AUTHOR WiFeng
CATEGORY Web
COMMENTS No Comments

js之对象的属性

js 中是可以通过 new function 来达到创建对象的实现,好处自不用多说。来段代码演示一下:
<script>
function student(name, age, sex) {
	var name = name;
	this.age = age;
	sex = sex;
}

var jack = new student("jack", 14, "男");
alert(jack.name); // undefined
alert(jack.age);  // 14
alert(jack.sex);  // undefined
</script>

可以看到在 student 函数内部使用 this 引用赋值的变量是可以使用其对象调用的(如:age),反之却不能被其对象所调用。

为什么会说这个区别呢?这是因为大多数面向对象语言中,在此种这种情况下 this 是可以省去的。如果你已经习惯了 java 或者是 php,那么你写这种 js 时就要多留心了,小心被自己的惯性思维所欺骗。

11
Aug 2013
AUTHOR WiFeng
CATEGORY Web
COMMENTS No Comments

php中json_encode处理

php 中函数很多,用起来都比较顺手。正是这样,久而久之,就会形成一种只看参数名称,不仔细阅读函数用法的坏习惯。比如,其中的 json_encode , 现在大多数网站是采用 UTF8 编码,这种情况下使用 json_encode 是没有任何问题的,但当网站编码是其他时,这就不好了,如下:

<?php

// 字符串
$str = '我是中国人';
$json_str = json_encode($str);
var_dump($json_str, json_decode($json_str));

// 对象
class stu {
	var $age = 10;
	var $name = '老外';
}
$s1 = new stu();
$json_s1 = json_encode($s1);
var_dump($json_s1, json_decode($json_s1));
?>
如果上面文件保存为 UTF8 编码时,结果完全正确,如果保存为其他编码时,结果不是你期望的。

其实这个情况,在手册中是有说明的,如下:
待编码的 value ,除了resource 类型之外,可以为任何数据类型
该函数只能接受 UTF-8 编码的数据(译注:指字符/字符串类型的数据)

那么,如果我们的编码不是 UTF8 时就完全不能使用这个功能吗?可以,需要稍加处理,如下:

define('DEFAULT_CHARSET', 'gbk');

function json_safe_encode($var)
{
    return json_encode(json_fix_cyr($var));
}

function json_fix_cyr($var)
{
    if (is_array($var)) {
        $new = array();
        foreach ($var as $k => $v) {
            $new[json_fix_cyr($k)] = json_fix_cyr($v);
        }
        $var = $new;
    } elseif (is_object($var)) {
        $vars = get_class_vars(get_class($var));
        foreach ($vars as $m => $v) {
            $var->$m = json_fix_cyr($v);
        }
    } elseif (is_string($var)) {
        $var = iconv(DEFAULT_CHARSET, 'utf-8', $var);
    }
    return $var;
} 
上面的例子是假设是 gbk 编码的情况,如果是其他编码情况,聪明的你一定知道该怎么搞了吧~~


11
Aug 2013
AUTHOR WiFeng
CATEGORY Web
COMMENTS No Comments

js之this的用法

this是Javascript语言的一个关键字。
它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用。比如,

function test(){
this.x = 1;
}

随着函数使用场合的不同,this的值会发生变化。但是有一个总的原则,那就是this指的是,调用函数的那个对象。

下面分四种情况,详细讨论this的用法。

情况一 纯粹的函数调用

这是函数的最通常用法,属于全局性调用,因此this就代表全局对象Global。
请看下面这段代码,它的运行结果是1。

function test(){
this.x = 1;
alert(this.x);
}
test(); // 1

为了证明this就是全局对象,我对代码做一些改变:

var x = 1;
function test(){
alert(this.x);
}
test(); // 1

运行结果还是1。再变一下:

var x = 1;
function test(){
this.x = 0;
}
test();
alert(x); //0

情况二 作为对象方法的调用

函数还可以作为某个对象的方法调用,这时this就指这个上级对象。

function test(){
alert(this.x);
}
var o = {};
o.x = 1;
o.m = test;
o.m(); // 1

情况三 作为构造函数调用

所谓构造函数,就是通过这个函数生成一个新对象(object)。这时,this就指这个新对象。

function test(){
this.x = 1;
}
var o = new test();
alert(o.x); // 1

运行结果为1。为了表明这时this不是全局对象,我对代码做一些改变:

var x = 2;
function test(){
this.x = 1;
}
var o = new test();
alert(x); //2

运行结果为2,表明全局变量x的值根本没变。

情况四 apply调用

apply()是函数对象的一个方法,它的作用是改变函数的调用对象,它的第一个参数就表示改变后的调用这个函数的对象。因此,this指的就是这第一个参数。

var x = 0;
function test(){
alert(this.x);
}
var o={};
o.x = 1;
o.m = test;
o.m.apply(); //0

apply()的参数为空时,默认调用全局对象。因此,这时的运行结果为0,证明this指的是全局对象。
如果把最后一行代码修改为

o.m.apply(o); //1

运行结果就变成了1,证明了这时this代表的是对象o。


1
May 2013
AUTHOR WiFeng
CATEGORY Web
COMMENTS No Comments

urlencode与rawurlencode

urlencode 除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,但是空格则编码为加号(+)。
rawurlencode  除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数。

在使用中还有些细微的区别,下面看一段代码:

<?php
$query1 = 'foo=bar&php=hypertext+processor';
$query2 = 'foo=bar&php=hypertext processor';

echo 'query1 : '.$query1, '<br>';
echo 'query2 : '.$query2, '<br><br>';

echo 'urlencode : '.urlencode($query1), '<br>';
echo 'urlencode : '.urlencode($query2), '<br><br>';

echo 'rawurlencode : '.rawurlencode($query1), '<br>';
echo 'rawurlencode : '.rawurlencode($query2), '<br><br>';

上面的代码将会输出如下的内容:

query1 : foo=bar&php=hypertext+processor
query2 : foo=bar&php=hypertext processor

urlencode : foo%3Dbar%26php%3Dhypertext%2Bprocessor
urlencode : foo%3Dbar%26php%3Dhypertext+processor

rawurlencode : foo%3Dbar%26php%3Dhypertext%2Bprocessor
rawurlencode : foo%3Dbar%26php%3Dhypertext%20processor

可见,urlencode 把空格转为了 + ,rawurlencode 却是把空格转为了 %20 , 这里看出 urlencode 把空格做了特殊处理

再进行一个测试,把如下参数加在 url 后面 a=foo%3Dbar%26php%3Dhypertext%2Bprocessor  ,这个字符串就是上面的query1 经过 urlencode 之后的结果,接着加入如下测试代码,看看情况:

<?php
echo '$_GET[a] : '.$_GET['a'], '<br>';
echo 'urldecode : '.urldecode($_GET['a']), '<br>';
echo 'rawurldecode : '.rawurldecode($_GET['a']), '<br>';
?>

上面的代码将会输出如下的内容:

$_GET[a] : foo=bar&php=hypertext+processor
urldecode : foo=bar&php=hypertext processor
rawurldecode : foo=bar&php=hypertext+processor

可见,浏览器自动直接对参数进行了 decode 操作。如果我们按照常理在刚开始进行了 encode 编码,后面肯定是需要 decode 解码,但是如果在这时候解码,你会发现使用 urldecode 与 rawurldecode 的结果是不同的。

接着把 query2 经过urlencode 的结果放到 url 的参数中测试,a=foo%3Dbar%26php%3Dhypertext+processor ,结果如下:

$_GET[a] : foo=bar&php=hypertext processor
urldecode : foo=bar&php=hypertext processor
rawurldecode : foo=bar&php=hypertext processor

可见,浏览器自动进行了 decode 解码操作,并且是 urldecode ,而不是 rawurldecode 。为什么呢?因为 rawurldecode 是不会把 + 转换为空格的。

然后分别把query1 query2  经过rawurlencode 的结果放到url 参数中测试,发现结果都是在我们的预料之中。

总结,(1)如果要把一些特殊字符放到浏览器的 url 参数中,需要使用 encode 方式来编码,否则取到的值有可能不是你所想要的,到底用哪一个,这个看情况而定吧,一般建议使用 rawurlencode ;通过浏览器访问这些经过编码处理的 url 地址时,在接受这些参数值的时候是不需要 decode 操作的。(2)如果情况出现在与浏览器无关的场合,则需要把encode /decode 成对使用。切记,encode 的时候不要对整个参数列表做 encode,而是只对参数值进行 encode 即可。

7
Mar 2013
AUTHOR WiFeng
CATEGORY Web
COMMENTS No Comments

PHP函数的实现原理及性能分析

前言 

在任何语言中,函数都是最基本的组成单元。对于php的函数,它具有哪些特点?函数调用是怎么实现的?php函数的性能如何,有什么使用建议?本文将从原理出发进行分析结合实际的性能测试尝试对这些问题进行回答,在了解实现的同时更好的编写php程序。同时也会对一些常见的php函数进行介绍。

阅读剩余部分...

22
Feb 2013
AUTHOR WiFeng
CATEGORY Web
COMMENTS No Comments

数组赋值在不同语言中的差异

不同的编程语言,基本语法一致,但由于各自的设计结构及使用范围不同而导致一些细微的语法差异。以下介绍一个数组在赋值的时候结果不同的例子。

阅读剩余部分...

14
Dec 2012
AUTHOR WiFeng
CATEGORY Web
COMMENTS No Comments

(PHP版)处理图片的类库

GD库,很强大,不过对其使用非常熟练的为数不多,对于处理 jpg 之类的图片好像没有任何问题,但是出现了gif 动画图片怎么办?对于裁减 gif 动画图片,本人至今在GD库中没有找到一个合适且完美的解决方案。

阅读剩余部分...

17
Nov 2012
AUTHOR WiFeng
CATEGORY Web
COMMENTS No Comments

安装rzsz软件包全攻略

首先,简单说明rzsz的大意,rz是linux系统上的文件上传工具,sz是linux系统上的文件下载工具。有的linux系统预装这两个软件,则不必要再次安装,有的系统则需要自己去安装后方可使用。以下介绍 rzsz 的安装方法:

阅读剩余部分...

14
Oct 2012
AUTHOR WiFeng
CATEGORY Web,Asset
COMMENTS No Comments

Discuz7.0/UCHome2.0/WordPress Ngnix下伪静态完全兼容

如果web站点根目录先放的是wordpress,bbs目录下放的Discuz7.0,home目录下方的UCHome2.0,以下rewrite或许对你有用

location / {
index index.html index.htm index.php;

rewrite ^/home/(space|network)\-(.+)\.html$ /home/$1.php?rewrite=$2 last;
rewrite ^/home/(space|network)\.html$ /home/$1.php last;
rewrite ^/home/([0-9]+)$ /home/space.php?uid=$1 last;

rewrite ^/bbs/archiver/((fid|tid)-[\w\-]+\.html)$ /bbs/archiver/index.php?$1 last;
rewrite ^/bbs/forum-([0-9]+)-([0-9]+)\.html$ /bbs/forumdisplay.php?fid=$1&page=$2 last;
rewrite ^/bbs/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ /bbs/viewthread.php?tid=$1&extra=page\%3D$3&page=$2 last;
rewrite ^/bbs/space-(username|uid)-(.+)\.html$ /bbs/space.php?$1=$2 last;
rewrite ^/bbs/tag-(.+)\.html$ /bbs/tag.php?name=$1 last;

if (!-e $request_filename) {
       rewrite ^.+/?(/wp-.*) $1 last;
       rewrite ^.+/?(/.*\.php)$ $1 last;
       rewrite ^(.+)$ /index.php?q=$1 last;
}

}

顺序也是不能随便的哦。wordpress的伪静态需要放到最下面。

21
Sep 2012
AUTHOR WiFeng
CATEGORY Web
COMMENTS No Comments