php-关联链接的生成

关联链接

关联链接是指在文章内容中找到“关联链接名称”加上“关联链接网址”.
如,我们添加一个“xtgxiso”关联到“http://www.xtgxiso.cn”,在发布文章的时候如果出现”xtgxiso“这个关联词,就替换成 < a target=”_blank” href=”http://www.xtgxiso.cn”>xtgxiso</a>

一般的思路应该是这样的:

1:后台来管理这个关联链接

2:前台在发布或显示的时候,根据关键链接和内容逐个匹配,然后返回生成后的内容。

关键是:如何高效的匹配关联链接。

先来说说phpcms的方法:

1:所有的关联链接在后台中管理。且数据在缓存文件中有一份。

2:前台匹配

<!--?php
class member_output {
	var $fields;
	var $data;
	function __construct($modelid,$catid = 0,$categorys = array()) {
		$this--->modelid = $modelid;
		$this-&gt;catid = $catid;
		$this-&gt;categorys = $categorys;
		$this-&gt;fields = getcache('model_field_'.$modelid,'model');
    }
	function get($data) {
		$this-&gt;data = $data;
		$this-&gt;id = $data['id'];
		$info = array();
		foreach($this-&gt;fields as $field=&gt;$v) {
			if(!isset($data[$field])) continue;
			$func = $v['formtype'];
			$value = $data[$field];
			$result = method_exists($this, $func) ? $this-&gt;$func($field, $data[$field]) : $data[$field];
			if($result !== false) $info[$field] = $result;
		}
		return $info;
	}
	function editor($field, $value) {
		$setting = string2array($this-&gt;fields[$field]['setting']);
		if($setting['enablekeylink']) {
			$data = $this-&gt;_keylinks($value, $setting['replacenum'],$setting['link_mode']);
		}
		return $data;
	}
	function _base64_encode($t,$str) {
		return $t."\"".base64_encode($str)."\"";
	}
	function _base64_decode($t,$str) {
		return $t."\"".base64_decode($str)."\"";
	}
	function _keylinks($txt, $replacenum = '',$link_mode = 1) {
		$txt = addslashes($txt);
		$search = "/(alt\s*=\s*|title\s*=\s*)[\"|\'](.+?)[\"|\']/ise";
		$replace = "$this-&gt;_base64_encode('\\1','\\2')";
		$replace1 = "$this-&gt;_base64_decode('\\1','\\2')";
		$txt = preg_replace($search, $replace, $txt);
		$keywords = $this-&gt;data['keywords'];
		if($keywords) $keywords = strpos(',',$keywords) === false ? explode(' ',$keywords) : explode(',',$keywords);
		if($link_mode &amp;&amp; !empty($keywords)) {
			foreach($keywords as $keyword) {
				$linkdatas[] = $keyword;
			}
		} else {
			//TODO 
			$linkdatas = array(
				0 =&gt; array(0=&gt;'网站',1=&gt;'http://www.phpip.com'),
				1 =&gt; array(0=&gt;'百度',1=&gt;'http://www.baidu.com'),
			);
		}
		if($linkdatas) {
			$word = $replacement = array();
			foreach($linkdatas as $v) {
				if($link_mode &amp;&amp; $keywords) {
					$word1[] = '/'.preg_quote($v, '/').'/';
					$word2[] = $v;
					$replacement[] = '<a href="javascript:;" class="keylink">'.$v.'</a>';
				} else {
					$word1[] = '/'.preg_quote($v[0], '/').'/';
					$word2[] = $v[0];
					$replacement[] = '<a href="'.$v[1].'" target="_blank" class="keylink">'.$v[0].'</a>';
				}
			}
			if($replacenum != '') {
				$txt = preg_replace($word1, $replacement, $txt, $replacenum);
			} else {
				$txt = str_replace($word2, $replacement, $txt);
			}
		}
		$txt = preg_replace($search, $replace1, $txt);
		$txt = stripslashes($txt);
		return $txt;
	}
	function box($field, $value) {
		extract(string2array($this-&gt;fields[$field]['setting']));
		if($outputtype) {
			return $value;
		} else {
			$options = explode("\n",$this-&gt;fields[$field]['options']);
			foreach($options as $_k) {
				$v = explode("|",$_k);
				$k = trim($v[1]);
				$option[$k] = $v[0];
			}
			$string = '';
			switch($this-&gt;fields[$field]['boxtype']) {
				case 'radio':
					$string = $option[$value];
				break;
				case 'checkbox':
					$value_arr = explode(',',$value);
					foreach($value_arr as $_v) {
						if($_v) $string .= $option[$_v].' 、';
					}
				break;
				case 'select':
					$string = $option[$value];
				break;
				case 'multiple':
					$value_arr = explode(',',$value);
					foreach($value_arr as $_v) {
						if($_v) $string .= $option[$_v].' 、';
					}
				break;
			}
			return $string;
		}
	}
	function images($field, $value) {
		return string2array($value);
	}
	function datetime($field, $value) {
		$setting = string2array($this-&gt;fields[$field]['setting']);
		extract($setting);
		if($fieldtype=='date') {
			$format_txt = 'Y-m-d';
		} elseif($fieldtype=='datetime') {
			$format_txt = 'Y-m-d H:i:s';
		} else {
			$format_txt = $format;
		}
		if(strlen($format_txt)&lt;6) {
			$isdatetime = 0;
		} else {
			$isdatetime = 1;
		}
		if(!$value) $value = SYS_TIME;
		$value = date($format_txt,$value);
		return $value;
	}
	function linkage($field, $value) {
		$setting = string2array($this-&gt;fields[$field]['setting']);
		$datas = getcache($setting['linkageid'],'linkage');
		$infos = $datas['data'];
		if($setting['showtype']==1) {
			$result = $this-&gt;_get_parent($value, $setting['linkageid'], $setting['space']);
		} elseif($setting['showtype']==2) {
			$result = $value;
		} else {
			$result = $infos[$value]['name'];
		}
		return $result;
	}
	function _get_parent($linkageid, $keyid, $space = '&gt;', $result = array(), $infos = array()) {
		if($space=='' || !isset($space))$space = '&gt;';
		if(!$infos) {
			$datas = getcache($keyid,'linkage');
			$infos = $datas['data'];
		}
		if(array_key_exists($linkageid,$infos)) {
			$result[]=$infos[$linkageid]['name'];
			return $this-&gt;_get_parent($infos[$linkageid]['parentid'], $keyid, $space, $result, $infos);
		} else {
			if(count($result)&gt;0) {
				krsort($result);
				$result = implode($space,$result);
				return $result;
			}
			else {
				return $result;
			}
		}			
	}
 } 
