PHP的json_encode使用分析说明

 更新时间:2016年11月25日 16:21  点击:1926
本文章来给大家介绍json_encode使用分析,兴趣了解php源码的朋友可尝试参考哦。

json的优点就不说了,

有个习惯,我在输出json的时候,喜欢用 sprintf 拼成json格式,

前两天被朋友说不标准,必须要用json_encode生成的才是标准的json格式,我当然很郁闷啦,

用了这么多年了,刚知道 这样做不标准,既然说我不标准,那上面才是标准的json格式?

 代码如下 复制代码

{a : 'abc'} {'a' : 'abc'} {a : "abc"} {"a" : "abc"}


那都知道,只有第四种才是标准的json格式。

我这么做

 代码如下 复制代码

$ret_json='{"%s":"%s"}';

echo json_encode($ret_json,"a","abc");

必然也符合标准。

既然如此,那我就要刨根问底,json_encode生成的json格式究竟有什么不同?
上代码

 代码如下 复制代码
static PHP_FUNCTION(json_encode)
{
        zval *parameter;
        smart_str buf = {0};
        long options = 0;
 
        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|l", &parameter, &options) == FAILURE) {
                return;
        } 
 
        JSON_G(error_code) = PHP_JSON_ERROR_NONE;
 
        php_json_encode(&buf, parameter, options TSRMLS_CC);
 
        ZVAL_STRINGL(return_value, buf.c, buf.len, 1);
 
        smart_str_free(&buf);
}

JSON_G(error_code) = PHP_JSON_ERROR_NONE;
是定义的json错误,该错误可以通过json_last_error函数获取,你用过吗?反正我没用过。
php_json_encode是主要的操作

 代码如下 复制代码

PHP_JSON_API void php_json_encode(smart_str *buf, zval *val, int options TSRMLS_DC) /* {{{ */
{
        switch (Z_TYPE_P(val))
        {
                case IS_NULL:
                        smart_str_appendl(buf, "null", 4); //输出NULL
                        break;
 
                case IS_BOOL:
                        if (Z_BVAL_P(val)) {
                                smart_str_appendl(buf, "true", 4);//输出true
                        } else {
                                smart_str_appendl(buf, "false", 5);//输出false
                        }
                        break;
 
                case IS_LONG:
                        smart_str_append_long(buf, Z_LVAL_P(val));//输出长整形的值
                        break;
 
                case IS_DOUBLE:
                        {
                                char *d = NULL;
                                int len;
                                double dbl = Z_DVAL_P(val);
 
                                if (!zend_isinf(dbl) && !zend_isnan(dbl)) {//非无穷尽
                                        len = spprintf(&d, 0, "%.*k", (int) EG(precision), dbl);
                                        smart_str_appendl(buf, d, len);
                                        efree(d);
                                } else {
                                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "double %.9g does not conform to the JSON spec, encoded as 0", dbl);
                                        smart_str_appendc(buf, '0');
                                }
                       }
                        break;
 
                case IS_STRING://字符串
                        json_escape_string(buf, Z_STRVAL_P(val), Z_STRLEN_P(val), options TSRMLS_CC);
                        break;
 
                case IS_ARRAY://数组和对象
                case IS_OBJECT:
                        json_encode_array(buf, &val, options TSRMLS_CC);
                        break;
 
                default:
                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "type is unsupported, encoded as null");
                        smart_str_appendl(buf, "null", 4);
                        break;
        }
 
        return;
}

很明显,根据不同的类型,会有相应的case。
最复杂的是 字符串 、数组 、对象这三种类型,数组和对象是同一种操作。
先看看字符串吧,很长,注释直接写在代码里。

 代码如下 复制代码