?&gt;
        

在方法 _keylinks 中可以明显看到。思想就是

1:先将不应该替换的替换成编码后的内容

2:遍历关联链接生成要替换的相应数据。

3:执行替换,返回数据。

再来说说discuz的方法:

1:和phpcms一样,所有的关联链接在后台中管理。且数据在缓存文件中有一份。

2:前台匹配

<!--?php
/**
 *      [Discuz!] (C)2001-2099 Comsenz Inc.
 *      This is NOT a freeware, use is subject to license terms
 *
 *      $Id: helper_seo.php 32836 2013-03-14 08:10:02Z zhangguosheng $
 */
if(!defined('IN_DISCUZ')) {
	exit('Access Denied');
}
class helper_seo {
	public static function get_seosetting($page, $data = array(), $defset = array()) {
		global $_G;
		$searchs = array('{bbname}');
		$replaces = array($_G['setting']['bbname']);
		$seotitle = $seodescription = $seokeywords = '';
		$titletext = $defset['seotitle'] ? $defset['seotitle'] : $_G['setting']['seotitle'][$page];
		$descriptiontext = $defset['seodescription'] ? $defset['seodescription'] : $_G['setting']['seodescription'][$page];
		$keywordstext = $defset['seokeywords'] ? $defset['seokeywords'] : $_G['setting']['seokeywords'][$page];
		preg_match_all("/\{([a-z0-9_-]+?)\}/", $titletext.$descriptiontext.$keywordstext, $pageparams);
		if($pageparams) {
			foreach($pageparams[1] as $var) {
				$searchs[] = '{'.$var.'}';
				if($var == 'page') {
					$data['page'] = $data['page'] --> 1 ? lang('core', 'page', array('page' =&gt; $data['page'])) : '';
				}
				$replaces[] = $data[$var] ? strip_tags($data[$var]) : '';
			}
			if($titletext) {
				$seotitle = helper_seo::strreplace_strip_split($searchs, $replaces, $titletext);
			}
			if($descriptiontext &amp;&amp; (isset($_G['makehtml']) || CURSCRIPT == 'forum' || IS_ROBOT || $_G['adminid'] == 1)) {
				$seodescription = helper_seo::strreplace_strip_split($searchs, $replaces, $descriptiontext);
			}
			if($keywordstext &amp;&amp; (isset($_G['makehtml']) || CURSCRIPT == 'forum' || IS_ROBOT || $_G['adminid'] == 1)) {
				$seokeywords = helper_seo::strreplace_strip_split($searchs, $replaces, $keywordstext);
			}
		}
		return array($seotitle, $seodescription, $seokeywords);
	}
	public static function strreplace_strip_split($searchs, $replaces, $str) {
		$searchspace = array('((\s*\-\s*)+)', '((\s*\,\s*)+)', '((\s*\|\s*)+)', '((\s*\t\s*)+)', '((\s*_\s*)+)');
		$replacespace = array('-', ',', '|', ' ', '_');
		return trim(preg_replace($searchspace, $replacespace, str_replace($searchs, $replaces, $str)), ' ,-|_');
	}
	public static function get_title_page($navtitle, $page){
		if($page &gt; 1) {
			$navtitle .= ' - '.lang('core', 'page', array('page' =&gt; $page));
		}
		return $navtitle;
	}
	public static function get_related_link($extent) {
		global $_G;
		loadcache('relatedlink');
		$allextent = array('article' =&gt; 0, 'forum' =&gt; 1, 'group' =&gt; 2, 'blog' =&gt; 3);
		$links = array();
		if($_G['cache']['relatedlink'] &amp;&amp; isset($allextent[$extent])) {
			foreach($_G['cache']['relatedlink'] as $link) {
				$link['extent'] = sprintf('%04b', $link['extent']);
				if($link['extent'][$allextent[$extent]] &amp;&amp; $link['name'] &amp;&amp; $link['url']) {
					$links[] = daddslashes($link);
				}
			}
		}
		rsort($links);
		return $links;
	}
	public static function parse_related_link($content, $extent) {
		global $_G;
		loadcache('relatedlink');
		$allextent = array('article' =&gt; 0, 'forum' =&gt; 1, 'group' =&gt; 2, 'blog' =&gt; 3);
		if($_G['cache']['relatedlink'] &amp;&amp; isset($allextent[$extent])) {
			$searcharray = $replacearray = array();
			foreach($_G['cache']['relatedlink'] as $link) {
				$link['extent'] = sprintf('%04b', $link['extent']);
				if($link['extent'][$allextent[$extent]] &amp;&amp; $link['name'] &amp;&amp; $link['url']) {
					$searcharray[$link[name]] = '/('.preg_quote($link['name']).')/i';
					$replacearray[$link[name]] = "<a href="\&quot;$link[url]\&quot;" target="\&quot;_blank\&quot;" class="\&quot;relatedlink\&quot;">$link[name]</a>";
				}
			}
			if($searcharray &amp;&amp; $replacearray) {
				$_G['trunsform_tmp'] = array();
				$content = preg_replace("/(<script\s+.*?>.*?&lt;\/script&gt;)|(<a\s+.*?>.*?&lt;\/a&gt;)|(<img\s+.*?[\ ]?="">)|(\[attach\](\d+)\[\/attach\])/ies", "helper_seo::base64_transform('encode', '', '\\1\\2\\3\\4', '')", $content);
				$content = preg_replace($searcharray, $replacearray, $content, 1);
				$content = preg_replace("/(.*?)&lt;\/relatedlink&gt;/ies", "helper_seo::base64_transform('decode', '', '\\1', '')", $content);
			}
		}
		return $content;
	}
	public static function base64_transform($type, $prefix, $string, $suffix) {
		global $_G;
		if($type == 'encode') {
			$_G['trunsform_tmp'][] = base64_encode(str_replace("\\\"", "\"", $string));
			return $prefix.(count($_G['trunsform_tmp']) - 1).$suffix;
		} elseif($type == 'decode') {
			return $prefix.base64_decode($_G['trunsform_tmp'][$string]).$suffix;
		}
	}
}
?&gt;

再代码中我们再次看到,思想都是一样的。只是正则稍微不同而已。以上两种都没有考虑到如果关联链接如果多的话性能的问题.discuz思路是可以在客户端生成来缓解服务器的压力,但同样量大的话,客户端同样也会卡死的。

再来说说自己的小思路,问题的关键是如何快速的匹配出一个内容里究竟包含几个关联链接

现提供一个小sql就可以轻松解决,测试十几W条关联链接没什么大问题,是一个小而快的解决方案,大家有更的方法欢迎交流.

select id,keyword,url from fmb_keywordlink where INSTR(‘张玉珊修身堂(长宁龙之梦店)aaaBodyConcept普拉提’,shop_name);

including hip tunics
snooki weight loss Fashion and Makeup Tips for Brunette Girls

On the euro
gay pornStarting Your Clothing Line Business in 8 Steps
free gay porn
发表在 网站开发 | 2 条评论

memcached的简单说明

先说说memcache的特点吧.

  1. 基于C/S架构,协议简单
  2. 基于libevent的事件处理
  3. 自主内存存储处理
  4. 基于客户端的分布式

协议简单大家可能不太明白,因为通常大家都是用各语言的API操作memcached。现在给大家说说通过命令行来操作memcached,相信大家就会理解了。

基本的命令:

  1. 存储命令:set,add,replace
  2. 读取命令:get,gets
  3. 删除命令:delete
  4. 计数命令:incr,decr
  5. 统计命令:stats