/options应该是5.3版本之后才支持的,由以下常量组成的二进制掩码: JSON_HEX_QUOT, JSON_HEX_TAG, JSON_HEX_AMP, JSON_HEX_APOS, JSON_NUMERIC_CHECK, JSON_PRETTY_PRINT, JSON_UNESCAPED_SLASHES, JSON_FORCE_OBJECT, JSON_UNESCAPED_UNICODE.虽然我没用过。。。
static void json_escape_string(smart_str *buf, char *s, int len, int options TSRMLS_DC) /* {{{ */
{
        int pos = 0;
        unsigned short us;
        unsigned short *utf16;
 
        if (len == 0) {//如果长度为0,则直接返回 双引号 ""
                smart_str_appendl(buf, """", 2);
                return;
        }
 
        if (options & PHP_JSON_NUMERIC_CHECK) {//检测是否为0-9的数字,如果是数字,那么就会直接把数据作为long或double类型返回。
                double d;
                int type;
                long p;
 
                if ((type = is_numeric_string(s, len, &p, &d, 0)) != 0) {
                        if (type == IS_LONG) {
                                smart_str_append_long(buf, p);
                        } else if (type == IS_DOUBLE) {
                                if (!zend_isinf(d) && !zend_isnan(d)) {
                                        char *tmp;
                                        int l = spprintf(&tmp, 0, "%.*k", (int) EG(precision), d);
                                        smart_str_appendl(buf, tmp, l);
                                        efree(tmp);
                                } else {
                                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "double %.9g does not conform to the JSON spec, encoded as 0", d);
                                        smart_str_appendc(buf, '0');
                                }
                        }
                        return;
                }
 
        }
 
        utf16 = (unsigned short *) safe_emalloc(len, sizeof(unsigned short), 0);
        len = utf8_to_utf16(utf16, s, len); //这里会对你输入的值一次处理转成对应的Dec码,比如1是49,a是97这样的,保存到utf16中。
        if (len <= 0) {//如果len小于0 说明出错。如果用json_encode处理GBK的编码,就会在这里挂掉。
                if (utf16) {
                        efree(utf16);
                }
                if (len < 0) {
                        JSON_G(error_code) = PHP_JSON_ERROR_UTF8;
                        if (!PG(display_errors)) {
                                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid UTF-8 sequence in argument");
                        }
                        smart_str_appendl(buf, "null", 4);
                } else {
                        smart_str_appendl(buf, """", 2);
                }
                return;
        }
 
        smart_str_appendc(buf, '"'); //输入 "
 
//下面这一段代码就是将一些特殊字符转义如 双引号,反斜线等等
        while (pos < len)
        {
                us = utf16[pos++];
 
                switch (us)
                {
                        case '"':
                                if (options & PHP_JSON_HEX_QUOT) {
                                        smart_str_appendl(buf, "\u0022", 6);
                                } else {
                                        smart_str_appendl(buf, "\"", 2);
                                }
                                break;
 
                        case '\':
                                smart_str_appendl(buf, "\\", 2);
                                break;
case '/':
                                smart_str_appendl(buf, "\/", 2);
                                break;
 
                        case 'b':
                                smart_str_appendl(buf, "\b", 2);
                                break;
 
                        case 'f':
                                smart_str_appendl(buf, "\f", 2);
                                break;
 
                        case 'n':
                                smart_str_appendl(buf, "\n", 2);
                                break;
 
                        case 'r':
                                smart_str_appendl(buf, "\r", 2);
                                break;
 
                        case 't':
                                smart_str_appendl(buf, "\t", 2);
                                break;
 
                        case '<':
                                if (options & PHP_JSON_HEX_TAG) {
                                        smart_str_appendl(buf, "\u003C", 6);
                                } else {
                                        smart_str_appendc(buf, '<');
                                }
                                break;
 
                        case '>':
                                if (options & PHP_JSON_HEX_TAG) {
                                        smart_str_appendl(buf, "\u003E", 6);
                                } else {
                                        smart_str_appendc(buf, '>');
}
                                break;
 
                        case '&':
                                if (options & PHP_JSON_HEX_AMP) {
                                        smart_str_appendl(buf, "\u0026", 6);
                                } else {
                                        smart_str_appendc(buf, '&');
                                }
                                break;
 
                        case ''':
                                if (options & PHP_JSON_HEX_APOS) {
                                        smart_str_appendl(buf, "\u0027", 6);
                                } else {
                                        smart_str_appendc(buf, ''');
                                }
                                break;
 
                        default: //一直到这里,没有特殊字符就会把值append到buf中
                                if (us >= ' ' && (us & 127) == us) {
                                        smart_str_appendc(buf, (unsigned char) us);
                                } else {
                                        smart_str_appendl(buf, "\u", 2);
                                        us = REVERSE16(us);
 
                                        smart_str_appendc(buf, digits[us & ((1 << 4) - 1)]);
                                        us >>= 4;
                                        smart_str_appendc(buf, digits[us & ((1 << 4) - 1)]);
                                        us >>= 4;
                                        smart_str_appendc(buf, digits[us & ((1 << 4) - 1)]);
                                        us >>= 4;
                                        smart_str_appendc(buf, digits[us & ((1 << 4) - 1)]);
                                }
                                break;
                }
        }
        smart_str_appendc(buf, '"'); //结束 双引号。
        efree(utf16);
}