存储命令

格式

<command> <key> <flags> <exptime> <bytes> [version]\r\n

<datablock>\r\n

<status>\r\n

command

set 无论如何都进行存储

add 只有数据不存在时添加

replace 只有数据存在时替换

key 字符串,小于250字符
flags 扩展用的 比如客户端用来标识数据格式的值,如json,xml,压缩等
exptime 存活时间,以秒为单位
bytes 字节数,不包含\r\n
datablock 文本行,以\r\n结尾。
status STORED,NO_STORED,EXISTS,NO_FOUND,ERROR,CLIENT_ERROR,SERVER_ERROR

大家只要通过telnet 127.0.0.1 1211 :要想设置一个key的数据。这样操作就行

set xtgxios 0 60 3

php

STORED

想必大家一下就明白了吧。memcached的协议就是这么简单。更多协议内空见:https://github.com/memcached/memcached/blob/master/doc/protocol.txt

现在让我们深入了解下memcached的内部机制


  1. 守护进程机制—UNIX daemon
  2. Socket事件处理机制—libevent事件异步处理
  3. 内存管理机制—slab内存分配机制,LRU清除机制,Hash机制
  4. 多线和处理机制

好了,今天先写到这我和。有空再写。14年第一技术贴

Many businesses struggle with high insurance premiums
gay porn The Latest News from DKNY

impression popular
miranda lambert weight lossDressing for the Transitional Season
large porn tube
发表在 数据库研究, 网站开发, 网站架构 | 标签为 , | 2 条评论

2014年第一天

2014年第一天

新的一天,新的一年,新的开始!

向着目标努力奋斗。

Linen and cotton seem to be fabric of the season
snooki weight loss Top 5 best dressed at the Emmys

Find a cool cuff bracelet
gay pornPurchasing Glasses Online is a Good Choice
lesbian porn
发表在 个人感悟 | 一条评论

PHP中的单元测试利器–PHPUnit