再来看看数组和对象,也很简单,

 代码如下 复制代码
static void json_encode_array(smart_str *buf, zval **val, int options TSRMLS_DC) /* {{{ */
{
        int i, r;
        HashTable *myht;
 
        if (Z_TYPE_PP(val) == IS_ARRAY) {
                myht = HASH_OF(*val);
                r = (options & PHP_JSON_FORCE_OBJECT) ? PHP_JSON_OUTPUT_OBJECT : json_determine_array_type(val TSRMLS_CC);
        } else {
                myht = Z_OBJPROP_PP(val);
                r = PHP_JSON_OUTPUT_OBJECT;
        } 
 
        if (myht && myht->nApplyCount > 1) {
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "recursion detected");
                smart_str_appendl(buf, "null", 4);
                return;
        }
//开始标签
        if (r == PHP_JSON_OUTPUT_ARRAY) {
                smart_str_appendc(buf, '[');
        } else {
                smart_str_appendc(buf, '{');
        } 
 
        i = myht ? zend_hash_num_elements(myht) : 0;
 
        if (i > 0)
        {
                char *key;
                zval **data;
                ulong index;
                uint key_len;
                HashPosition pos;
                HashTable *tmp_ht;
                int need_comma = 0;
 
                zend_hash_internal_pointer_reset_ex(myht, &pos);
//便利哈希表
                for (;; zend_hash_move_forward_ex(myht, &pos)) {
                        i = zend_hash_get_current_key_ex(myht, &key, &key_len, &index, 0, &pos);
                        if (i == HASH_KEY_NON_EXISTANT)
                                break;
 
                        if (zend_hash_get_current_data_ex(myht, (void **) &data, &pos) == SUCCESS) {
                                tmp_ht = HASH_OF(*data);
                                if (tmp_ht) {
                                        tmp_ht->nApplyCount++;
                                }
 
                                if (r == PHP_JSON_OUTPUT_ARRAY) {
                                        if (need_comma) {
                                                smart_str_appendc(buf, ',');
                                        } else {
                                                need_comma = 1;
                                        }
//将值append到 buf中
                                        php_json_encode(buf, *data, options TSRMLS_CC);
                                } else if (r == PHP_JSON_OUTPUT_OBJECT) {
                                        if (i == HASH_KEY_IS_STRING) {
                                                if (key[0] == '' && Z_TYPE_PP(val) == IS_OBJECT) {
                                                        /* Skip protected and private members. */
                                                        if (tmp_ht) {
                                                                tmp_ht->nApplyCount--;
                                                        }
                                                        continue;
                                                }
 
                                                if (need_comma) {
                                                        smart_str_appendc(buf, ',');
                                                } else {
                                                        need_comma = 1;
                                                }
 
                                                json_escape_string(buf, key, key_len - 1, options & ~PHP_JSON_NUMERIC_CHECK TSRMLS_CC);
                                                smart_str_appendc(buf, ':');
 
                                                php_json_encode(buf, *data, options TSRMLS_CC);
                                        } else {
                                                if (need_comma) {
                                                        smart_str_appendc(buf, ',');
                                                } else {
                                                        need_comma = 1;
                                                }
 
                                                smart_str_appendc(buf, '"');
                                                smart_str_append_long(buf, (long) index);
                                                smart_str_appendc(buf, '"');
                                                smart_str_appendc(buf, ':');
 
                                                php_json_encode(buf, *data, options TSRMLS_CC);
                                        }
                                }
 
                                if (tmp_ht) {
                                        tmp_ht->nApplyCount--;
                                }
                        }
                }
        }
//结束标签
        if (r == PHP_JSON_OUTPUT_ARRAY) {
                smart_str_appendc(buf, ']');
        } else {
                smart_str_appendc(buf, '}');
        }
}

通过简单分析,证明了一个问题,跟我上面用sprintf的方法其实是一样的,都是拼接字符串,

而且 为了性能,更应该鼓励用sprintf来拼接json格式,

因为 json_encode会进行很多 循环操作,而且所消耗的性能是线性的 O(n^2)。

在php不不管读取什么类型的文件多半是使用fopen函数,然后配合其它的函数再进行操作,下面我来介绍读取dat数据文件的方法。

以下是一篇关于文件基本读写操作的文章,我曾经就是看了这篇文章后学会文件基本操作的,在这里发出来与大家共享: 复制内容到剪贴板

 代码如下 复制代码

$file_name = "data.dat";
// 要读取的文件的绝对路径: homedata.dat