再好的程序员也会犯错。好程序员不同于差程序员之处在于他们通过测试来尽早发现错误。

测试进行的越早,发现错误的机会就越大,发现和修正的代价就越小。因此临近软件发布才进行测试是很有问题的做法。

大多数错误都未能发现,而已发现的那些错误,修正它们的代价实在太大,于是根本不可能把它们全部修复,只能挑着处理其中的一部分。

使用 PHPUnit 进行测试与过往的做法并没有本质区别,只是方式有所不同。

二者的区别在于测试与执行一系列测试,前者检查软件的行为是否符合预期,后者则利用一些可运行的代码片段来自动测试软件各个部分(单元)的正确性。这些可运行的代码片段称为单元测试.

而PHPUnit就是提供了此功能.

详细内容:http://phpunit.de/manual/3.8/zh_cn/installation.html

mohawk for ladies with prolonged blow
quick weight loss Tips of Spotting A and AAA Grade LV Replica Handbags

here’s how to get jennifer aniston your hair
snooki weight lossIs Travelzoo Bartel’s Main Squeeze
youporn
发表在 网站架构 | 2 条评论

考试的教训

通过图形学和操作系统的考试,发现不会的还是蛮多的。

下次不能不认真对待上课和作业了,更不能不求甚解。

明年好好学

if any rim at all around the lenses themselves
snooki weight loss Wood Privacy Fences and Other Privacy Fence Options

a lot of moments that are not exactly Kim from BCN
cartoon pornHistory’s 7 Most Astounding Sexual Resumes
anime porn
发表在 个人感悟, 北京大学 | 一条评论

北京大学–图形学–操作系统-二手书免费赠送

刚刚考试完,现将书籍赠送

计算机图形学一本:主编是丁爱玲。

操作系统原理教程(第3版) 主编:张丽芬,刘美化

The opposite is also true
porno How to Become a Fashion Illustrator

During the second quarter of 2014
christina aguilera weight lossFrench Longchamp Le Pliage Handbag
free black porn
发表在 二手书, 北京大学 | 一条评论

2014-全年业余时间自学计划

个人认为GO语言是一个不错的语言,打算深入学习一下。因此,列一下大致的学习计划,以做监督和学习。

先列出大致学习步骤

  1. Go环境配置和Go语言基础
  2. Web基础(搭建一个简单的http服务器,要熟悉http协议)
  3. 表单的处理
  4. 访问数据库(mysql)     
  5. session和数据存储
  6. 文本文件处理
  7. Web服务
  8. 安全与加密
  9. 国际化和本地化和错误处理,调试和测试
  10. 部署与维护,如何设计一个Web框架,扩展Web框架

在最后两个月的时候,写一个项目出来,目前想到的可能有如下:

1:用go来写一个类似memcached的kv内存数据库(要熟悉memcached协议和各种算法)

2:用go来写一个稍微不错的http服务器(要熟悉http协议和各种算法)

3:用go来写一个mvc的开发框架

此致,敬礼。开始我新的2014!

what makes merrell or even taken into account a primary ‘
miranda lambert weight loss 7 Tips for the Advanced Bowlers

but I tend to think summer is pretty basic anyway
weight loss tipsCarrying your babies with innovative and fashion signature with Babay stroller
milf porn
发表在 个人感悟 | 一条评论

如何用各种编程语言杀死一条龙

这篇有趣的文章编译自一篇西班牙博客。

有一位美丽的公主,被关押在一个城堡中最高的塔上,一条凶恶的巨龙看守着她,需要有一位勇士营救她…

下面是各种语言如何想办法将公主从巨龙手中营救出来的。

  • Java – 赶到那里,找到巨龙,开发出一套由多个功能层组成的恶龙歼灭框架,写几篇关于这种框架的文章…但巨龙并没有被消灭掉。

  • .NET – 赶到哪里,看到了Java程序员的做法,完全拷贝过来,试图去杀掉巨龙,但巨龙把他吃掉了。

  • C - 赶到那里,对巨龙不屑一顾,举起剑,砍掉巨龙的头,找到公主…把公主晾在一边,去看看有没有最新提交的linux内核代码。

  • C++ – 先打造出一根针,然后在上面添加各种功能特征,直到最后汇聚成一把复杂的剑,这把剑复杂到只有他能理解其中的功能…杀死龙,但他过桥时遇到了麻烦,因为内存溢出了。

  • COBOL - 赶到那里,看到巨龙,认为自己太老了,杀不死这条巨龙,营救不出公主,于是离开了。

  • Pascal - 他花10年时间开发出一套巨龙歼灭系统…当战斗开始时,他发现这套系统只能关住蜥蜴。

  • VB - 使用各种组件开发出一套巨龙毁灭武器,他跳到巨龙的后面,在最关键的时刻,他发现这种武器只能在雨夜里工作…

  • PL/SQL – 分析其它屠龙者的数据,创建出具有多维数据、n向关系的数据表模型、OLAP,花15年时间分析这些数据…当结果出来时,公主已经变成了同性恋者。

  • Ruby - 盛大出征,号称自己不管做什么都是最强的,当面对巨龙,他亮出了一张画有他杀死一条瘸腿的巨龙的图片…巨龙懒洋洋的吃掉了他。

  • Smalltalk - 赶到那里,分析巨龙和公主,转身走了,它们是次要问题。

  • shell - 创造一个超级强大的灭龙武器…但当面对龙的时刻,他忘了如何使用它。

  • Assembler - 他认为他的方法是正确的,而且是最高效的…但他把D写成了A,杀死了公主。

  • Fortran - 赶到那里,开发出来一套4万5千行的解决方案,杀死巨龙,与公主见了面…但公主认为他是懦夫,反而倾心于高富帅的Java程序员。

  • FOX PRO - 开发出一套杀龙系统。外表看起来华丽好用,但实际内部到处补丁,所以,当开始运行这套杀龙武器时,他才发现忘了给DBF加索引。

  • Lisp:这是一位著名的游侠骑士,在跟很多的屠龙专家交谈后,将他们的技巧模型化,他开发出这套系统,当开始运行系统时,他认识到,他少写了一个括弧。

  • HTML: 用各种著名的杀龙的剑拼装成一个网页,但他忽视了W3C标准。在跟龙相遇的时刻,他发现他的代码跟浏览器不兼容,于是他变成了赤手空拳。巨龙把他当成小甜点吃了。

  • Prolog:
    他认为需要有一件杀龙的武器。于是在一个有182014件武器的目录里搜索。截止到公主死的那一年,他的成就包括:通晓了各种武器的制造方法,从索引A开
    始:Atomic Bombs, Anti-Air Weapons, Arches, Ammunition, Axes…

  • PHP: 开发出一个web网页,当这个运行时,它能通过一个Apache服务器从一个MySQL武器数据库里检索出武器消灭掉$dragon。然而,他在DELETE语句里忘了写WHERE语句,于是杀死了公主,巨龙,女侍,女巫,魔法师,和程序员自己。

  • JavaScript:
    他创建了脚本网页,当网页运行时,脚本会除掉巨龙,他一加载页面,一些美丽的少女就向他抛来了鲜花,发出来尖叫。不幸的是,他没有认真分析这个类似蜥蜴的
    怪物——也被称作Mozilla,他得到的只是让控制台里填满了error信息,《Book of Mozilla》记载了他是如何被吞掉的。

  • Basic:他开发出来一种能够杀死纸龙的武器,但不论他如何改进,他发现,他都不能杀死一只比卷毛狮子狗大的龙。

  • Matlab: 他写出循环语句能计算出用巨箭射死巨龙的弹道。这个程序运行的完美无瑕疵。现在需要的是人能有这样大的力量按这种精度发射这支巨箭。

原文:How to kill a dragon with various programming languages

disadvantaged or abused women
cartoon porn The Trial of Audrey Parker Review

as the board will ignite
pornoHow to Wear Bangle Bracelets this Fall
free hd porn
发表在 好文推荐 | 2 条评论