$file_pointer = fopen($file_name, "r");
// 打开文件,"r" 是一种模式,或者说我们要进行的操作方法,详见本文后面的介绍

$file_read = fread($file_pointer, filesize($file_name));
// 通过文件指针读取文件内容

fclose($file_pointer);
// 关闭文件

print "读取到的文件内容是: $file_read";
// 显示文件内容
?>

代码:

 

 代码如下 复制代码

$file_name = "data.dat";
// 绝对路径: homedata.dat

$file_pointer = fopen($file_name, "w");
// "w"是一种模式,详见后面

fwrite($file_pointer, "what you wanna write");
// 先把文件剪切为0字节大小, 然后写入

fclose($file_pointer);
// 结束

print "数据成功写入文件";

?>

代码:

 

 代码如下 复制代码

$file_name = "data.dat";
// 绝对路径: homedata.dat

$file_pointer = fopen($file_name, "a");
// "w"模式

fwrite($file_pointer, "what you wanna append");
// 不把文件剪切成0字节, 把数据追加到文件最后

fclose($file_pointer);
// 结束

print "数据成功追加到文件";

?>

以上只是简单介绍,下面我们要讨论一些更深层的。

有时候会发生多人写入的情况(最常见是在流量较大的网站),会产生无用的数据写入文件, 例如:

info.file文件内容如下

->

|1|Mukul|15|Male|India (n)
|2|Linus|31|Male|Finland (n)现在两个人同时注册,引起文件破坏

->

info.file ->

|1|Mukul|15|Male|India
|2|Linus|31|Male|Finland
|3|Rob|27|Male|USA|
Bill|29|Male|USA上例中当PHP写入Rob的信息到文件的时候,Bill正好也开始写入,这时候正好需要写入Rob纪录的'n',引起文件破坏。

我们当然不希望发生这样的情况, 所以让我们看看文件锁定: 复制内容到剪贴板
代码:

 代码如下 复制代码

 

$file_name = "data.dat";

$file_pointer = fopen($file_name, "r");

$lock = flock($file_pointer, LOCK_SH);
// 我使用4.0.2,所以用LOCK_SH,你可能需要直接写成 1.

if ($lock) {

$file_read = fread($file_pointer, filesize($file_name));
$lock = flock($file_pointer, LOCK_UN);
// 如果版本小于PHP4.0.2, 用 3 代替 LOCK_UN

}

fclose($file_pointer);

print "文件内容为 $file_read";

?>上例中,如果两个文件read.php和read2.php都要存取该文件,那么它们都可以读取,但是当一个程序需要写入的时候,它必须等待,直到读操作完成,文件所释放。 复制内容到剪贴板
代码:

 代码如下 复制代码

 

$file_name = "data.dat";

$file_pointer = fopen($file_name, "w");

$lock = flock($file_pointer, LOCK_EX);
// 如果版本低于PHP4.0.2, 用 2 代替 LOCK_EX

if ($lock) {

fwrite($file_pointer, "what u wanna write");
flock($file_pointer, LOCK_UN);
// 如果版本低于PHP4.0.2, 用 3 代替 LOCK_UN

}

fclose($file_pointer);

print "数据成功写入文件";

?>

Hmmm..., 对于追加数据与其他操作有点不同,就是FSEEK! 确认文件指针在文件尾部总是一个好习惯。

如果是在Windows系统下, 上面的文件中文件名前面需要加上''.

FLOCK杂谈:

Flock()只在文件打开后才锁定。 在上列中文件打开后才获得锁定,现在文件的内容只是在当时的内容, 而不反映出别的程序操作的结果,因此不只是在文件追加操作,就是对读取操作也应该使用fseek。
(此处翻译可能不是很确切, 但我想意思到了)。

关于模式:

'r' - 只读方式打开, 文件指针置于文件头

'r+' - 读写方式打开,文件指针置于文件头

'w' - 只写打开,文件指针置于文件头, 文件被剪切为0字节, 如果文件不存在, 尝试建立文件

'w+' - 读写打开,文件指针置于文件头, 文件大小被剪切为0字节,如果文件不存在, 尝试建立文件

'a' - 只写方式打开,文件指针置于文件尾,如果文件不存在,尝试建立文件

'a+' - 读写打开,文件指针置于文件尾,如果文件不存在, 尝试建立文件

如果要在php中实现视频拍照我们需要借助于flash插件了,由flash拍出的确照片我们再通过php的$GLOBALS [\'HTTP_RAW_POST_DATA\']接受数据,然后保存成图片就可以了,下面我来介绍一下。

现在手机拍照很火,那么如何使用手机拍照并上传头像呢?原因很简单,就是数据传递,首先手机传递照片信息,这个就不是post传递 也不是get函数传递,
这个另外一种数据格式传递,使用的是$GLOBALS ['HTTP_RAW_POST_DATA'],这个系统函数跟post很相似,但是$GLOBALS ['HTTP_RAW_POST_DATA']支持的数据格式更丰富些,详细的区别请自己百度谷歌。
设计流程就是:
$GLOBALS ['HTTP_RAW_POST_DATA']传递照片数据流(二进制)–>打开一张空白图—>把数据流写进空白图片里面–判断是否是有效图片—完成。
注意传递照片的二进制流已经包含照片的尺寸大小,格式等等属性,时间上就是把手机图片信息传递到web端页面。

手机端一般使用flash切割照片大小,大家都知道图片和视频是由二进制流组成的,既然图片可以上传,那么视频能不能上传呢?原理是不是和手机拍照上传头像一样呢?自己可以去研究一下


直接上代码

 代码如下 复制代码

/*
 * 上传图片类
 * @parameter; 用户ID
 * @date:2011-8-15
 * @author:cy
 * */
function UpImg($subdir){
// 设置存储路径
if(!empty($subdir)){
 $dirnow=getcwd();
 $folder =$dirnow."/www.111cn.net/".$subdir;// folder where to save images
   if( !is_dir($folder) ) mkdir($folder);

// 图片命名
 $datenow=date('Ymd');
 $timenow=time();
 $image = $datenow.$timenow.'.jpg';

// 图片是否已存在
 $check = $folder . '/' . $image;
  if (file_exists($check)) {
   unlink($check);
  } else {
   $png = file_get_contents ( 'php://input' ) ? file_get_contents ( 'php://input' ) : gzuncompress ( $GLOBALS ['HTTP_RAW_POST_DATA'] );//得到post过来的二进制原始数据
   if(!empty($png)){
    $file = @fopen($folder."/".$image, "w");
         fwrite($file,$png);//写入 www.111cn.net
    fclose($file);//关闭
    // orignal image location
     $write_image = $folder . '/' . $image;

   }else{
    $msg = "没有数据流";
   }
   if(getimageInfo($write_image)){
     $msg = "上传成功";
    }else{$msg = "图片格式不正确";}
 }
}else{
 $msg = "参数错误";
}
  return $msg;
  }

/*
 * 检测图片是否合法
 * @parameter; 文件名
 * @date:2011-8-15
 * @author:cy
 * */
 function getimageInfo($imageName = '') {
        $imageInfo = getimagesize ( $imageName );
        if ($imageInfo !== false) {
            $imageType = strtolower ( substr ( image_type_to_extension ( $imageInfo [2] ), 1 ) );
//            $imageSize = filesize ( $imageInfo );
            return $info = array ('width' => $imageInfo [0], 'height' => $imageInfo [1], 'type' => $imageType, 'mine' => $imageInfo ['mine'] );
        } else {
            //不是 111cn.net 合法的图片
            return false;
        } 

    }

在使用xml-rpc的时候,server端获取client数据,主要是通过php输入流input,而不是$_POST数组

 

所根据,上面几个探测,我们可以作出以下总结:
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。

今天在做一个简单的采集程序需要下载对方网站内容,然后把内容中的图片再保存在本地服务器上,下面我来给各位同介绍我的具体操作方法,下载图片主要用到了file_get_contents 函数,具体方法如下。


这里我们使用php的正则表达式来实现:

 代码如下 复制代码
$content = '这里是文章内容,这里插入一张图片测试 <img src="http://www.111cn.net/wp-content/uploads/2012/03/48ef3a3e1f30e9246abc40834c086e061c95f7521.jpg">';
$content = stripslashes ( $content );
$img_array = array ();
// 匹配所有远程图片
preg_match_all ( "/(src|SRC)=["|'| ]{0,}(http://(.*).(gif|jpg|jpeg|bmp|png))/isU", $content, $img_array );
// 匹配出来的不重复图片
$img_array = array_unique ( $img_array [2] );
print_r($img_array);

上面就将远程图片给匹配出来了,我们需要将其保持到本地。这里需要注意两点:

1.图片保存路径(图片存储目录)

2.实际访问图片地址

下面是完整实例:(你可以保存到本地服务器修改相应地方进行测试)

 代码如下 复制代码

<!DOCTYPE HTML>
<html lang="en-US">
<head>
<meta charset="UTF-8">
<title>php保存远程图片到本地,php正则匹配文章中的图片地址</title>
</head>
<body>
<?php
//保存文章中远程图片到本地
//作者:yanue;
// 文件保存目录路径(请更换为你自己的路径, 你可以echo一下)
$save_path = $_SERVER ['DOCUMENT_ROOT'] . 'swfupload/attached/';
// 文件保存目录URL
$save_url = '/swfupload/attached/';
$save_path = realpath ( $save_path ) . '/';
// 图片存储目录
$imgPath = $save_path . date ( "Ymd" );
$imgUrl = $save_url . date ( "Ymd" );

// 创建文件夹
if (! is_dir ( $imgPath )) {
 @mkdir ( $imgPath, 0777 );
}
$content = '这里是文章内容,这里插入一张图片测试 <img src="http://www.111cn.net/wp-content/uploads/2012/03/48ef3a3e1f30e9246abc40834c086e061c95f7521.jpg">';
$content = stripslashes ( $content );
$img_array = array ();
// 匹配所有远程图片
preg_match_all ( "/(src|SRC)=["|'| ]{0,}(http://(.*).(gif|jpg|jpeg|bmp|png))/isU", $content, $img_array );
// 匹配出来的不重复图片
$img_array = array_unique ( $img_array [2] );
print_r($img_array);
// 时间无限制
set_time_limit ( 0 );
foreach ( $img_array as $key => $value ) {
 $value = trim ( $value );
 // 读取远程图片
 $get_file = @file_get_contents ( $value );
 // 保存到本地图片名称
 $imgname = date ( "YmdHis" ) . '_' . rand ( 10000, 99999 ) . "." . substr ( $value, - 3, 3 );
 // 保存到本地的实际文件地址(包含路径和名称)
 $fileName = $imgPath . '/' . $imgname;
 // 实际访问的地址
 $fileurl = $imgUrl . "/" . $imgname;
 // 文件写入
 if ($get_file) {
  $fp = @fopen ( $fileName, "w" );
  @fwrite ( $fp, $get_file );
  @fclose ( $fp );
 }
 // 替换原来的图片地址
 $content = ereg_replace ( $value, $fileurl, $content );
}
echo $content;
?>
</body>
</html>

在windows中如果你想让PHP程序自动运行那么我们必须使用windows计划任务来完成了,下面我来给各位同学介绍实现方法。

具体来说,我们若需利用任务计划程序自动运行则应执行如下步骤: 

1.单击”开始”按钮,然后依次选择”程序”→”附件”→”系统工具”→”任务计划”(或者是”设置”→”控制面板”→”任务计划”),启动Windows 2000的任务计划管理程序。

2.在”任务计划”窗口中双击”添加任务计划”图标,启动系统的”任务计划向导”,然后单击”    下一步”按钮,在给出的程序列表中选择需要自动运行的应用程序,然后单击”下一步”按钮。  

3.设置适当的任务计划名称并选择自动执行这个任务的时间频率(如每天、每星期、每月、一次性、每次启动计算机时、每次登录时等),然后单击”下一步”按钮。此时系统将会要求用户对程序运行的具体时间进行设置,如几号、几点钟、哪几个时间段才能运行等,我们只需根据自己的需要加以设置即可。    

4.接下来系统将会要求用户设置适当的用户名及密码(如图5所示),以便系统今后能自动加以运行。   

5.最后,我们只需单击”完成”按钮即可将相应任务添加到Windows 2000的任务计划程序中,此后它就会自动”记住”这个任务,一旦系统时间及相关条件与用户设置的计划相符,它就会自动调用用户所指定的应用程序,十分方 便(每次启动Windows 2000的时候,任务计划程序都会自动启动,并在后台运行,确保用户的计划能够按时执行)。 

  现在我们来测试一下刚才所建的任务是否成功,鼠标右键单击”php”程序图标(如图6所示),在弹出的菜单里面选择”运行”。一般情况下程序图标只要这样 激活运行就可以正常启动。如果运行失败可查看用户和密码是否设置正确,还有确定”Task Scheduler”服务是否已启动,本人当初就是为了节省系统资源把它关掉了导致运行失败,害我找了大半天。另外也可从”系统日志”里查看到底是什么原 因造成运行失败的。

  好了,讲了这么多任务计划的应用,现在我们切入正题,下面将介绍两个例子:

  一、让PHP定时运行

编辑如下代码,并保存为test.php:

$fp = @fopen(”test.txt”, “a+”);
fwrite($fp, date(”Y-m-d H:i:s”) . ” 让PHP定时运行吧!/n”);
fclose($fp);
?>

添加一个任务计划,在(如图2所示)这一步输入命令:

D:/php4/php.exe -q D:/php4/test.php

时间设置为每隔1分钟运行一次,然后运行这个任务。  现在我们来看看d:/php4/test.txt文件的内容时候是否成功。如果内容为如下所示,那么恭喜你成功了。

2007-10-30 11:08:01 让PHP定时运行吧!
2007-10-3011:09:02 让PHP定时运行吧!
2007-10-30 11:10:01 让PHP定时运行吧!
2007-10-30 11:11:02 让PHP定时运行吧!

   二、让MYSQL实现自动备份

编辑如下代码,并保存为backup.php,如果要压缩可以拷贝一个rar.exe:

if ($argc != 2 || in_array($argv[1], array(’–help’, ‘-?’))) {
?>
backup Ver 0.01, for Win95/Win98/WinNT/Win2000/WinXP on i32
Copyright (C) 2000 ptker All rights reserved.
This is free software,and you are welcome to modify and redistribute it
under the GPL license

PHP Shell script for the backup MySQL database.

Usage:

can be database name you would like to backup.
With the –help, or -? options, you can get this help and exit.
} else {
$dbname = $argv[1];
$dump_tool = “c://mysql//bin//mysqldump”;
$rar_tool = “d://php4//rar”;
@exec(”$dump_tool –opt -u user -ppassword $dbname > ./$dbname.sql”);
@exec(”$rar_tool a -ag_yyyy_mm_dd_hh_mm $dbname.rar $dbname.sql”);
@unlink(”$dbname.sql”);
echo “Backup complete!”;
}
?>

添加一个任务计划,在(如图2所示)这一步输入命令:

D:/php4/php.exe -q D:/php4/backup.php databasename

时间设置为每天运行一次,然后运行这个任务。  最后会在d:/php4/目录下生成一个以数据库名和当前时间组成的rar文件。  恭喜你!大功告成了!

  当然备份方式有很多种,读者可按照自己喜欢的去做!

  以上是原著.结合本人实贱,补充说明如下:

如果出现错误:

在试着设置任务帐户信息时出现错误
指定的错误是:
0×80070005:拒绝访问
您没有运行所请求的操作的权限

在上面’”4.接下来系统将会要求用户设置适当的用户名及密码,以便系统今后能自动加以运行”.这里最好用”system”用户,密码可为空.
这个system的权限非常之高,比你的administrator还要高,所以你在运行命令的时候千万不要乱来,这个可是什么提示都没有就会无条件执行的,这个权限下你kill核心进程都行.

  2、添加一个任务计划,在这一步输入命令:

D:/php4/php.exe -q D:/php100/test.php

  正确形式应为

“D:/php4/php.exe” -q “D:/php100/test.php”

  即路径要用双引号括住.

[!--infotagslink--]

相关文章

  • js URLdecode()与urlencode方法支持中文解码

    下面来介绍在js中来利用urlencode对中文编码与接受到数据后利用URLdecode()对编码进行解码,有需要学习的机友可参考参考。 代码如下 复制代码 ...2016-09-20
  • php中json_decode()和json_encode()用法与中文不显示解决办法

    本文章介绍了关于php中json_decode()和json_encode()用法与中文不显示解决办法,有需要的朋友可以参考一下下。 php中json_decode()和json_encode() 1.json_decode(...2016-11-25
  • 图解PHP使用Zend Guard 6.0加密方法教程

    有时为了网站安全和版权问题,会对自己写的php源码进行加密,在php加密技术上最常用的是zend公司的zend guard 加密软件,现在我们来图文讲解一下。 下面就简单说说如何...2016-11-25
  • 源码分析系列之json_encode()如何转化一个对象

    这篇文章主要介绍了源码分析系列之json_encode()如何转化一个对象,对json_encode()感兴趣的同学,可以参考下...2021-04-22
  • ps怎么使用HSL面板

    ps软件是现在很多人都会使用到的,HSL面板在ps软件中又有着非常独特的作用。这次文章就给大家介绍下ps怎么使用HSL面板,还不知道使用方法的下面一起来看看。 &#8195;...2017-07-06
  • Plesk控制面板新手使用手册总结

    许多的朋友对于Plesk控制面板应用不是非常的了解特别是英文版的Plesk控制面板,在这里小编整理了一些关于Plesk控制面板常用的使用方案整理,具体如下。 本文基于Linu...2016-10-10
  • 使用insertAfter()方法在现有元素后添加一个新元素

    复制代码 代码如下: //在现有元素后添加一个新元素 function insertAfter(newElement, targetElement){ var parent = targetElement.parentNode; if (parent.lastChild == targetElement){ parent.appendChild(newEl...2014-05-31
  • 使用GruntJS构建Web程序之构建篇

    大概有如下步骤 新建项目Bejs 新建文件package.json 新建文件Gruntfile.js 命令行执行grunt任务 一、新建项目Bejs源码放在src下,该目录有两个js文件,selector.js和ajax.js。编译后代码放在dest,这个grunt会...2014-06-07
  • 使用percona-toolkit操作MySQL的实用命令小结

    1.pt-archiver 功能介绍: 将mysql数据库中表的记录归档到另外一个表或者文件 用法介绍: pt-archiver [OPTION...] --source DSN --where WHERE 这个工具只是归档旧的数据,不会对线上数据的OLTP查询造成太大影响,你可以将...2015-11-24
  • 如何使用php脚本给html中引用的js和css路径打上版本号

    在搜索引擎中搜索关键字.htaccess 缓存,你可以搜索到很多关于设置网站文件缓存的教程,通过设置可以将css、js等不太经常更新的文件缓存在浏览器端,这样访客每次访问你的网站的时候,浏览器就可以从浏览器的缓存中获取css、...2015-11-24
  • jQuery 1.9使用$.support替代$.browser的使用方法

    jQuery 从 1.9 版开始,移除了 $.browser 和 $.browser.version , 取而代之的是 $.support 。 在更新的 2.0 版本中,将不再支持 IE 6/7/8。 以后,如果用户需要支持 IE 6/7/8,只能使用 jQuery 1.9。 如果要全面支持 IE,并混合...2014-05-31
  • 安装和使用percona-toolkit来辅助操作MySQL的基本教程

    一、percona-toolkit简介 percona-toolkit是一组高级命令行工具的集合,用来执行各种通过手工执行非常复杂和麻烦的mysql和系统任务,这些任务包括: 检查master和slave数据的一致性 有效地对记录进行归档 查找重复的索...2015-11-24
  • C#注释的一些使用方法浅谈

    C#注释的一些使用方法浅谈,需要的朋友可以参考一下...2020-06-25
  • MySQL日志分析软件mysqlsla的安装和使用教程

    一、下载 mysqlsla [root@localhost tmp]# wget http://hackmysql.com/scripts/mysqlsla-2.03.tar.gz--19:45:45-- http://hackmysql.com/scripts/mysqlsla-2.03.tar.gzResolving hackmysql.com... 64.13.232.157Conn...2015-11-24
  • php语言中使用json的技巧及json的实现代码详解

    目前,JSON已经成为最流行的数据交换格式之一,各大网站的API几乎都支持它。我写过一篇《数据类型和JSON格式》,探讨它的设计思想。今天,我想总结一下PHP语言对它的支持,这是开发互联网应用程序(特别是编写API)必须了解的知识...2015-10-30
  • PHP实现无限级分类(不使用递归)

    无限级分类在开发中经常使用,例如:部门结构、文章分类。无限级分类的难点在于“输出”和“查询”,例如 将文章分类输出为<ul>列表形式; 查找分类A下面所有分类包含的文章。1.实现原理 几种常见的实现方法,各有利弊。其中...2015-10-23
  • php类的使用实例教程

    php类的使用实例教程 <?php /** * Class program for yinghua05-2 * designer :songsong */ class Template { var $tpl_vars; var $tpl_path; var $_deb...2016-11-25
  • PHP json_encode() 函数详解及中文乱码问题

    在 php 中使用 json_encode() 内置函数(php > 5.2)可以使用得 php 中数据可以与其它语言很好的传递并且使用它。这个函数的功能是将数值转换成json数据存储格式。<&#63;php$arr = array ( 'Name'=>'希亚', 'Age'...2015-11-08
  • 双冒号 ::在PHP中的使用情况

    前几天在百度知道里面看到有人问PHP中双冒号::的用法,当时给他的回答比较简洁因为手机打字不大方便!今天突然想起来,所以在这里总结一下我遇到的双冒号::在PHP中使用的情况!双冒号操作符即作用域限定操作符Scope Resoluti...2015-11-08
  • PHP mysql与mysqli事务使用说明 分享

    mysqli封装了诸如事务等一些高级操作,同时封装了DB操作过程中的很多可用的方法。应用比较多的地方是 mysqli的事务。...2013-10-02