php下exif扩展对照片的支持

    exif是一个读取图片meta data的扩展,可以很好的读取相机拍摄的照片.

    支持以下方法:

    int exif_imagetype ( string $filename )    
    判断一个图像的类型。可能返回的值包括:IMAGETYPE_GIF,IMAGETYPE_JPEG,IMAGETYPE_PNG,IMAGETYPE_BMP等常量.
    
    if (exif_imagetype(“image.gif”) != IMAGETYPE_GIF) {
        echo “The picture is not a gif”;
    }
    
    
    array exif_read_data ( string $filename [, string $sections = NULL [, bool $arrays = false [, bool $thumbnail = false ]]] )
    从 JPEG 或 TIFF 图像文件中读取 EXIF 头信息。这样就可以读取数码相机产生的元数据.EXIF 头信息往往存在于数码相机生成的 JPEG/TIFF 图像中,但不幸的是每个数码相机制造商的标记都不同,因此(编写代码时)不能依赖于某个特定的 Exif 头信息
    
    $exif = exif_read_data(‘tests/test2.jpg’, 0, true);
    echo “test.jpg:<br />\n”;
    foreach ($exif as $key => $section) {
        foreach ($section as $name => $val) {
            echo “$key.$name: $val<br />\n”;
        }
    }
    
    结果类似如下:
    test.jpg:
    FILE.FileName: test2.jpg
    FILE.FileDateTime: 1017666176
    FILE.FileSize: 1240
    FILE.FileType: 2
    FILE.SectionsFound: ANY_TAG, IFD0, THUMBNAIL, COMMENT
    COMPUTED.html: width=”1″ height=”1″
    COMPUTED.Height: 1
    COMPUTED.Width: 1
    COMPUTED.IsColor: 1
    COMPUTED.ByteOrderMotorola: 1
    COMPUTED.UserComment: Exif test image.
    COMPUTED.UserCommentEncoding: ASCII
    COMPUTED.Copyright: Photo (c) M.Boerger, Edited by M.Boerger.
    COMPUTED.Copyright.Photographer: Photo (c) M.Boerger
    COMPUTED.Copyright.Editor: Edited by M.Boerger.
    IFD0.Copyright: Photo (c) M.Boerger
    IFD0.UserComment: ASCII
    THUMBNAIL.JPEGInterchangeFormat: 134
    THUMBNAIL.JPEGInterchangeFormatLength: 523
    COMMENT.0: Comment #1.
    COMMENT.1: Comment #2.
    COMMENT.2: Comment #3end
    THUMBNAIL.JPEGInterchangeFormat: 134
    THUMBNAIL.Thumbnail.Height: 1
    THUMBNAIL.Thumbnail.Height: 1

    
    
    string exif_tagname ( int $index )
    根据索引得到头信息名称
    
    echo “256: “.exif_tagname(256).PHP_EOL;
    echo “257: “.exif_tagname(257).PHP_EOL;
    
    输出:
    256: ImageWidth
    257: ImageLength
    
    
    
    string exif_thumbnail ( string $filename [, int &$width [, int &$height [, int &$imagetype ]]] )
    取得嵌入在 TIFF 或 JPEG 图像中的缩略图

    if (array_key_exists(‘file’,$_REQUEST)) {
        $image = exif_thumbnail($_REQUEST['file'], $width, $height, $type);
    } else {
        $image = false;
    }
    if ($image!==false) {
        header(“Content-type: “.image_type_to_mime_type($type));
        echo $image;
        exit;
    } else {
        // no thumbnail available, handle the error here
        echo “No thumbnail available”;
    }

If totes are your style then Belvah has just the thing for you
snooki weight loss Refurbished but Authentic Chanel Designer Handbags especially for winter and fall

clothing became very elaborate and showy
quick weight lossSuperheroes save summer box office
free hd porn
发表在 网站开发 | 标签为 | 2 条评论

程序员养生

how to melt household leather hiking footwear
weight loss tips Tracking Your Online Shopping With Your Account

Kelly has a lot to say on the subject of well fitting clothes
snooki weight lossDaytime Emmys 2014 fashion recap
free porn sites
发表在 福利分享 | 2 条评论