<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[高一鹏的博客]]></title> 
<link>http://www.gaoolp.com/</link> 
<description><![CDATA[高一鹏的个人博客]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[高一鹏的博客]]></copyright>
<item>
<link>http://www.gaoolp.com/read.php/318.htm</link>
<title><![CDATA[Function ereg() is deprecated Error 错误解决方案大全【转】]]></title> 
<author>gaoolp &lt;gaoolp@126.com&gt;</author>
<category><![CDATA[php]]></category>
<pubDate>Mon, 20 Feb 2012 03:38:29 +0000</pubDate> 
<guid>http://www.gaoolp.com/read.php/318.htm</guid> 
<description>
<![CDATA[ 
	<p>在php5.3.0后的版本，取消了对ereg函数的支持，惹得若干程序需要改动，譬如我安装的zen-card1.3.8，颇不方便。</p><p>错误：<br /><strong>Deprecated</strong>: Function ereg() is deprecated in &hellip;&hellip;</p><p>解决方法一：<br />退回去用php5.2。（众人皆赞道：果是好法子！）</p><p>解决方法二：<br />继续用php5.3，但是修改devel/devel.modul的460行：<br />if ($errno &amp; (E_ALL &amp; ~E_NOTICE &amp; ~E_DEPRECATED)) &#123;<br />把丫deprecated错误给忽略掉。（众人皆又赞道：果&hellip;&hellip;果&hellip;&hellip;果是好法子！）</p><p>解决方法三：<br />动程序鸟，把ereg换成preg_match，ereg_replace也需得换成preg_replace。只得注意的是<br />ereg(&rsquo;^[0-9]&lsquo;&nbsp;&nbsp;&nbsp; 需修改成&nbsp;&nbsp; preg_match(&rsquo;/^[0-9]/&lsquo;)<br />无敌//必须加，哈哈。（众人皆俯首赞道：王道也！）</p>
]]>
</description>
</item><item>
<link>http://www.gaoolp.com/read.php/317.htm</link>
<title><![CDATA[回车（r）换行（n）的区别]]></title> 
<author>gaoolp &lt;gaoolp@126.com&gt;</author>
<category><![CDATA[web技术]]></category>
<pubDate>Sun, 29 Jan 2012 02:08:39 +0000</pubDate> 
<guid>http://www.gaoolp.com/read.php/317.htm</guid> 
<description>
<![CDATA[ 
	[转]<br />Windows 采用 &#92;r&#92;n 是有原因的，Windows 采用了传统的英文打字机的模式。<br /><br />想想看英文打字机是如何换行的呢？英文打字机是选择将小车退回至起点，<br />这个过程称为回车（carriage return, CR），随后把小车调至下一行的位<br />置，这个过程称为换行（line feed, LF），这样就完成了英文打字机中换<br />行过程。<br /><br />回车（CR）在计算机中使用 ASCII 为 13 的字符来表示，换行（LF）使用<br />ASCII 为 10 的字符来表示。这也就是 Windows 的换行采用 &#92;r&#92;n 来表示<br />的原因。<br />
]]>
</description>
</item><item>
<link>http://www.gaoolp.com/read.php/316.htm</link>
<title><![CDATA[养生：肉类的这几个部位千万不能吃]]></title> 
<author>gaoolp &lt;gaoolp@126.com&gt;</author>
<category><![CDATA[养生]]></category>
<pubDate>Wed, 11 Jan 2012 03:12:52 +0000</pubDate> 
<guid>http://www.gaoolp.com/read.php/316.htm</guid> 
<description>
<![CDATA[ 
	核心提示：肉类是我们生活中必不可少的食物，而动物身上大部分的部位都能够用于食用，不过有些部位是你如何也不能吃的，否则容易生出健康问题。 <div><span style="font-size: small"><br /></span></div><div><img src="http://imgs.fetionpic.com/web/20120110/f9dc9b1f-8ab4-4e96-abe8-3d322615d31f.jpg" border="0" width="550" height="380" /></div><div><span style="font-size: small"><br /></span></div><div><span style="font-size: small">&nbsp; &nbsp; 1、鱼&ldquo;黑衣&rdquo;不能吃：</span></div><div><span style="font-size: small"><br /></span></div><div><span style="font-size: small">&nbsp; &nbsp; 鱼体腹腔两侧有一层黑色膜衣，是最腥臭、泥土味最浓的部位，含有大量的类脂质、溶菌酶等物质。</span></div><div><span style="font-size: small"><br /></span></div><div><span style="font-size: small">&nbsp; &nbsp; 2、禽&ldquo;尖翅&rdquo;不能吃：</span></div><div><span style="font-size: small"><br /></span></div><div><span style="font-size: small">&nbsp; &nbsp; 鸡、鸭、鹅等禽类屁股上端长尾羽的部位，学名&ldquo;腔上囊&rdquo;，是淋巴腺体集中的地方，因淋巴腺中的巨噬细胞可吞食病菌和病毒，即使是致癌物质也能吞食，但不能分解，故禽&ldquo;尖翅&rdquo;是个藏污纳垢的&ldquo;仓库&rdquo;。</span></div><div><span style="font-size: small"><br /></span></div><div><span style="font-size: small">&nbsp; &nbsp; 3、猪脖子的肉疙瘩不能吃：</span></div><div><span style="font-size: small"><br /></span></div><div><span style="font-size: small">&nbsp; &nbsp; 食用时应易除猪脖子等处灰色、黄色或暗红色的肉疙瘩，即称为肉枣的东西，因为这些地方含有很多病菌和病毒，若食用则易感染疾病。</span></div><div><span style="font-size: small"><br /></span></div><div><span style="font-size: small">&nbsp; &nbsp; 4、鸡头不能吃：</span></div><div><span style="font-size: small"><br /></span></div><div><span style="font-size: small">&nbsp; &nbsp; 我国有句民谚：十年鸡头胜砒霜。为何鸡越老，鸡头毒性就越大呢？医学专家分析，其原因是鸡在啄食中会吃进有害的重金属物。</span></div><div><span style="font-size: small"><br /></span></div><div><span style="font-size: small">&nbsp; &nbsp; 5、鸡脖不能吃：</span></div><div><span style="font-size: small"><br /></span></div><div><span style="font-size: small">&nbsp; &nbsp; 鸡脖鸭脖不要吃皮，也不要吃到气管。这里面都含有大量的高胆固醇，所以最好不要吃这些部位。</span></div><div><span style="font-size: small"><br /></span></div><div><span style="font-size: small">&nbsp; &nbsp; 6、畜&ldquo;三腺&rdquo;不能吃：</span></div><div><span style="font-size: small"><br /></span></div><div><span style="font-size: small">&nbsp; &nbsp; 猪、牛、羊等动物体上的甲状腺、肾上腺、病变淋巴腺是三种&ldquo;生理性有害器官&rdquo;。</span></div><div><span style="font-size: small"><br /></span></div><div><span style="font-size: small">&nbsp; &nbsp; 7、羊&ldquo;悬筋&rdquo;：</span></div><div><span style="font-size: small"><br /></span></div><div><span style="font-size: small">&nbsp; &nbsp; 羊&ldquo;悬筋&rdquo;(又称&ldquo;蹄白珠&rdquo;)，一般为圆珠形、串粒状，是羊蹄内发生病变的一种组织。</span></div><div><span style="font-size: small"><br /></span></div><div><span style="font-size: small">&nbsp; &nbsp; 8、兔&ldquo;臭腺&rdquo;不能吃：</span></div><div><span style="font-size: small"><br /></span></div><div><span style="font-size: small">&nbsp; &nbsp; 位于外生殖器背面两侧皮下的白鼠鼷腺，紧挨着白鼠鼷腺的褐色鼠鼷腺的褐色和位于直肠两侧壁上的直肠腺，味极腥臭，食用时若不除去，则会使兔肉难以下咽。</span></div>
]]>
</description>
</item><item>
<link>http://www.gaoolp.com/read.php/315.htm</link>
<title><![CDATA[中文地址的翻译原则]]></title> 
<author>gaoolp &lt;gaoolp@126.com&gt;</author>
<category><![CDATA[科普知识]]></category>
<pubDate>Tue, 09 Aug 2011 02:16:42 +0000</pubDate> 
<guid>http://www.gaoolp.com/read.php/315.htm</guid> 
<description>
<![CDATA[ 
	<div class="pb5">中文地址的翻译原则 <br /><br />中文地址的排列顺序是由大到小，如：Ｘ国Ｘ省Ｘ市Ｘ区Ｘ路Ｘ号，而英文地址则刚好相反，是由小到大。如上例写成英文就是：Ｘ号，Ｘ路，Ｘ区，Ｘ市，Ｘ省，Ｘ国。掌握了这个原则，翻译起来就容易多了！ <br />Ｘ室　　Room　Ｘ <br />Ｘ号　　No.　Ｘ <br />Ｘ单元　Unit　Ｘ <br />Ｘ号楼　Building No.　Ｘ <br />Ｘ街　　Ｘ　Street <br />Ｘ路　　Ｘ　Road <br />Ｘ区　　Ｘ　District <br />Ｘ县　　Ｘ　County <br />Ｘ镇　　Ｘ　Town <br />Ｘ市　　Ｘ　City <br />Ｘ省　　Ｘ　Province <br />请注意：翻译人名、路名、街道名等，最好用拼音。 <br />中文地址翻译范例： <br />宝山区示范新村37号403室 <br />Room 403, No. 37, SiFang Residential Quarter, BaoShan District <br />虹口区西康南路125弄34号201室 <br />Room 201, No. 34, Lane 125, XiKang Road(South), HongKou District <br />473004河南省南阳市中州路42号 李有财 <br />Li Youcai <br />Room 42 <br />Zhongzhou Road, Nanyang City <br />Henan Prov. China 473004 <br />434000湖北省荆州市红苑大酒店 李有财 <br />Li Youcai <br />Hongyuan Hotel <br />Jingzhou city <br />Hubei Prov. China 434000 <br />473000河南南阳市八一路272号特钢公司 李有财 <br />Li Youcai <br />Special Steel Corp. <br />No. 272, Bayi Road, Nanyang City <br />Henan Prov. China 473000 <br />528400广东中山市东区亨达花园7栋702 李有财 <br />Li Youcai <br />Room 702, 7th Building <br />Hengda Garden, East District <br />Zhongshan, China 528400 <br />361012福建省厦门市莲花五村龙昌里34号601室 李有财 <br />Li Youcai <br />Room 601, No. 34 Long Chang Li <br />Xiamen, Fujian, China 361012 <br />361004厦门公交总公司承诺办 李有财 <br />Mr. Li Youcai <br />Cheng Nuo Ban, Gong Jiao Zong Gong Si <br />Xiamen, Fujian, China 361004 <br />266042山东省青岛市开平路53号国棉四厂二宿舍1号楼2单元204户甲 李有财 <br />Mr. Li Youcai <br />NO. 204, A, Building NO. 1 <br />The 2nd Dormitory of the NO. 4 State-owned Textile Factory <br />53 Kaiping Road, Qingdao, Shandong, China 266042 <br /><br /><br />中国地名英译的几点注意事项 <br /><br />地名是历史的产物，是国家领土主权的象征，是日常生活的向导，是社会交往的媒介。在信息化社会中，地名在国际政治、经济、外交、外贸、科技、文化交流、新闻出版以及社会生活方面都起着非常重要的作用。 <br />用汉语拼音字母拼写中国地名，不仅是中国的统一标准，而且是国际标准，全世界都要遵照使用。根据笔者英译中国地名的体会，本文拟谈谈中国地名英译的几点注意事项，供译者和读者参考。 <br />一、专名是单音节的英译法 <br />专名是单音节，通名也是单音节，这时通名应视作专名的组成部分，先音译并与专名连写，后重复意译，分写（汉字带点的字是通名，英语的画线部分是音译；括号内为该地所在省、市、地区或县，下同）例如： <br />1、恒山 Hengshan Mountain （山西） <br />2、淮河 the Huaihe River （河南、安徽、江苏） <br />3、巢湖 the Chaohu Lake （安徽） <br />4、渤海 the Bohai Sea （辽宁、山东） <br />5、韩江 the Hanjiang River （广东） <br />6、礼县 Lixian County （甘肃陇南地区） <br />二、通名专名化的英译法 <br />通名专名化主要指单音节的通名，如山、河、江、湖、海、港、峡、关、岛等，按专名处理，与专名连写，构成专名整体（汉语带点的字和英语的画线部分即为通名专名化）。例如： <br />1、都江堰市 Dujiangyan City （比较： the Dujiang Weir）（四川） <br />2、绥芬河市 Suifenhe City （比较：the Suifen River）（黑龙江） <br />3、白水江自然保护区 Baishuijiang Nature Reserve（比较：the baishui river）（甘肃） <br />4、青铜峡水利枢纽 Qingtongxia Water Control Project（比较：the Qingtong Gorge）（宁厦） <br />5、武夷山自然保护区 Wryishan Nature Reserve（比较：Wuyi Mountain）（福建） <br />6、西湖区风景名胜区 Scenic Spots and Historic Sites of Xihu（比较：the West lake）（浙江杭州） <br />三、通名是同一个汉字的多种英译法 <br />通名是单音节的同一个汉字，根据意义有多种不同英译法，在大多数情况下，这些英译词不能互相代换。例如： <br />1、山 <br />1）mount：峨眉山 Mount Emei（四川峨眉） <br />2）mountain：五台山Wutai Mountain（山西） <br />3）hill：象鼻山 the Elephant Hill（广西桂林） <br />4）island：大屿山 Lantau Island（香港） <br />5）range：念青唐古拉山 the Nyainqentanglha Range（西藏） <br />6）peak：拉旗山 Victoria Peak（香港） <br />7）rock：狮子山 Lion Rock（香港） <br />2、海 <br />1）sea：东海，the East China Sea <br />2）lake：邛海the Qionghai Lake（四川西昌） <br />3）horbour：大滩海Long Harbour（香港） <br />4）port：牛尾海Port Shelter（香港） <br />5）forest：蜀南竹海the Bamboo Forest in Southern Sichuan(四川长岭) <br />在某些情况下，根据通名意义，不同的汉字可英译为同一个单词。例如：&ldquo;江、河、川、水、溪&rdquo;英译为river。 <br />1、嘉陵江 the Jialing River（四川） <br />2、永定河 the Yongding River （河北、北京、天津） <br />3、螳螂川 the Tanglang River（云南） <br />4、汉水 the Hanshui River（陕西、湖北） <br />5、古田溪 the Gutian River（福建） <br />四、专名是同一个汉字的不同英译法 <br />专名中同一个汉字有不同的读音和拼写，据笔者不完全统计，地名中这样的汉字有七八十个之多，每个字在地名中的读音和拼写是固定的，英译者不能一见汉字就按语言词典的读音和拼写翻译，而只能按中国地名词典的读音和拼写进行翻译（画线部分为该字的读音和拼写）。例如： <br />1、陕 <br />陕西省 Shaanxi Province <br />陕县Shanxian County(河南) <br />2、洞 <br />洞庭湖the Dong Lake（湖南） <br />洪洞县Hongtong County（山西） <br />3、六 <br />六合县Luhe County（江苏） <br />六盘水市Liupanshui City（贵州） <br />4、荥 <br />荥阳市Xingyang City（河南） <br />荥经县Yingjing County（四川雅安地区） <br />5、林 <br />林甸县 Lindian County（黑龙江大庆市） <br />林芝地区 Nyingchi Prefecture（西藏） <br />林周县Lhunzhub County（西藏拉萨市） <br />米林县Mainling County（西藏林芝地区） <br />6、扎 <br />扎赉特旗Jalaid Banner（内蒙古兴安盟） <br />扎兰屯市Zalantun City（内蒙古呼伦贝尔盟） <br />扎囊县Chanang County（西藏山南地区） <br />扎龙自然保护区Zhalong Nature Reserve（黑龙江齐齐哈尔市） <br />扎达县Zanda County(西藏阿里地区) <br />扎陵湖the Gyaring Lake（青海） <br />五、专名是同样汉字的多种英译法 <br />专名中的汉字是相同的，但表示不同的地点，每个地点的读音和拼写是固定的，应按&ldquo;名从主人&rdquo;的原则译写，不能按普通语言词典，而必须按中国地名词典英译。例如： <br />1、浍河 <br />1）the Huihe River （河南、安徽） <br />2）the Kuaihe River（山西） <br />2、阿克乔克山 <br />1）Akqoka Mountain （新疆昭苏县） <br />2）Akxoki Mountain (新疆塔城市） <br />3、色拉寺 <br />1）the Sera Monastery（西藏拉萨市） <br />the Sula Temple（四川色达） <br />4、单城镇 <br />1）Dancheng Town(黑龙江双城县） <br />2）Shancheng Town（山东单县） <br />5、阿扎乡 <br />1)Arza Township（西藏嘉黎县） <br />2)Ngagzha Township（西藏扎囊县） <br />3）Ngarzhag Township（西藏浪卡子县） <br />6、柏城镇 <br />1)Bocheng Town（山东高密市） <br />2)Baicheng Town（河南西平县） <br />六、中国各民族名称的罗马字母拼写法 <br />1991 年8月30日，国家技术监督局批准了《中国各民族名称的罗马母拼法和代码》（GB3304?1），该标准适用于文献工作、拼音电报、国际通讯、出版、新闻 报导、信息处理和交换等方面，当然也适用于英译。特别值得一提的是，虽然汉字书写的民族名称有&ldquo;族&rdquo;字，但罗马字母拼写法无&ldquo;zu&rdquo;字的拼写，英译照抄， 首字母大写（见附录：中国各民族名犯法的罗马字母拼写法）。例如： <br />1、双江拉祜族佤族布朗族傣族自治县 <br />Lahu-Va-Blang-Dai Autonomous County of Shuangjiang(云南临沧地区) <br />2、贡山独龙族怒族自治县 <br />Derung-Nu Autonomous County Gongshan（西南怒江） <br />3、湘西土家族苗族自治州 <br />Tujia-Miao Autonomous Prefecture of Xinangxi（湖南） <br />4、金秀瑶族自治县Yao Autonomous County of Jinxiu（广西柳州地区） <br />此外，朝族和藏族的罗马字母拼写法，对外分别使用Korean和Tibetan例如： <br />5、延边朝鲜族自治州 <br />Korean Autonomous Prefecture of Yanbian（吉林） <br />6、甘孜藏族自治州 <br />Tibetan Autonomous Prefecture of Garze（四川） <br />需要指出的是，如果专指&ldquo;XX族&rdquo;通常就要译出&ldquo;族&rdquo;字。例如： <br />回族the Hui nationality( 或the Huis) <br />彝族the Yi nationality(或the Yis) <br />藏族the Zang (Tibetan) nationality(或the Zangs,the Tibetans) <br />但是，如果作形容词修饰名词，则又可省略&ldquo;族&rdquo;字。例如：维吾尔族医学Uygur medicine 彝族人the Yi people <br />七、以人名命名的地名英译法 <br />以人名命名的地名英译，人名的姓和名连写，人名必须位置，通名后置，不加定冠词。这种译法多用于自然地理实全地名，但有例外。例如： <br />1、张广才岭Zhangguangcai Mountain（吉林、黑龙江） <br />2、欧阳海水库存 Ouyanghai Reservoir（湖南桂阳） <br />3、郑和群礁 Zhenghe Reefs（湖南南沙群岛） <br />4、李准滩Lizhun Bank （海南南沙群岛） <br />5、鲁班暗沙 （海南中沙群岛） <br />6、左权县 （山西晋中地区） <br />7、武则天明堂 （河南洛阳） <br />如果以人名命名的非自然地理实体地名，姓和名分写，人名前置或后置按习惯用法，大致有以下三种译法： <br />1、人名+通名 <br />黄继光纪念馆Huang Jiguang Memorial（四川中江县） <br />2、人名&rsquo;S+通名 <br />中山陵墓Sun Yat-sen&rsquo; s Mausoleum（江苏南京市） <br />3、the+通名+of人名 <br />昭君墓the Tomb of Wang Zhaojun（内蒙古呼和浩特市） <br />八、少数民族语地名的记音用加符字母 <br />地名记音的时个符号可以加在特定的字母上面，代表特殊语音。蒙古语、维吉尔语和藏语音译转写的汉语拼音字母有无符和加符并列的，一般拼写用无符字母，地名记音用加符字母。例如： <br />乌鲁木齐市Urumqi City（新疆） 巩乃斯河Kunse River（新疆新源） 察隅县Zayu County（西藏林芝地区） <br />改则县 Gerze County（西藏阿里地区） 德格县Dege County（四川甘孜） 甘德县Gade County （青海果洛） <br />九、地名中的符事情不能省略 <br />地名中的符号如果省略就会造成读音甚至语义错误。地名中有两种符号不能省略。 <br />I，a，o，e开头的音节连接在其他音节后面的时候，如杲音节的界限委生混淆，用隔音符号，地名中的隔音符号不能省略。例如： <br />1）（陕西）西安市Xi&rsquo;an City（如果省略隔音符号，就成为Xian，可以读成仙、先、现、限、鲜、险、县等） <br />2）（广西）兴安县Xing&rsquo;an County（如果省略隔音符号，就成为Xingan County 新干县，在江西吉安地区） <br />3）建瓯市Jian&rsquo;ou City（福建） <br />4）第二松花江the Di&rsquo;er Songhua River（吉林） <br />5）东阿县Dong&rsquo;e County（山东聊城市） <br />6）天峨县Tian&rsquo;e County（广西河池地区） <br />2、汉语拼音U行的韵母跟声母n，l拼的时候，U上面的两点不能省略。如果省略，就会造成误解。例如： <br />1、（山西）闾河the Luhe River（如果省略U上面的两点，就变成the Luhe River 芦河、在江西） <br />2、（台湾）绿岛Ludao Island（如果省略U上面的两点，就变成Ludao Island 鹭岛，在黑龙江海林） <br />3、女山湖the Nushan Lake（安徽嘉山） <br />4、吕梁地区Luliang Prefecture（山西） <br />5、旅顺港Lushun Port（辽宁） <br />但是也有例外。例如： <br />绿春县Luchun County（云南红河） 绿曲县Luqu County（甘肃甘南） <br /><br /><br /><br />中国地址英文翻译入门篇 <br /><br />第一部分、中国地址翻译单项讲座 <br />***室 / 房 Room *** <br />***村 *** Vallage <br />***号 No. *** <br />***号宿舍 *** Dormitory <br />***楼 / 层 *** /F <br />***住宅区 / 小区：*** Residential Quater／Community <br />甲／乙／丙／丁或者A ／B／C／D ***巷 / 弄：Lane *** <br />***单元：Unit *** <br />***号楼 / 栋：*** Building <br />***公司：***Com.／*** Crop／***CO.LTD <br />***厂：*** Factory <br />***酒楼/酒店：*** Hotel <br />***路：*** Road <br />***花园：*** Garden <br />***街：*** Stree <br />***信箱：Mailbox *** <br />***区：*** District <br />***县：*** County <br />***镇：*** Town <br />***市：*** City <br />***省：*** Prov. <br />***院：***Yard <br />***大学：***College <br /><br />实例 <br />201室: Room 201 <br />12号: No.12 <br />2单元: Unit 2 <br />3号楼: Building No.3 <br />长安街: Chang An street <br />南京路: Nanjing road <br />长安公司: Chang An Company <br />宝山区: BaoShan District <br />赵家酒店: ZhaoJia hotel <br />钱家花园: Qianjia garden <br />孙家县: Sunjia county <br />李家镇: Lijia town <br />广州市: Guangzhou city <br />广东省: Guangdong province <br /><br />第二部分、地址翻译实例： <br />宝山区南京路12号3号楼201室 <br />Room 201, Building No.3, No.12, Nanjing Road，BaoShan District <br />如果地方不够可以将3号楼201室写成：3-201 <br /><br />宝山区示范新村37号403室 <br />Room 403, No.37, SiFan Residential Quarter, BaoShan District <br /><br />中华人民共和国民政部政策研究中心北京河沿大街147号 <br />No.147# HeiYian Street the policy center of civil administration <br />department the People&rsquo;Republic of China <br /><br />虹口区西康南路125弄34号201室 <br />Room 201,No.34,Lane 125,XiKang Road(South),HongKou District <br /><br />北京市崇文区天坛南里西区20楼3单元101 <br />Room 3-101 building No.20,TianTan-NanXiLi Residential ChongWen <br />District BeiJing City <br /><br />江苏省扬州市宝应县泰山东村102栋204室 <br />Room 204 building No.102, East TaiShan Residential BaoYin County <br />JiangSu Province <br /><br />473004河南省南阳市中州路42号 周旺财 <br />Zhou Wangcai <br />Room 42， <br />Zhongzhou Road，Nanyang City， <br />Henan Prov.China 473004 <br /><br />中国四川省江油市川西北矿区采气一队 <br />1 Team CaiQi ChuanXiBei Mining Area JiangYou City SiChuan Province <br />China <br /><br />中国河北省邢台市群众艺术馆 <br />The Masses Art Centre XinTai City HeBei Prov.China <br /><br />江苏省吴江市平望镇联北村七组 <br />7 Group LiBei Village PingWang Town WeJiang City JiangSu Province <br /><br />434000湖北省荆州市红苑大酒店 周旺财 <br />Zhou Wangcai <br />Hongyuan Hotel, <br />Jingzhou city, <br />Hubei Prov. China 434000 <br /><br />473000河南南阳市八一路272号特钢公司 周旺财 <br />Zhou Wangcai <br />Special Steel Corp，No.272， <br />Bayi Road，Nanyang City， <br />Henan Prov. China 473000 <br /><br />528400广东中山市东区亨达花园7栋702 周旺财 <br />Zhou Wangcai <br />Room 702, 7th Building, <br />Hengda Garden, East District, <br />Zhongshan, China 528400 <br /><br />361012福建省厦,雨水砸在窗口上的铁罩，紧凑又零乱地打击。我收下衣物，挂在卧室客厅的衣橱里，每件衣服都隔着一定距离，并且，保持门市莲花五村龙昌里34号601室 周旺财 <br />Zhou Wangcai <br />Room 601, No.34 Long Chang Li, <br />Xiamen, Fujian, China 361012 <br /><br />361004厦,雨水砸在窗口上的铁罩，紧凑又零乱地打击。我收下衣物，挂在卧室客厅的衣橱里，每件衣服都隔着一定距离，并且，保持门公交总公司承诺办 周旺财 <br />Mr. Zhou Wangcai <br />Cheng Nuo Ban, Gong Jiao Zong Gong Si <br />Xiamen, Fujian, China 361004 <br /><br />266042山东省青岛市开平路53号国棉四厂二宿舍1号楼2单元204户甲周旺财 <br />Mr. Zhou Wangcai <br />NO. 204, A, Building NO. 1, <br />The 2nd Dormitory of the NO. 4 State-owned Textile Factory, <br />53 Kaiping Road, Qingdao, <br />Shandong, China 266042 <br /><br /><br /><br />名片英语之地址英译 <br /><br />1、地址综述名片的主要功能是通联，所以在名片上写上详细的家庭或单位通讯地址是必不可少的。如下例：住址：浙江省台州市黄岩区天长路18号201 室翻译成英文就是：Address: Room 201, 18 Tianchang Road, Huangyan District, Taizhou City, Zhejiang Province.对照上例，翻译时有几点需要注意：中文地址的排列顺序是由大到小：&times;国&times;省&times;市&times;区&times;路&times;号，而英文地址则刚好相反，是由小到大：&times;号 &times;路（Road），&times;区(District)，&times;市(City)，&times;省(Province)，&times;国。 <br /><br />地名专名部分（如&rdquo;黄岩区&rdquo;的&rdquo;黄岩&rdquo;部分）应使用汉语拼音，且需连写，如Huangyan不宜写成 Huang Yan。各地址单元间要加逗号隔开。 <br /><br />以上给出了地点翻译的书写规则。接下去就地址内容进行详细分析。 <br /><br />完整的地址由：行政区划＋街区名＋楼房号三部分组成。 <br /><br />2、行政区划英译行政区划是地址中最高一级单位，我国幅员辽阔，行政区划较复杂，总体上可分成五级(括号内所注为当前国内通用译名)： <br />1)国家（State）：中华人民共和国（the People&rsquo;s Republic of China； P.R.China； P.R.C； China） <br />2)省级（Provincial Level）:省(Province)、自治区(Autonomous Region )、直辖市(Municipality directly under the Central Government,简称Municipality)；特别行政区（Special Administration Region； SAR） <br />3)地级（Prefectural Level）:地区(Prefecture)、自治州(Autonomous Prefecture)、市（Municipality；City）；盟（Prefecture）； <br />4)县级（County Level）：县（County）、自治县（Autonomous County）、市（City）、市辖区（District）,旗（County） <br />5)乡级（Township Level）：乡（Township）、民族乡(Ethnic Township)、镇(Town)、街道办事处（Sub-district）。 <br /><br />应用举例： <br /><br />(1)上海市崇明县中兴镇：Zhongxing Town, Chongming County, Shanghai (Municipality). <br /><br />(2)内蒙古自治区呼伦贝尔盟：Hulunbeir Prefecture，Inner Mongolia Autonomous Region. <br /><br />(3)浙江省台州市玉环县龙溪乡：Longxi Township, Yuhuan County, Taizhou Municipality, Zhejiang Province. <br /><br />(4)苏州市金阊区金门街道：Jinmen Sub-district, Jinchang District, Suzhou City. <br /><br />略写和缩写 <br /><br />1）中国人写地址喜欢将省或市等都一一注明，但按英语习惯，则可以省略；况且，省一级及较大的市大家都熟知，其后的行政区域通名完全可以略去而不致引起理解困难；如果需要进一步简化，则以此类推，可将一些县甚至镇的区域名也省掉。 <br /><br />如：中国浙江省杭州市余杭区&times;&times;乡 <br /><br />&times;&times;Township, Yuhang, Hangzhou, Zhejiang, P.R.C. <br /><br />2）在地址中间可直接插入邮编。 <br /><br />我国的通行写法是将邮政编码另起一行，前面标上&rdquo;邮编（Postal Code； Zip； P.C.）&rdquo;两字，但英美各国的惯例却是将邮编直接写在州或城市的后面，如：美国：1120 Lincoln Street, Denver, CO 80203，USA（中译：美国科罗拉多州丹佛市林肯街第1120号，邮编：80203）注：CO是美国Colorado州的缩写，在跟邮政编码合用时， 州名一般均以缩写形式出现。 <br /><br />英国：60 Queen Victoria Street， London EC4N 4TW（中译：伦敦维多利亚女王大街60号，邮编：EC4N 4TW）由此，笔者提议，我们的地名如果也参照英美各国的方法，将邮编插入到地址中间，可以节省大量空间。 <br /><br />如：中国浙江省台州市黄椒路102号，邮编：318020，102 Huangjiao Road, Taizhou, Zhejiang 318020,China。 <br /><br />3、省市缩写由于有了邮编，所以城市或省的专名也可采用缩写而不会造成混乱，除了香港（Hong Kong HK）、澳门（Macao MO）、台湾（Taiwan TW），我国大陆各省一直没有广泛认同的英文缩写。可喜的是，为扩展互联网域名资源，信息产业部于二○○二年十一月二十二日发布了《关于中国互联网络域名体系公告》，公告中首次开放行政区域类二级国内域名，给全国34个省（市、自治区、特别行政区）规定了二个字母的代码；笔者认为，随着互联网的深入发展，该代码将自然而然地成为各省区的缩写名称，可以放心使用；信息产业部采用的代码与英译名缩写基本上吻合，只有内蒙古（英译：Inner Mongolia,缩写：IM,而信息部的代码是利用了纯汉语拼音，为NM）、西的衣物，其中一件淡绿细直纹短袖我最喜欢。之前两天它都区别其它的短袖，单件掺着洗衣粉放在红色小塑料桶浸泡，现在应藏（英译：Tibet,而二级域名使用的仍是汉语拼音XZ）两个词出现不协调现象，但这并不影响该缩写系统的推广。 <br /><br />应用举例： <br /><br />中国河北省石家庄市桥东区胜利北大街2号，邮编: 050021，2 North Shengli Avenue, Qiaodong District, Shijiazhuang City, HE050021, P.R.C. <br /><br />4、村居街道的英译居于地址体系的中间位置的是一些传统的村居街道及新兴的各种小区、新村、工业区等，其中&rdquo;村（委会）&rdquo;、&rdquo;居（委会）&rdquo;既是区域名称，又是行政体系的基层组织名称。 <br /><br />5、楼房室号的表达地址的最低一级涉及到对具体场所的命名及房号的标注。如：5幢302室、3号楼2单元102室。 <br /><br />这里的&rdquo;幢&rdquo;、&rdquo;栋&rdquo;、&rdquo;&hellip;号楼&rdquo;实际上是同一回事，一般均以Building&hellip;来表示；&rdquo;室&rdquo;一般译作Room或Suite。 <br /><br />上述两例可分别译成：Suite 302, Building 5；Room 102, Unit 2, Building 3。 <br /><br />此外，在这一级地址中还经常出现诸如&rdquo;单元&rdquo;、&rdquo;&hellip;大厦&rdquo;、&rdquo;&hellip;层&rdquo;等术语. <br /><br />应用举例：东一办公楼五层1－3室，Rm. 1-3, 5/F, Office Building E1。 <br /><br />注①：Suite :套房，即a connected series of rooms to be used together(Webster&rsquo;s )。Room：A portion of space within a building or other structure, separated by walls or partitions From other parts。Suite往往由多个room组成，如a three room suite。目前我们普遍使用的几号室（房），往往都是套房，故我们在翻译房号时，不能为其后缀是&rdquo;房&rdquo;或&rdquo;室&rdquo;所左右，应尽量根据实际情况选择 suite或room。 <br /><br />举一个英国地址为例： <br /><br />Address:Suite 13, Unit 2, Hendy Industrial Estate, Pontardulais. <br /><br />可知：江苏省丹阳市丁巷48弄3号 <br />No.3,Lane 48,DanYang City,JiangSu Prov.,China <br /><br /></div><div class="twsj">公司的译法 <br /><br />1. line(s) （轮船、航空、航运等）公司 <br />Atlantic Container Line大西洋集装箱海运公司 <br />Hawaiian air Lines 夏威夷航空公司 <br /><br />2. agency 公司、代理行 <br />The Austin advertising Agency 奥斯汀广告公司 <br />China Ocean Shipping Agency 中国外轮代理公司 <br /><br />3. store(s) 百货公司 <br />Great Universal Store 大世界百货公司（英） <br />Tesco Stores (Holdings) 坦斯科百货公司（英） <br /><br />4. associates（联合）公司 <br />British Nuclear Associates 英国核子联合公司 <br />Subsea equipment Associates Ltd.海底设备联合有限公司（英、法、美合办） <br /><br />5. system（广播、航空等）公司 <br />Mutual Broadcasting System相互广播公司（美） <br />Malaysian Airline System Bhd.马来西亚航空公司 <br /><br />6. office公司，多与 head, home, branch等词连用 <br />3M China Limited Guangzhou Branch Office 3M中国有限公司广州分公司 <br />China Books Import and Export Corporation (Head Office) 中国图书进出口总公司 <br /><br />7. service(s)（服务）公司 <br />Africa-New Zealand Service 非洲&mdash;新西兰服务公司 <br />Tropic Air Services特罗皮克航空公司 <br /><br />8. exchange <br />American Manufacturers Foreign Credit Insurance Exchange 美国制造商出口信用保险公司 <br /><br /><br />9. center <br />Binks (Shanghai) Engineering Exhibition Center, Ltd. <br />宾克斯（上海）涂装工程设备展示有限公司 <br /></div>
]]>
</description>
</item><item>
<link>http://www.gaoolp.com/read.php/314.htm</link>
<title><![CDATA[param标签 AllowScriptAccess 属性用法详解]]></title> 
<author>gaoolp &lt;gaoolp@126.com&gt;</author>
<category><![CDATA[web技术]]></category>
<pubDate>Tue, 09 Aug 2011 01:57:57 +0000</pubDate> 
<guid>http://www.gaoolp.com/read.php/314.htm</guid> 
<description>
<![CDATA[ 
	&lt;param&nbsp;name=&quot;allowScriptAccess&quot;&nbsp;value=&quot;sameDomain&quot;&nbsp;/&gt;<br />&nbsp;<br />&nbsp;&nbsp; AllowScriptAccess 参数说明：<br />&nbsp;&nbsp;&nbsp; always 允许随时执行脚本操作。<br />&nbsp;&nbsp;&nbsp; never 禁止所有脚本执行操作。<br />&nbsp;&nbsp;&nbsp; samedomain 只有在 Flash 应用程序来自与 HTML 页相同的域时才允许执行脚本操作。<br /><br /><p>&nbsp;&nbsp;&nbsp; 使用 allowscriptaccess 使 Flash 应用程序可与其所在的 HTML 页通信。此参数是必需的，因为 fscommand() 和 getURL() 操作可能导致 JavaScript 使用 HTML 页的权限，而该权限可能与 Flash 应用程序的权限不同。这与跨域安全性有着重要关系。</p><p>&nbsp;&nbsp;&nbsp; 也就是说如果swf在aaaa.cn下，但是页面bbbb.cn下，想用getURL或者fscommand调用页面中的js是不可以的,除非你将value设置为always。<br /><br />注：一般情况下建议设置为samedomain。</p>
]]>
</description>
</item><item>
<link>http://www.gaoolp.com/read.php/313.htm</link>
<title><![CDATA[PHP 判断是否是一维数组]]></title> 
<author>gaoolp &lt;gaoolp@126.com&gt;</author>
<category><![CDATA[php]]></category>
<pubDate>Wed, 15 Jun 2011 08:14:36 +0000</pubDate> 
<guid>http://www.gaoolp.com/read.php/313.htm</guid> 
<description>
<![CDATA[ 
	PHP 判断是否是一维数组<br /><br /><div id="blog_text" class="cnt"><p>$a 是一个数组变量</p><p>用count($a)与count($a,<strong><span style="font-family: Courier New">COUNT_RECURSIVE)（或者count($a,1)）是否相等来判断是否是一维数组</span></strong></p><p><span style="color: #000000"><span style="font-family: Courier New"><span style="color: #000000"><span style="color: #0000bb">$food </span><span style="color: #007700">= array(</span><span style="color: #dd0000">'fruits'&nbsp;&nbsp;</span><span style="color: #007700">=&gt; array(</span><span style="color: #dd0000">'orange'</span><span style="color: #007700">, </span><span style="color: #dd0000">'banana'</span><span style="color: #007700">, </span><span style="color: #dd0000">'apple'</span></span></span><span style="font-family: Courier New"><span style="color: #007700"><span style="color: #000000">), <br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #dd0000">'veggie'&nbsp;&nbsp;</span><span style="color: #007700">=&gt; array(</span><span style="color: #dd0000">'carrot'</span><span style="color: #007700">, </span><span style="color: #dd0000">'collard'</span><span style="color: #007700">,</span><span style="color: #dd0000">'pea'</span></span><span style="color: #007700"><span style="font-family: Courier New">)); <br /><br /></span></span><span style="font-family: Courier New"><span style="color: #ff8000">// recursive count <br /></span><span style="color: #007700">echo </span><span style="color: #0000bb">count</span><span style="color: #007700">(</span><span style="color: #0000bb">$food</span><span style="color: #007700">, </span><span style="color: #0000bb">COUNT_RECURSIVE</span><span style="color: #007700">);&nbsp;&nbsp;</span></span><span style="font-family: Courier New"><span style="color: #ff8000">// output 8 <br /><br />// normal count <br /></span><span style="color: #007700">echo </span><span style="color: #0000bb">count</span><span style="color: #007700">(</span><span style="color: #0000bb">$food</span><span style="color: #007700">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff8000">// output 2</span></span></span></p><p><span style="color: #000000"><span style="font-family: Courier New"><span style="color: #ff8000">ps：<span class="simpara"><span style="color: #000000"> 可选的 <em><span style="font-family: 新宋体">mode</span></em> 参数自 PHP 4.2.0 起可用。<br /><br /></span></span></span></span></span></p></div>
]]>
</description>
</item><item>
<link>http://www.gaoolp.com/read.php/312.htm</link>
<title><![CDATA[Apache,rewrite规则和四个实例讲解【转】]]></title> 
<author>gaoolp &lt;gaoolp@126.com&gt;</author>
<category><![CDATA[生活随笔]]></category>
<pubDate>Thu, 26 May 2011 09:53:30 +0000</pubDate> 
<guid>http://www.gaoolp.com/read.php/312.htm</guid> 
<description>
<![CDATA[ 
	<p>Apache rewrite规则<br />1、Rewrite规则简介:<br />Rewirte主要的功能就是实现URL的跳转，它的正则表达式是基于Perl语言。可基于服务器级的(httpd.conf)和目录级的 (.htaccess)两种方式。如果要想用到rewrite模块，必须先安装或加载rewrite模块。方法有两种一种是编译apache的时候就直接安装rewrite模块，别一种是编译apache时以DSO模式安装apache,然后再利用源码和apxs来安装rewrite模块。<br />基于服务器级的(httpd.conf)有两种方法，一种是在httpd.conf的全局下直接利用RewriteEngine on来打开rewrite功能;另一种是在局部里利用RewriteEngine on来打开rewrite功能,下面将会举例说明，需要注意的是,必须在每个virtualhost里用RewriteEngine on来打开rewrite功能。否则virtualhost里没有RewriteEngine on它里面的规则也不会生效。<br />基于目录级的(.htaccess),要注意一点那就是必须打开此目录的FollowSymLinks属性且在.htaccess里要声明RewriteEngine on。</p><p>2、举例说明：<br />下面是在一个虚拟主机里定义的规则。功能是把client请求的主机前缀不是www.colorme.com和203.81.23.202都跳转到主机前缀为http://www.1lou.net，避免当用户在地址栏写入http://1lou.net时不能以会员方式登录网站。<br />NameVirtualHost 192.168.100.8:80<br />&lt;VirtualHost 192.168.100.8:80&gt;<br />ServerAdmin webmaster@1lou.net<br />DocumentRoot &quot;/web/webapp&quot;<br />ServerName www.1lou.net<br />ServerName 1lou.net<br />RewriteEngine on&nbsp; #打开rewirte功能<br />RewriteCond %&#123;HTTP_HOST&#125; !^www.1lou.net [NC] #声明Client请求的主机中前缀不是www.1lou.net,[NC]的意思是忽略大小写<br />RewriteCond %&#123;HTTP_HOST&#125; !^203.81.23.202 [NC]&nbsp; #声明Client请求的主机中前缀不是203.81.23.202,[NC]的意思是忽略大小写<br />RewriteCond %&#123;HTTP_HOST&#125; !^$&nbsp; #声明Client请求的主机中前缀不为空,[NC]的意思是忽略大小写<br />RewriteRule ^/(.*) http://www.1lou.net/ [L] #含义是如果Client请求的主机中的前缀符合上述条件，则直接进行跳转到http://www.1lou.net/, [L]意味着立即停止重写操作，并不再应用其他重写规则。这里的.*是指匹配所有URL中不包含换行字符，()括号的功能是把所有的字符做一个标记，以便于后面的应用.就是引用前面里的(.*)字符。<br />&lt;/VirtualHost&gt;</p><br /><p>例二.将输入 folio.1lou.net 的域名时跳转到profile.1lou.net<br />listen 8080<br />NameVirtualHost 10.122.89.106:8080&nbsp;<br />&lt;VirtualHost 10.122.89.106:8080&gt;<br />ServerAdmin webmaster@1lou.net<br />DocumentRoot &quot;/usr/local/www/apache22/data1/&quot;<br />ServerName profile.1lou.net<br />RewriteEngine on&nbsp;&nbsp;<br />RewriteCond %&#123;HTTP_HOST&#125; ^folio.1lou.net [NC]<br />RewriteRule ^/(.*) http://profile.1lou.net/ [L]<br />&lt;/VirtualHost&gt;</p><p>例三.赛卡软件近期更换了域名，新域名为www.sicasoft.com, 更加简短好记。这时需要将原来的域名ss.kiya.cn, 以及论坛所在地址bbs.1lou.net/定向到新的域名，以便用户可以找到，并且使原来的论坛 URL 继续有效而不出现 404 未找到，比如原来的http://bbs.1lou.net/tread-60.html, 让它在新的域名下继续有效，点击后转发到http://bbs.sicasoft.com/tread-60.html，而其他网页，如原先的http://ss.kiya.cn/purchase不会到二级域名bbs.sicasoft.com/purchase上，而是到www.sicasoft.com/purchase<br />按照这样的要求重定向规则应该这样写：</p><p>RewriteEngine On<br />RewriteCond %&#123;REQUEST_URI&#125; ^/bbs/<br />RewriteRule ^bbs/(.*) http://bbs.sicasoft.com/$1 [R=permanent,L]<br />RewriteCond %&#123;REQUEST_URI&#125; !^/bbs/<br />RewriteRule ^(.*) http://www.sicasoft.com/$1 [R=permanent,L]</p><p><br />3.Apache mod_rewrite规则重写的标志一览<br />1) R[=code](force redirect) 强制外部重定向<br />强制在替代字符串加上http://thishost[:thisport]/前缀重定向到外部的URL.如果code不指定，将用缺省的302 HTTP状态码。<br />2) F(force URL to be forbidden)禁用URL,返回403HTTP状态码。<br />3) G(force URL to be gone) 强制URL为GONE，返回410HTTP状态码。<br />4) P(force proxy) 强制使用代理转发。<br />5) L(last rule) 表明当前规则是最后一条规则，停止分析以后规则的重写。<br />6) N(next round) 重新从第一条规则开始运行重写过程。<br />7) C(chained with next rule) 与下一条规则关联<br />如果规则匹配则正常处理，该标志无效，如果不匹配，那么下面所有关联的规则都跳过。<br />8) T=MIME-type(force MIME type) 强制MIME类型<br />9) NS (used only if no internal sub-request) 只用于不是内部子请求<br />10) NC(no case) 不区分大小写<br />11) QSA(query string append) 追加请求字符串<br />12) NE(no URI escaping of output) 不在输出转义特殊字符<br />例如：RewriteRule /foo/(.*) /bar?arg=P1&#92;%3d$1 [R,NE] 将能正确的将/foo/zoo转换成/bar?arg=P1=zed<br />13) PT(pass through to next handler) 传递给下一个处理<br />例如：<br />RewriteRule ^/abc(.*) /def$1 [PT] # 将会交给/def规则处理<br />Alias /def /ghi<br />14) S=num(skip next rule(s)) 跳过num条规则<br />15) E=VAR:VAL(set environment variable) 设置环境变量</p><p><br />4.<br />Apache rewrite例子集合<br />在 httpd 中将一个域名转发到另一个域名<br />虚拟主机世界近期更换了域名，新域名为 www.wbhw.com, 更加简短好记。这时需要将原来的域名 webhosting-world.com, 以及论坛所在地址 webhosting-world.com/forums/ 定向到新的域名，以便用户可以找到，并且使原来的论坛 URL 继续有效而不出现 404 未找到，比如原来的 http://www. webhosting-world.com/forums/-f60.html, 让它在新的域名下继续有效，点击后转发到 http://bbs.wbhw.com/-f60.html, 这就需要用 apache 的 Mod_rewrite 功能来实现。</p><p>在&lt; virtualhost&gt; 中添加下面的重定向规则：</p><p>RewriteEngine On<br /># Redirect webhosting-world.com/forums to bbs.wbhw.com<br />RewriteCond %&#123;REQUEST_URI&#125; ^/forums/<br />RewriteRule /forums/(.*) http://bbs.wbhw.com/$1 [R=permanent,L]</p><p># Redirect webhosting-world.com to wbhw.com<br />RewriteCond %&#123;REQUEST_URI&#125; !^/forums/<br />RewriteRule /(.*) http://www.wbhw.com/$1 [R=permanent,L]</p><p>添加了上面的规则以后， 里的全部内容如下：<br />&lt; virtualhost *:80&gt;<br />ServerAlias webhosting-world.com<br />ServerAdmin admin@webhosting-world.com<br />DocumentRoot /path/to/webhosting-world/root<br />ServerName www.webhosting-world.com</p><p>RewriteEngine On<br /># Redirect webhosting-world.com/forums to bbs.wbhw.com<br />RewriteCond %&#123;REQUEST_URI&#125; ^/forums/<br />RewriteRule /forums/(.*) http://bbs.wbhw.com/$1 [R=permanent,L]</p><p># Redirect webhosting-world.com to wbhw.com<br />RewriteCond %&#123;REQUEST_URI&#125; !^/forums/<br />RewriteRule /(.*) http://www.wbhw.com/$1 [R=permanent,L]<br />&lt; /virtualhost&gt;</p><br /><p>URL重定向例子一:<br />1.http://www.zzz.com/xxx.php-&gt; http://www.zzz.com/xxx/<br />2.http://yyy.zzz.com-&gt; http://www.zzz.com/user.php?username=yyy 的功能</p><p>RewriteEngine On<br />RewriteCond %&#123;HTTP_HOST&#125; ^www.zzz.com<br />RewriteCond %&#123;REQUEST_URI&#125; !^user&#92;.php$<br />RewriteCond %&#123;REQUEST_URI&#125; &#92;.php$<br />RewriteRule (.*)&#92;.php$ http://www.zzz.com/$1/ [R]</p><p>RewriteCond %&#123;HTTP_HOST&#125; !^www.zzz.com<br />RewriteRule ^(.+) %&#123;HTTP_HOST&#125; [C]<br />RewriteRule ^([^&#92;.]+)&#92;.zzz&#92;.com http://www.zzz.com/user.php?username=$1</p><p>例子二：<br />/type.php?typeid=* --&gt; /type*.html<br />/type.php?typeid=*&amp;page=* --&gt; /type*page*.html</p><p>RewriteRule ^/type([0-9]+).html$ /type.php?typeid=$1 [PT]<br />RewriteRule ^/type([0-9]+)page([0-9]+).html$ /type.php?typeid=$1&amp;page=$2 [PT]</p><br /><p>5.使用Apache的URL Rewrite配置多用户虚拟服务器<br />要实现这个功能，首先要在DNS服务器上打开域名的泛域名解析（自己做或者找域名服务商做）。比如，我就把 *.1lou.net和 *.semcase.cn全部解析到了我的这台Linux Server上。</p><p>然后，看一下我的Apache中关于*.1lou.net的虚拟主机的设定。</p><p>#*.com,*.osall.net<br />&lt;VirtualHost *:80&gt;<br />ServerAdmin webmaster@1lou.net<br />DocumentRoot /home/www/www.1lou.net<br />ServerName dns.1lou.net<br />ServerAlias dns.1lou.net 1lou.net semcase.net *.1lou.net *.semcase.net<br />CustomLog /var/log/httpd/osa/access_log.log&quot; common<br />ErrorLog /var/log/httpd/osa/error_log.log&quot;<br />&lt;Directory /home/www/www.1lou.net&gt;<br />AllowOverride None<br />Order deny,allow<br />#AddDefaultCharset GB2312<br />&lt;/Directory&gt;<br />&lt;IfModule mod_rewrite.c&gt;<br />RewriteEngine on<br />RewriteCond %&#123;HTTP_HOST&#125; ^[^.]+&#92;.osall&#92;.(com&#124;net)$<br />RewriteRule ^(.+) %&#123;HTTP_HOST&#125;$1 [C]<br />RewriteRule ^([^.]+)&#92;.osall&#92;.(com&#124;net)(.*)$ /home/www/www.1lou.net/sylvan$3?un=$1&amp;%&#123;QUERY_STRING&#125; [L] &lt;/IfModule&gt;<br />&lt;/VirtualHost&gt;</p><p><br />在这段设定中，我把*.semcase.net和*.1lou.net 的Document Root都设定到了 /home/www/www.1lou.net<br />但是，继续看下去，看到&lt;IfModule mod_rewrite.c&gt;...&lt;/IfModule&gt;配置了吗？在这里我就配置了URL Rewrite规则。</p><p><br />RewriteEngine on #打开URL Rewrite功能<br />RewriteCond %&#123;HTTP_HOST&#125; ^[^.]+.osall.(com&#124;net)$ #匹配条件，如果用户输入的URL中主机名是类似 xxxx.1lou.net 或者 xxxx.semcase.cn 就执行下面一句<br />RewriteRule ^(.+) %&#123;HTTP_HOST&#125;$1 [C] #把用户输入完整的地址（GET方式的参数除外）作为参数传给下一个规则，[C]是Chain串联下一个规则的意思<br />RewriteRule ^([^.]+).osall.(com&#124;net)(.*)$ /home/www/dev.1lou.net/sylvan$3?un=$1&amp;%&#123;QUERY_STRING&#125; [L] # 最关键的是这一句，使用证则表达式解析用户输入的URL地址，把主机名中的用户名信息作为名为un的参数传给 /home/www/dev.1lou.net目录下的脚本，并在后面跟上用户输入的GET方式的传入参数。并指明这是最后一条规则（[L]规则）。注意，在这一句中指明的重写后的地址用的是服务器上的绝对路径，这是内部跳转。如果使用http://xxxx这样的URL格式，则被称为外部跳转。使用外部跳转的话，浏览着的浏览器中的URL地址会改变成新的地址，而使用内部跳转则浏览器中的地址不发生改变，看上去更像实际的二级域名虚拟服务器。</p><p>这样设置后，重起Apache服务器，测试一下，就大功告成了！<br />&nbsp;</p><p>&nbsp;求Rewrite 防盗链正则<br />不允许www.im286.com www.chinaz.com 这两个网站盗链 , 其它的网站都可以盗链的规则怎么写.</p><p>论坛中的答案是：<br />RewriteEngine On<br />RewriteCond %&#123;HTTP_REFERER&#125; chinaz.com [NC]<br />RewriteCond %&#123;HTTP_REFERER&#125; im286.com [NC]<br />RewriteRule .*&#92;.(jpg&#124;jpeg&#124;gif&#124;png&#124;rar&#124;zip&#124;txt&#124;ace&#124;torrent&#124;gz&#124;swf)$ http://www.xxx.com/fuck.png [R,NC,L]</p><br /><br /><p>一、关于是否需要使用完全转义，比如在 RewriteCond %&#123;HTTP_REFERER&#125; chinaz.com [NC] 中把 chinaz.com 改成 chinaz&#92;.com<br />答案是，两者都是可以的。</p><p>二、今天在做 YOURcaddy.com （就是我去年做的PlanetCoachella的变形）的时候，在 GoDaddy 主机上无法正常转向，后来找到了问题：<br />在HostMonster以及我自己的机器上，是用<br />RewriteRule ^business/([^&#92;.]+)$ biz/detail.php?name=$1 [L]<br />达到改写的。而在Godaddy主机上，是这样：<br />RewriteRule ^business/([^&#92;.]+)$ /biz/detail.php?name=$1 [L]<br />目标文件前多了一个/<br />现在想想，可能是因为没有指定RewriteBase，至于到底是不是我改日再验证一下。</p><p>三、添加两个关于判断 USER AGENT 例子和自动添加.php扩展名及自动换.html到.php扩展名的例子：<br />1</p><p>RewriteEngine on<br />RewriteCond %&#123;HTTP_USER_AGENT&#125; ^MSIE [NC,OR]<br />RewriteCond %&#123;HTTP_USER_AGENT&#125; ^Opera [NC]<br />RewriteRule ^.* &ndash; [F,L] 这里&rdquo;-&rdquo;表示没有替换，浏览器为IE和Opera的访客将被禁止访问。</p><p>2</p><p>RewriteEngine On<br />RewriteBase /test<br />RewriteCond %&#123;REQUEST_FILENAME&#125;.php -f<br />RewriteRule ([^/]+)$ /test/$1.php<br />#for example: /test/admin =&gt; /test/admin.php<br />RewriteRule ([^/]+)&#92;.html$ /test/$1.php [L]<br />#for example: /test/admin.html =&gt; /test/admin.php</p><p>限制目录只能显示图片<br />&lt; IfModule mod_rewrite.c&gt;<br />RewriteEngine on<br />RewriteCond %&#123;REQUEST_FILENAME&#125; !^.*&#92;.(gif&#124;jpg&#124;jpeg&#124;png&#124;swf)$<br />RewriteRule .*$ &ndash; [F,L]<br />&lt; /IfModule&gt;</p><br /><p>补充，关于特定文件扩展名的重写。</p><p>重写有某些扩展名的文件：<br />RewriteRule (.*.css$&#124;.*.js$) gzip.php?$1 [L]<br />如果要排除一些扩展名：<br />RewriteRule !&#92;.(js&#124;ico&#124;gif&#124;jpg&#124;JPG&#124;png&#124;PNG&#124;css&#124;pdf&#124;swf)$ index.php</p>
]]>
</description>
</item><item>
<link>http://www.gaoolp.com/read.php/311.htm</link>
<title><![CDATA[常用mimetype列表(文件头)php ]]></title> 
<author>gaoolp &lt;gaoolp@126.com&gt;</author>
<category><![CDATA[生活随笔]]></category>
<pubDate>Sun, 15 May 2011 08:22:11 +0000</pubDate> 
<guid>http://www.gaoolp.com/read.php/311.htm</guid> 
<description>
<![CDATA[ 
	<p>$mimetypelist[&quot;csm&quot;] = &quot;application/cu-seeme&quot;;<br />$mimetypelist[&quot;cu&quot;] = &quot;application/cu-seeme&quot;;<br />$mimetypelist[&quot;tsp&quot;] = &quot;application/dsptype&quot;;<br />$mimetypelist[&quot;xls&quot;] = &quot;application/excel&quot;;<br />$mimetypelist[&quot;spl&quot;] = &quot;application/futuresplash&quot;;<br />$mimetypelist[&quot;hqx&quot;] = &quot;application/mac-binhex40&quot;;<br />$mimetypelist[&quot;doc&quot;] = &quot;application/msword&quot;;<br />$mimetypelist[&quot;dot&quot;] = &quot;application/msword&quot;;<br />$mimetypelist[&quot;bin&quot;] = &quot;application/octet-stream&quot;;<br />$mimetypelist[&quot;oda&quot;] = &quot;application/oda&quot;;<br />$mimetypelist[&quot;pdf&quot;] = &quot;application/pdf&quot;;<br />$mimetypelist[&quot;pgp&quot;] = &quot;application/pgp-signature&quot;;<br />$mimetypelist[&quot;ps&quot;] = &quot;application/postscript&quot;;<br />$mimetypelist[&quot;ai&quot;] = &quot;application/postscript&quot;;<br />$mimetypelist[&quot;eps&quot;] = &quot;application/postscript&quot;;<br />$mimetypelist[&quot;ppt&quot;] = &quot;application/powerpoint&quot;;<br />$mimetypelist[&quot;rtf&quot;] = &quot;application/rtf&quot;;<br />$mimetypelist[&quot;wp5&quot;] = &quot;application/wordperfect5.1&quot;;<br />$mimetypelist[&quot;zip&quot;] = &quot;application/zip&quot;;<br />$mimetypelist[&quot;wk&quot;] = &quot;application/x-123&quot;;<br />$mimetypelist[&quot;bcpio&quot;] = &quot;application/x-bcpio&quot;;<br />$mimetypelist[&quot;pgn&quot;] = &quot;application/x-chess-pgn&quot;;<br />$mimetypelist[&quot;cpio&quot;] = &quot;application/x-cpio&quot;;<br />$mimetypelist[&quot;deb&quot;] = &quot;application/x-debian-package&quot;;<br />$mimetypelist[&quot;dcr&quot;] = &quot;application/x-director&quot;;<br />$mimetypelist[&quot;dir&quot;] = &quot;application/x-director&quot;;<br />$mimetypelist[&quot;dxr&quot;] = &quot;application/x-director&quot;;<br />$mimetypelist[&quot;dvi&quot;] = &quot;application/x-dvi&quot;;<br />$mimetypelist[&quot;pfa&quot;] = &quot;application/x-font&quot;;<br />$mimetypelist[&quot;pfb&quot;] = &quot;application/x-font&quot;;<br />$mimetypelist[&quot;gsf&quot;] = &quot;application/x-font&quot;;<br />$mimetypelist[&quot;pcf&quot;] = &quot;application/x-font&quot;;<br />$mimetypelist[&quot;pcf.Z&quot;] = &quot;application/x-font&quot;;<br />$mimetypelist[&quot;gtar&quot;] = &quot;application/x-gtar&quot;;<br />$mimetypelist[&quot;tgz&quot;] = &quot;application/x-gtar&quot;;<br />$mimetypelist[&quot;hdf&quot;] = &quot;application/x-hdf&quot;;<br />$mimetypelist[&quot;phtml&quot;] = &quot;application/x-httpd-php&quot;;<br />$mimetypelist[&quot;pht&quot;] = &quot;application/x-httpd-php&quot;;<br />$mimetypelist[&quot;php&quot;] = &quot;application/x-httpd-php&quot;;<br />$mimetypelist[&quot;php3&quot;] = &quot;application/x-httpd-php3&quot;;<br />$mimetypelist[&quot;phps&quot;] = &quot;application/x-httpd-php3-source&quot;;<br />$mimetypelist[&quot;php3p&quot;] = &quot;application/x-httpd-php3-preprocessed&quot;;<br />$mimetypelist[&quot;class&quot;] = &quot;application/x-java&quot;;<br />$mimetypelist[&quot;latex&quot;] = &quot;application/x-latex&quot;;<br />$mimetypelist[&quot;frm&quot;] = &quot;application/x-maker&quot;;<br />$mimetypelist[&quot;maker&quot;] = &quot;application/x-maker&quot;;<br />$mimetypelist[&quot;frame&quot;] = &quot;application/x-maker&quot;;<br />$mimetypelist[&quot;fm&quot;] = &quot;application/x-maker&quot;;<br />$mimetypelist[&quot;fb&quot;] = &quot;application/x-maker&quot;;<br />$mimetypelist[&quot;book&quot;] = &quot;application/x-maker&quot;;<br />$mimetypelist[&quot;fbdoc&quot;] = &quot;application/x-maker&quot;;<br />$mimetypelist[&quot;mif&quot;] = &quot;application/x-mif&quot;;<br />$mimetypelist[&quot;com&quot;] = &quot;application/x-msdos-program&quot;;<br />$mimetypelist[&quot;exe&quot;] = &quot;application/x-msdos-program&quot;;<br />$mimetypelist[&quot;bat&quot;] = &quot;application/x-msdos-program&quot;;<br />$mimetypelist[&quot;dll&quot;] = &quot;application/x-msdos-program&quot;;<br />$mimetypelist[&quot;nc&quot;] = &quot;application/x-netcdf&quot;;<br />$mimetypelist[&quot;cdf&quot;] = &quot;application/x-netcdf&quot;;<br />$mimetypelist[&quot;pac&quot;] = &quot;application/x-ns-proxy-autoconfig&quot;;<br />$mimetypelist[&quot;o&quot;] = &quot;application/x-object&quot;;<br />$mimetypelist[&quot;pl&quot;] = &quot;application/x-perl&quot;;<br />$mimetypelist[&quot;pm&quot;] = &quot;application/x-perl&quot;;<br />$mimetypelist[&quot;shar&quot;] = &quot;application/x-shar&quot;;<br />$mimetypelist[&quot;swf&quot;] = &quot;application/x-shockwave-flash&quot;;<br />$mimetypelist[&quot;swfl&quot;] = &quot;application/x-shockwave-flash&quot;;<br />$mimetypelist[&quot;sit&quot;] = &quot;application/x-stuffit&quot;;<br />$mimetypelist[&quot;sv4cpio&quot;] = &quot;application/x-sv4cpio&quot;;<br />$mimetypelist[&quot;sv4crc&quot;] = &quot;application/x-sv4crc&quot;;<br />$mimetypelist[&quot;tar&quot;] = &quot;application/x-tar&quot;;<br />$mimetypelist[&quot;gf&quot;] = &quot;application/x-tex-gf&quot;;<br />$mimetypelist[&quot;pk&quot;] = &quot;application/x-tex-pk&quot;;<br />$mimetypelist[&quot;PK&quot;] = &quot;application/x-tex-pk&quot;;<br />$mimetypelist[&quot;texinfo&quot;] = &quot;application/x-texinfo&quot;;<br />$mimetypelist[&quot;texi&quot;] = &quot;application/x-texinfo&quot;;<br />$mimetypelist[&quot;~&quot;] = &quot;application/x-trash&quot;;<br />$mimetypelist[&quot;%&quot;] = &quot;application/x-trash&quot;;<br />$mimetypelist[&quot;bak&quot;] = &quot;application/x-trash&quot;;<br />$mimetypelist[&quot;old&quot;] = &quot;application/x-trash&quot;;<br />$mimetypelist[&quot;sik&quot;] = &quot;application/x-trash&quot;;<br />$mimetypelist[&quot;t&quot;] = &quot;application/x-troff&quot;;<br />$mimetypelist[&quot;tr&quot;] = &quot;application/x-troff&quot;;<br />$mimetypelist[&quot;roff&quot;] = &quot;application/x-troff&quot;;<br />$mimetypelist[&quot;man&quot;] = &quot;application/x-troff-man&quot;;<br />$mimetypelist[&quot;me&quot;] = &quot;application/x-troff-me&quot;;<br />$mimetypelist[&quot;ms&quot;] = &quot;application/x-troff-ms&quot;;<br />$mimetypelist[&quot;ustar&quot;] = &quot;application/x-ustar&quot;;<br />$mimetypelist[&quot;src&quot;] = &quot;application/x-wais-source&quot;;<br />$mimetypelist[&quot;wz&quot;] = &quot;application/x-wingz&quot;;<br />$mimetypelist[&quot;au&quot;] = &quot;audio/basic&quot;;<br />$mimetypelist[&quot;snd&quot;] = &quot;audio/basic&quot;;<br />$mimetypelist[&quot;mid&quot;] = &quot;audio/midi&quot;;<br />$mimetypelist[&quot;midi&quot;] = &quot;audio/midi&quot;;<br />$mimetypelist[&quot;mpga&quot;] = &quot;audio/mpeg&quot;;<br />$mimetypelist[&quot;mpega&quot;] = &quot;audio/mpeg&quot;;<br />$mimetypelist[&quot;mp2&quot;] = &quot;audio/mpeg&quot;;<br />$mimetypelist[&quot;mp3&quot;] = &quot;audio/mpeg&quot;;<br />$mimetypelist[&quot;m3u&quot;] = &quot;audio/mpegurl&quot;;<br />$mimetypelist[&quot;aif&quot;] = &quot;audio/x-aiff&quot;;<br />$mimetypelist[&quot;aiff&quot;] = &quot;audio/x-aiff&quot;;<br />$mimetypelist[&quot;aifc&quot;] = &quot;audio/x-aiff&quot;;<br />$mimetypelist[&quot;gsm&quot;] = &quot;audio/x-gsm&quot;;<br />$mimetypelist[&quot;ra&quot;] = &quot;audio/x-pn-realaudio&quot;;<br />$mimetypelist[&quot;rm&quot;] = &quot;audio/x-pn-realaudio&quot;;<br />$mimetypelist[&quot;ram&quot;] = &quot;audio/x-pn-realaudio&quot;;<br />$mimetypelist[&quot;rpm&quot;] = &quot;audio/x-pn-realaudio-plugin&quot;;<br />$mimetypelist[&quot;wav&quot;] = &quot;audio/x-wav&quot;;<br />$mimetypelist[&quot;gif&quot;] = &quot;image/gif&quot;;<br />$mimetypelist[&quot;ief&quot;] = &quot;image/ief&quot;;<br />$mimetypelist[&quot;jpeg&quot;] = &quot;image/jpeg&quot;;<br />$mimetypelist[&quot;jpg&quot;] = &quot;image/jpeg&quot;;<br />$mimetypelist[&quot;jpe&quot;] = &quot;image/jpeg&quot;;<br />$mimetypelist[&quot;png&quot;] = &quot;image/png&quot;;<br />$mimetypelist[&quot;tiff&quot;] = &quot;image/tiff&quot;;<br />$mimetypelist[&quot;tif&quot;] = &quot;image/tiff&quot;;<br />$mimetypelist[&quot;ras&quot;] = &quot;image/x-cmu-raster&quot;;<br />$mimetypelist[&quot;bmp&quot;] = &quot;image/x-ms-bmp&quot;;<br />$mimetypelist[&quot;pnm&quot;] = &quot;image/x-portable-anymap&quot;;<br />$mimetypelist[&quot;pbm&quot;] = &quot;image/x-portable-bitmap&quot;;<br />$mimetypelist[&quot;pgm&quot;] = &quot;image/x-portable-graymap&quot;;<br />$mimetypelist[&quot;ppm&quot;] = &quot;image/x-portable-pixmap&quot;;<br />$mimetypelist[&quot;rgb&quot;] = &quot;image/x-rgb&quot;;<br />$mimetypelist[&quot;xbm&quot;] = &quot;image/x-xbitmap&quot;;<br />$mimetypelist[&quot;xpm&quot;] = &quot;image/x-xpixmap&quot;;<br />$mimetypelist[&quot;xwd&quot;] = &quot;image/x-xwindowdump&quot;;<br />$mimetypelist[&quot;csv&quot;] = &quot;text/comma-separated-values&quot;;<br />$mimetypelist[&quot;html&quot;] = &quot;text/html&quot;;<br />$mimetypelist[&quot;htm&quot;] = &quot;text/html&quot;;<br />$mimetypelist[&quot;mml&quot;] = &quot;text/mathml&quot;;<br />$mimetypelist[&quot;txt&quot;] = &quot;text/plain&quot;;<br />$mimetypelist[&quot;rtx&quot;] = &quot;text/richtext&quot;;<br />$mimetypelist[&quot;tsv&quot;] = &quot;text/tab-separated-values&quot;;<br />$mimetypelist[&quot;h++&quot;] = &quot;text/x-c++hdr&quot;;<br />$mimetypelist[&quot;hpp&quot;] = &quot;text/x-c++hdr&quot;;<br />$mimetypelist[&quot;hxx&quot;] = &quot;text/x-c++hdr&quot;;<br />$mimetypelist[&quot;hh&quot;] = &quot;text/x-c++hdr&quot;;<br />$mimetypelist[&quot;c++&quot;] = &quot;text/x-c++src&quot;;<br />$mimetypelist[&quot;cpp&quot;] = &quot;text/x-c++src&quot;;<br />$mimetypelist[&quot;cxx&quot;] = &quot;text/x-c++src&quot;;<br />$mimetypelist[&quot;cc&quot;] = &quot;text/x-c++src&quot;;<br />$mimetypelist[&quot;h&quot;] = &quot;text/x-chdr&quot;;<br />$mimetypelist[&quot;csh&quot;] = &quot;text/x-csh&quot;;<br />$mimetypelist[&quot;c&quot;] = &quot;text/x-csrc&quot;;<br />$mimetypelist[&quot;java&quot;] = &quot;text/x-java&quot;;<br />$mimetypelist[&quot;moc&quot;] = &quot;text/x-moc&quot;;<br />$mimetypelist[&quot;p&quot;] = &quot;text/x-pascal&quot;;<br />$mimetypelist[&quot;pas&quot;] = &quot;text/x-pascal&quot;;<br />$mimetypelist[&quot;etx&quot;] = &quot;text/x-setext&quot;;<br />$mimetypelist[&quot;sh&quot;] = &quot;text/x-sh&quot;;<br />$mimetypelist[&quot;tcl&quot;] = &quot;text/x-tcl&quot;;<br />$mimetypelist[&quot;tk&quot;] = &quot;text/x-tcl&quot;;<br />$mimetypelist[&quot;tex&quot;] = &quot;text/x-tex&quot;;<br />$mimetypelist[&quot;ltx&quot;] = &quot;text/x-tex&quot;;<br />$mimetypelist[&quot;sty&quot;] = &quot;text/x-tex&quot;;<br />$mimetypelist[&quot;cls&quot;] = &quot;text/x-tex&quot;;<br />$mimetypelist[&quot;vcs&quot;] = &quot;text/x-vcalendar&quot;;<br />$mimetypelist[&quot;vcf&quot;] = &quot;text/x-vcard&quot;;<br />$mimetypelist[&quot;dl&quot;] = &quot;video/dl&quot;;<br />$mimetypelist[&quot;fli&quot;] = &quot;video/fli&quot;;<br />$mimetypelist[&quot;gl&quot;] = &quot;video/gl&quot;;<br />$mimetypelist[&quot;mpeg&quot;] = &quot;video/mpeg&quot;;<br />$mimetypelist[&quot;mpg&quot;] = &quot;video/mpeg&quot;;<br />$mimetypelist[&quot;mpe&quot;] = &quot;video/mpeg&quot;;<br />$mimetypelist[&quot;qt&quot;] = &quot;video/quicktime&quot;;<br />$mimetypelist[&quot;mov&quot;] = &quot;video/quicktime&quot;;<br />$mimetypelist[&quot;asf&quot;] = &quot;video/x-ms-asf&quot;;<br />$mimetypelist[&quot;asx&quot;] = &quot;video/x-ms-asf&quot;;<br />$mimetypelist[&quot;avi&quot;] = &quot;video/x-msvideo&quot;;<br />$mimetypelist[&quot;movie&quot;] = &quot;video/x-sgi-movie&quot;;<br />$mimetypelist[&quot;vrm&quot;] = &quot;x-world/x-vrml&quot;;<br />$mimetypelist[&quot;vrml&quot;] = &quot;x-world/x-vrml&quot;;<br />$mimetypelist[&quot;wrl&quot;] = &quot;x-world/x-vrml&quot;;</p>
]]>
</description>
</item><item>
<link>http://www.gaoolp.com/read.php/310.htm</link>
<title><![CDATA[PHP匹配反斜杠（）]]></title> 
<author>gaoolp &lt;gaoolp@126.com&gt;</author>
<category><![CDATA[php]]></category>
<pubDate>Thu, 12 May 2011 03:28:31 +0000</pubDate> 
<guid>http://www.gaoolp.com/read.php/310.htm</guid> 
<description>
<![CDATA[ 
	<div id="blog_text" class="cnt"><div class="cnt"><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果想匹配如 .,&#123;,$,等特殊字符（在正则表达式中有特殊意义的字符），就必须在该字符前加反斜杠(&#92;)，（C中管它&#92;叫&lsquo;转义符&rsquo;）如果想表示这个反斜杠(&#92;)，就在他前面再加个反斜杠，即改成（&#92;&#92;）。<br />　　必须注意的是在PHP中要尽量把正则表达式放在单引号(')中。如果把正则表达式放在双引号里则会引起一些不必要的麻烦。在PHP的正则表达式中也要使用反斜杠(&#92;)来&lsquo;掩盖&rsquo;一些特殊的字符--像反斜杠(&#92;)自身。在表达式中如想匹配一个反斜杠(&#92;)，也必须使用两个反斜杠(&#92;)来表示它是原义的反斜杠(&#92;)，而不是转义符。<span style="color: #ff0000">在测试中发现，用单引号也需要用四个反斜杠来表示一个。</span><br />　　类似的原因，把反斜杠(&#92;)放在双引号中时也要使用两个反斜杠(&#92;)来转义。令人困惑的是，根据以上规则，在PHP中的正则表达式里要表示一个反斜杠(&#92;)就要四个反斜杠(&#92;)。PHP解析器会将四个反斜杠(&#92;)解析成两个。之后正则解析又将之解析成一个。<br />　　美圆符$在PHP字串和正则表达式中也是个有特殊意义的字符。如需匹配$的原义字符，就必须写成&quot;&#92;&#92;&#92;$&quot;.因为它在双引号里，PHP会将之解析为&#92;$，然后正则解析就会将它匹配为美圆符(而不是表示&lsquo;字符串的结束位置&rsquo;)。</p><p></p><p>另外需要注意的是，PHP中的正则表达式必须以'/'开始和结束，如：&quot;/abc/&quot;，而不能写作&quot;abc&quot;。</p></div></div>
]]>
</description>
</item><item>
<link>http://www.gaoolp.com/read.php/309.htm</link>
<title><![CDATA[PHP正则表达式]]></title> 
<author>gaoolp &lt;gaoolp@126.com&gt;</author>
<category><![CDATA[php]]></category>
<pubDate>Thu, 12 May 2011 03:07:49 +0000</pubDate> 
<guid>http://www.gaoolp.com/read.php/309.htm</guid> 
<description>
<![CDATA[ 
	<div id="cnblogs_post_body"><p><strong>1、正则表达式的介绍和作用<br />&nbsp;&nbsp;&nbsp;&nbsp; <br />什么是正则表达式？ <br />在编写处理字符串的程序或网页时，经常会有查找符合某些复杂规则的字符串 <br />的需要。正则表达式就是用于描述这些规则的语法。 <br />&nbsp;<br />&nbsp; <br />例：在判断用户邮件地址格式、手机号码格式或者采集别人网页内容时 <br />&nbsp; <br />主要的作用是：</strong><strong style="color: red">分割、匹配、查找、替换</strong><strong><br />&nbsp; <br /></strong><strong style="color: red">注：正则表达式对于一个程序员来讲是至关重要的一个知识点，所以学好正则 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是每一个程序员必须具备的。不仅可以帮助我们完成一些通过函数无法实现 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 的工作，还可以帮助我们减轻很多工作量。</strong><strong><br />&nbsp; <br />2、PHP中两个常用的正则函数<br />&nbsp; <br /></strong><strong style="color: red">preg_match 正则函数，以perl语言为基础 </strong><strong><br />preg_match ( mode, string subject , array matches ) <br />&nbsp; <br /></strong><strong style="color: red">ereg 正则函数，以POSIX基础 （Unix 、 Script） </strong><strong><br />ereg ( mode, string subject , array regs ) <br />&nbsp; <br />3、正则表达式中包括的元素<br />&nbsp; <br />(1)、</strong><strong style="color: red">原子</strong><strong>（普通字符：a-z A-Z 0-9 、原子表、 转义字符） <br />(2)、</strong><strong style="color: red">元字符</strong><strong> （有特殊功能的字符） <br />(3)、</strong><strong style="color: red">模式修正符</strong><strong> （系统内置部分字符 i 、m、S、U&hellip;） <br />&nbsp; <br />4、正则表达式中的&ldquo;原子&rdquo; <br />&nbsp; <br />①a-z A-Z _ 0-9&nbsp; </strong><strong style="color: #0000ff">//最常见的字符 </strong><strong><br />②(abc) (skd)&nbsp; </strong><strong style="color: #0000ff">//用圆括号包含起来的单元符合 </strong><strong><br />③[abcs] [^abd]&nbsp; </strong><strong style="color: #0000ff">//用方括号包含的原子表，原子表中的^代表排除或相反内容 </strong><strong><br />④转义字符 <br />&nbsp; &#92;d&nbsp; 包含所有数字</strong><strong style="color: red">[0-9] </strong><strong><br />&nbsp; &#92;D&nbsp; 除所有数字外</strong><strong style="color: red">[^0-9] </strong><strong><br />&nbsp; &#92;w&nbsp; 包含所有英文字符</strong><strong style="color: red">[a-zA-Z_0-9] </strong><strong><br />&nbsp; &#92;W&nbsp; 除所有英文字符外</strong><strong style="color: red">[^a-zA-Z_0-9]</strong><strong><br />&nbsp; &#92;s&nbsp;&nbsp; 包含空白区域如回车、换行、分页等</strong><strong style="color: red"> [&#92;f&#92;n&#92;r] </strong><strong><br />&hellip;&hellip; <br />5、正则表达式元字符 <br />&nbsp; <br />*&nbsp; 匹配前一个内容的0次1次或多次 <br /></strong><strong style="color: red">.&nbsp; 匹配内容的0次1次或多次，但不包含回车换行 </strong><strong><br />+ 匹配前一个内容的1次或多次 <br />？匹配前一个内容的0次或1次 <br />&#124;&nbsp; 选择匹配类似PHP中的&#124; （因为这个运算符合是弱类型导致前面最为整体匹配） <br />^&nbsp; 匹配字符串首部内容 <br />$&nbsp; 匹配字符串尾部内容 <br />&#92;b 匹配单词边界，边界可以是空格或者特殊符合 <br />&#92;B 匹配除带单词边界意外内容 <br />&#123;m&#125; 匹配前一个内容的重复次数为M次 <br />&#123;m,&#125; 匹配前一个内容的重复次数大于等于M次 <br />&#123;m,n&#125; 匹配前一个内容的重复次数M次到N次 <br />( ) 合并整体匹配，并放入内存，可使用&#92;1 &#92;2&hellip;依次获取<br />&nbsp;<br />6、模式修正符&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br /></strong><strong style="color: red">模式修正符是为正则表达式增强和补充的一个功能，使用在正则之外</strong><strong><br />&nbsp; <br />常用修正符<br />&nbsp; <br />i 正则内容在匹配时候不区分大小写（默认是区分的） <br />m 在匹配首内容或者尾内容时候采用多行识别匹配 <br />S 将转义回车取消是为单行匹配如. 匹配的时候 <br />x 忽略正则中的空白 <br />A 强制从头开始匹配 <br />D 强制$匹配尾部无任何内容 &#92;n <br />U 禁止贪婪匹配 只跟踪到最近的一个匹配符并结束， <br />&nbsp;&nbsp;&nbsp; 常用在采集程序上的正则表达式<br />&nbsp;<br />7、匹配功能 <br />&nbsp;&nbsp; <br />preg_match_all 全部匹配函数<br /></strong><strong style="color: red">preg_match_all </strong><strong>( string pattern, string subject, array matches [, int flags] ) <br />&nbsp; <br />对结果排序使 $matches[0] 为全部模式匹配的数组<br />&nbsp; <br />用途：截取比较详细的内容，采集网页，分析文本<br />8、替换功能 <br />&nbsp;<br />preg_replace 正则替换函数 <br /></strong><strong style="color: red">preg_replace</strong><strong> ( mixed pattern, mixed replacement, mixed subject [, int limit] ) <br />&nbsp; <br />通过正则表达式来替换相关内容，类似之前学过的str_replace字符串替换，但 <br />功能要强于它。 <br />&nbsp; <br /></strong><strong style="color: red">提示</strong><strong>：</strong><strong style="color: #0000ff">1、替换内容可以是一个正则也可以是数组正则&nbsp;</strong><strong><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</strong><strong style="color: #0000ff">2、替换内容可以通过修正符e来解决替换执行内容 </strong><strong><br />&nbsp; <br />用途：替换一些比较复杂的内容上，也可以用于内容的转换上 <br />9、分割功能<br />&nbsp; </strong><strong style="color: red">preg_split </strong><strong>( string pattern, string subject [, int limit [, int flags]] ) <br />&nbsp; preg_split 正则切割 <br />&nbsp; <br />通过正则表达式来切割相关内容，类似之前学过的explode切割函数，但explode <br />只能按照一种方式切割有局限性。</strong></p></div>
]]>
</description>
</item><item>
<link>http://www.gaoolp.com/read.php/308.htm</link>
<title><![CDATA[php中iconv函数（编码转换）使用方法_php技巧]]></title> 
<author>gaoolp &lt;gaoolp@126.com&gt;</author>
<category><![CDATA[php]]></category>
<pubDate>Fri, 06 May 2011 06:54:22 +0000</pubDate> 
<guid>http://www.gaoolp.com/read.php/308.htm</guid> 
<description>
<![CDATA[ 
	<div class="cnt">unix下安装PHP的module，需要重新编译PHP，Windows下安装模板，只需将php.ini里的配置打开相应的dll就可，例如，需要加入gb库的支持，需要如下设置：<br />extension_dir = &quot;C:/ipaddr/php/extensions/&quot;<br />(注意，建议写全地址，并且后面加上/，很多时候是因为这里设置不对，才导致无法加载其它模块的dll的)<br />再打开<br />extension=php_gd2.dll<br />但如果是安装iconv.dll，按上面方法，打开php_iconv.dll后，还是无法开启iconv模块，需要如下配置：<br />a.上iconv的官方下载站点<br /><a href="http://ftp.gnu.org/pub/gnu/libiconv/" target="_blank"><span style="color: #1463c4">http://ftp.gnu.org/pub/gnu/libiconv/</span></a><br />下面Windows版的iconv文件：libiconv-1.9.1.bin.woe32.zip <br />将这文件解压，将bin/下面的charset.dll，iconv.dll，iconv.exe拷贝到c:/windows/ (或其它的系统PATH中)<br />(ipaddr提醒你，这步是必须的，php_iconv.dll也是调用GNU的iconv库的，所以，先要安装GNU的iconv库)<br /><br />b.开启php.ini里面的php_iconv.dll<br /><br />c.重启Apache，再在phpinfo();检测是否开启iconv。<br />最近在做一个程序，需要用到iconv函数把抓取来过的utf-8编码的页面转成gb2312， 发现只有用iconv函数把抓取过来的数据一转码数据就会无缘无故的少一些。 让我郁闷了好一会儿，去网上一查资料才知道这是iconv函数的一个bug。iconv在转换字符&quot;&mdash;&quot;到gb2312时会出错 <br />解决方法很简单，就是在需要转成的编码后加 &quot;//IGNORE&quot; 也就是iconv函数第二个参数后.如下： <br />以下为引用的内容： <br />iconv(&quot;UTF-8&quot;,&quot;GB2312//IGNORE&quot;,$data) <br />ignore的意思是忽略转换时的错误，如果没有ignore参数，所有该字符后面的字符串都无法被保存。<br /><br />这个iconv()这个函数,在php5中是内置的.谢谢.<br /><br />列子<br /><p>&lt;?php<br />echo $str= '你好,这里是卖咖啡!';<br />echo '&lt;br /&gt;';</p><p>echo iconv('GB2312', 'UTF-8', $str);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //将字符串的编码从GB2312转到UTF-8<br />echo '&lt;br /&gt;';</p><p>echo iconv_substr($str, 1, 1, 'UTF-8');&nbsp;&nbsp; //按字符个数截取而非字节&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />print_r(iconv_get_encoding());&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //得到当前页面编码信息</p><p>echo iconv_strlen($str, 'UTF-8');&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //得到设定编码的字符串长度</p><p></p><p>//也有这样用的</p><p>&nbsp;&nbsp; $content = iconv(&quot;UTF-8&quot;,&quot;gbk//TRANSLIT&quot;,$content); <br />?&gt;</p></div>
]]>
</description>
</item><item>
<link>http://www.gaoolp.com/read.php/307.htm</link>
<title><![CDATA[mysql 一个表有100亿条记录，如何优化【转】]]></title> 
<author>gaoolp &lt;gaoolp@126.com&gt;</author>
<category><![CDATA[web技术]]></category>
<pubDate>Tue, 03 May 2011 06:39:04 +0000</pubDate> 
<guid>http://www.gaoolp.com/read.php/307.htm</guid> 
<description>
<![CDATA[ 
	<span style="line-height: 150%; font-family: 宋体; font-size: 12pt">我们的数据库还在设计阶段。<span> <br /></span>我们预计数据量将会很大，<span> <br /></span>一年的时间里，一张表，就会产生<span>100</span>亿条数据，<span> <br /><br /></span>表结构，如下<span> <br />id,userid,createddate,</span>等等<span> <br /></span>正常情况下，<span>100</span>亿条记录如果都存在一个表里，<span> <br /></span>那么如果通过<span>userid</span>来查寻一定很慢。<span> <br /><br /></span>所以，请教各位<span> <br /></span>在查询的性能优化上，<span> <br /></span>表结构，数据库结构，<span> <br /></span>有什么好的建议，<span> <br /></span>用<span>mysql</span>实现，是否合适？<span> <br /><br /></span>提示，业务需求中的一个特性是：<span> <br /></span>每个用户都有一个<span>userid</span>，<span> <br /></span>用户只会查自己的数据，不会查看别人的数据。<span> <br /><br /></span>谢谢各位。<span></span></span><span style="line-height: 150%; font-family: 宋体; font-size: 12pt">===========================================================================</span><span style="line-height: 150%; font-family: 宋体; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">所有的优化都包含两方面，技术的优化和需求的优化。<span> <br /></span>单表<span>100</span>亿肯定不是一个好做法。即使每条只有<span>1k</span>，总的也差不多有<span>10T</span>，再考虑到备份，更复杂了。<span>mysql</span>单表也不支持<span>10T</span>数据。<span> <br /></span>有一个办法，是根据日期创建新的表插入数据。<span> <br /></span>另外在需求优化方面，可以是只查询近期的数据，那样速度最快。如果要查询历史数据，就单独做一个接口。<span></span></span><span style="line-height: 150%; font-family: 宋体; font-size: 12pt; mso-bidi-font-family: arial">&nbsp;</span><span style="line-height: 150%; font-family: 宋体; font-size: 12pt">===========================================================================</span><span style="line-height: 150%; font-family: 宋体; font-size: 12pt">我很好奇什么应用能在一年达到<span>100</span>亿的数据？还要用<span>MySQL</span>？<span> <br /><br /></span>简单的优化方法是分两个表存储，最近一段时间（如<span>3</span>个月）放在一个表里，其他放在历史表里，一般只查询第一个表。</span><span style="line-height: 150%; font-family: 宋体; font-size: 12pt; mso-bidi-font-family: arial"></span><span style="line-height: 150%; font-family: 宋体; font-size: 12pt">===========================================================================</span><span style="line-height: 150%; font-family: 宋体; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">从硬件入手可以采取<span> <br /><br />1</span>、最简单的提升性能的方法就是提升硬件，增加硬件的投入效果立竿见影，不过这个主要是是投资方的可接受成本问题了。一般的来说从硬件方面的投资主要是购买大型机<span>RS9000,</span>购买磁盘柜（同时也是高可用的需要），增大内存。这些都可以提升系统的速度。<span> <br />2</span>、<span style="color: blue">从软件方面来说首先应该尽量使用<span>64</span>位的数据库，同时数据库应当建立在裸设备上。</span><span> <br />3</span>、<span style="color: blue">对于亿级别的数据通常是历史数据，而百万以及千万级别的数据通常是交易数据，这两种确实有很大区别，历史数据多为了读取，交易数据通常是可修改的，在建立索引的时候要考虑插入的问题。 </span><span><br />4</span>、<span style="color: blue">通常有表分区功能的数据库就不需要在设计上进行分表设计，只有在数据库系统不提供该功能的时候才会采用分表设计。分区要建立在不同的磁盘上以提升<span>IO</span>性能。<span> <br /></span></span><span><br /></span><span style="color: blue">从软件架构和业务层面<span> <br />1.</span>使用<span>SNA</span>进行缓存如：<span>memcached </span>和<span>sina </span>的<span>memcachedb</span>；<span> <br />2.ORMapping</span>（如<span>hibernate</span>）的<span>session</span>缓存和线程级别缓存；<span> <br />3.</span>使用<span>&ldquo;</span>领域模型驱动<span>&rdquo;</span>的分析设计方法分析业务；<span> <br /></span>这里关键是<span>&quot;</span>领域模型驱动设计<span>&quot;</span>，因为性能之所以优化，而不是提升，是因为总有一天优化不下去；只有领域逐渐清晰才可能使系统具有伸缩性；</span><span></span></span><span style="line-height: 150%; font-family: 宋体; font-size: 12pt; mso-bidi-font-family: arial">&nbsp;</span><span style="line-height: 150%; font-family: 宋体; font-size: 12pt">===========================================================================</span><span style="line-height: 150%; font-family: 宋体; font-size: 12pt">&nbsp;&nbsp; 100</span><span style="line-height: 150%; font-family: 宋体; font-size: 12pt">亿条记录如果都存在一个表里，这样的速度<span>mysql</span>肯定是要被摒弃，就算<span>oracle</span>也吃不消这样的数据量，你这一张表就吃掉<span>N</span>多<span>dbf</span>。建议把表结构分拆吧，比如说你查询可以做一个联合查询接口或视图，该视图可以通过多张<span>users</span>表演化而来，先前的<span>user</span>表被拆分成若干表，对常用用户的表单独处理，对不常用的用户会定时通过程序进行数据转移<span>,</span>当然<span>oracle</span>的索引是少不了的，不过从根本上看这么大的数据量的表设计就有问题，或许从整个项目的构架上去考虑，重新设计才能正确解决这张表的性能问题。</span><span style="line-height: 150%; font-family: 宋体; font-size: 12pt; mso-bidi-font-family: arial"></span><span style="line-height: 150%; font-family: 宋体; font-size: 12pt">===========================================================================</span><span style="line-height: 150%; font-family: 宋体; font-size: 12pt">楼上的回答都可以参考一下<span> <br /></span>如果在<span>mysql</span>上只是提供查询功能，是否可以这样：<span> <br /></span>建立总表，存放历史所有数据，再根据时间，比如<span>2</span>个月或者<span>1</span>个月一个表建立分表，如果只查询某个人的信息的话，查询分表就好了，要是进行统计的话，对总表进行操作，看情况增加缓存功能</span><span style="line-height: 150%; font-family: 宋体; font-size: 12pt; mso-bidi-font-family: arial"></span><span style="line-height: 150%; font-family: 宋体; font-size: 12pt">===========================================================================</span><span style="line-height: 150%; font-family: 宋体; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">100</span><span style="line-height: 150%; font-family: 宋体; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">亿数据量大了，<span>mysql</span>单表好支持不了都少。<span style="color: blue">如果不拆分数据，只能用分区来存储了</span>，查询的优化就不说了。<span></span></span><span style="line-height: 150%; font-family: 宋体; font-size: 12pt">===========================================================================</span><span style="line-height: 150%; font-family: 宋体; font-size: 12pt">分表吧<span>...</span>你看你的<span>100y</span>数据是否都需要查询或者调用<span>..</span>如果对查询不是很高<span>...</span>可以做<span>bigfile</span>放弃数据库存贮<span>..</span>靠文件流和偏移量读取<span>..</span></span><span style="line-height: 150%; font-family: 宋体; font-size: 12pt; mso-bidi-font-family: arial"></span><span style="line-height: 150%; font-family: 宋体; font-size: 12pt">===========================================================================</span><span style="line-height: 150%; font-family: 宋体; font-size: 12pt">mysql</span><span style="line-height: 150%; font-family: 宋体; font-size: 12pt">不合适，数据太大了！<span style="color: blue">考虑一下创建物理索引</span></span><span style="line-height: 150%; font-family: 宋体; font-size: 12pt; mso-bidi-font-family: arial"></span><span style="line-height: 150%; font-family: 宋体; font-size: 12pt">===========================================================================</span><span style="line-height: 150%; font-family: 宋体; font-size: 12pt">兄弟<span>,</span>你只有做分表了<span>.</span>你可分成<span>10000</span>张表<span>,</span>把数据拆分开<span>,</span>平均放到这些表中<span>,</span>这样每张表相当于<span>100</span>万条数据<span>,</span>我想应该很快的<span>.</span>分表的具体方法我们可以再讨论</span><span style="line-height: 150%; font-family: 宋体; font-size: 12pt; mso-bidi-font-family: arial"></span><span style="line-height: 150%; font-family: 宋体; font-size: 12pt">===========================================================================</span><span style="line-height: 150%; font-family: 宋体; font-size: 12pt">Mysql</span><span style="line-height: 150%; font-family: 宋体; font-size: 12pt">一张表有<span>100</span>亿才很快的话<span> oracle</span>早就关门了<span> <br />oracle</span>有<span>100</span>亿也吃不消的<span> <br /></span><span style="color: blue">你可以分到多张表里 比如按月来分</span></span><span style="line-height: 150%; font-family: 宋体; font-size: 12pt; mso-bidi-font-family: arial"></span><span style="line-height: 150%; font-family: 宋体; font-size: 12pt">===========================================================================</span><span style="line-height: 150%; font-family: 宋体; color: blue; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">只能分拆表<span></span></span><span style="line-height: 150%; font-family: 宋体; font-size: 12pt; mso-bidi-font-family: arial">&nbsp;</span>
]]>
</description>
</item><item>
<link>http://www.gaoolp.com/read.php/306.htm</link>
<title><![CDATA[【转】PHP 实现多服务器共享 SESSION 数据]]></title> 
<author>gaoolp &lt;gaoolp@126.com&gt;</author>
<category><![CDATA[php]]></category>
<pubDate>Wed, 02 Mar 2011 04:54:26 +0000</pubDate> 
<guid>http://www.gaoolp.com/read.php/306.htm</guid> 
<description>
<![CDATA[ 
	<div class="blog_content"><p>一、问题起源<br />稍大一些的网站，通常都会有好几个服务器，每个服务器运行着不同功能的模块，使用不同的二级域名，而一个整体性强的网站，用户系统是统一的，即一套用户名、密码在整个网站的各个模块中都是可以登录使用的。各个服务器共享用户数据是比较容易实现的，只需要在后端放个数据库服务器，各个服务器通过统一接口对用户数据进行访问即可。但还存在一个问题，就是用户在这个服务器登录之后，进入另一个服务器的别的模块时，仍然需要重新登录，这就是一次登录，全部通行的问题，映射到技术上，其实就是各个服务器之间如何实现共享 SESSION 数据的问题。<br /><br />二、PHP SESSION 的工作原理<br /><br />在解决问题之前，先来了解一下 PHP SESSION 的工作原理。在客户端（如浏览器）登录网站时，被访问的 PHP 页面可以使用 session_start() 打开 SESSION，这样就会产生客户端的唯一标识 SESSION ID（此 ID 可通过函数 session_id() 获取/设置）。SESSION ID 可以通过两种方式保留在客户端，使得请求不同的页面时，PHP 程序可以获知客户端的 SESSION ID；一种是将 SESSION ID 自动加入到 GET 的 URL 中，或者 POST 的表单中，默认情况下，变量名为 PHPSESSID；另一种是通过 COOKIE，将 SESSION ID 保存在 COOKIE 中，默认情况下，这个 COOKIE 的名字为 PHPSESSID。这里我们主要以 COOKIE 方式进行说明，因为应用比较广泛。<br /><br />那么 SESSION 的数据保存在哪里呢？当然是在服务器端，但不是保存在内存中，而是保存在文件或数据库中。默认情况下，php.ini 中设置的 SESSION 保存方式是 files（session.save_handler = files），即使用读写文件的方式保存 SESSION 数据，而 SESSION 文件保存的目录由 session.save_path 指定，文件名以 sess_ 为前缀，后跟 SESSION ID，如：sess_c72665af28a8b14c0fe11afe3b59b51b。文件中的数据即是序列化之后的 SESSION 数据了。如果访问量大，可能产生的 SESSION 文件会比较多，这时可以设置分级目录进行 SESSION 文件的保存，效率会提高很多，设置方法为：session.save_path=&quot;N;/save_path&quot;，N 为分级的级数，save_path 为开始目录。当写入 SESSION 数据的时候，PHP 会获取到客户端的 SESSION_ID，然后根据这个 SESSION ID 到指定的 SESSION 文件保存目录中找到相应的 SESSION 文件，不存在则创建之，最后将数据序列化之后写入文件。读取 SESSION 数据是也是类似的操作流程，对读出来的数据需要进行解序列化，生成相应的 SESSION 变量。<br /><br />三、多服务器共享 SESSION 的主要障碍及解决办法<br /><br />通过了解 SESSION 的工作原理，我们可以发现，在默认情况下，各个服务器会各自分别对同一个客户端产生 SESSION ID，如对于同一个用户浏览器，A 服务器产生的 SESSION ID 是 30de1e9de3192ba6ce2992d27a1b6a0a，而 B 服务器生成的则是 c72665af28a8b14c0fe11afe3b59b51b。另外，PHP 的 SESSION 数据都是分别保存在本服务器的文件系统中。<br /><br />确定了问题所在之后，就可以着手进行解决了。想要共享 SESSION 数据，那就必须实现两个目标：一个是各个服务器对同一个客户端产生的 SESSION ID 必须相同，并且可通过同一个 COOKIE 进行传递，也就是说各个服务器必须可以读取同一个名为 PHPSESSID 的 COOKIE；另一个是 SESSION 数据的存储方式/位置必须保证各个服务器都能够访问到。简单地说就是多服务器共享客户端的 SESSION ID，同时还必须共享服务器端的 SESSION 数据。<br /><br />第一个目标的实现其实很简单，只需要对 COOKIE 的域（domain）进行特殊地设置即可，默认情况下，COOKIE 的域是当前服务器的域名/IP 地址，而域不同的话，各个服务器所设置的 COOKIE 是不能相互访问的，如 <a id="url_3" href="http://www.aaa.com/" target="_blank"><span style="color: #108ac6">www.aaa.com</span></a> 的服务器是不能读写 <a id="url_4" href="http://www.bbb.com/" target="_blank"><span style="color: #108ac6">www.bbb.com</span></a> 服务器设置的 COOKIE 的。<br /><br />这里我们所说的同一网站的服务器有其特殊性，那就是他们同属于同一个一级域，如：aaa.infor96.com 和 <a id="url_5" href="http://www.infor96.com/" target="_blank"><span style="color: #108ac6">www.infor96.com</span></a> 都属于域 .infor96.com，那么我们就可以设置 COOKIE 的域为 .infor96.com，这样 aaa.infor96.com、<a id="url_6" href="http://www.infor96.com/" target="_blank"><span style="color: #108ac6">www.infor96.com</span></a> 等等都可以访问此 COOKIE。PHP 代码中的设置方法如下：<br /><br />&lt;?php<br />ini_set('session.cookie_domain', '.infor96.com');<br />?&gt;<br /><br />这样各个服务器共享同一客户端 SESSION ID 的目的就达到了。<br /><br />第二个目标的实现可以使用文件共享方式，如 NFS 方式，但设置、操作上有些复杂。我们可以参考先前所说的统一用户系统的方式，即使用数据库来保存 SESSION 数据，这样各个服务器就可以方便地访问同一个数据源，获取相同的 SESSION 数据了。<br /><br /><br />四、代码实现<br /><br />首先创建数据表，MySQL 的 SQL 语句如下：<br />&nbsp; CREATE TABLE `sess` (<br />&nbsp; &nbsp; `sesskey` varchar(32) NOT NULL default '',<br />&nbsp; &nbsp; &nbsp; `expiry` bigint(20) NOT NULL default '0',<br />&nbsp; &nbsp; &nbsp; `data` longtext NOT NULL,<br />&nbsp; &nbsp; &nbsp; PRIMARY KEY&nbsp; (`sesskey`),<br />&nbsp; &nbsp; &nbsp; KEY `expiry` (`expiry`)<br />&nbsp; &nbsp; ) TYPE=MyISAMsesskey 为 SESSION ID，expiry 为 SESSION 过期时间，data 用于保存 SESSION 数据。<br /><br />默认情况下 SESSION 数据是以文件方式保存，想要使用数据库方式保存，就必须重新定义 SESSION 各个操作的处理函数。PHP 提供了session_set_save_handle() 函数，可以用此函数自定义 SESSION 的处理过程，当然首先要先将 session.save_handler 改成 user，可在 PHP 中进行设置：<br /><br />&lt;?php <br />session_module_name('user');<br />?&gt;<br /><br />接下来着重讲一下 session_set_save_handle() 函数，此函数有六个参数：<br /><br />session_set_save_handler ( string open, string close, string read, string write, string destroy, string gc )各个参数为各项操作的函数名，这些操作依次是：打开、关闭、读取、写入、销毁、垃圾回收。PHP 手册中有详细的例子，在这里我们使用 OO 的方式来实现这些操作，详细代码如下：</p><div class="dp-highlighter"><div class="bar"><div class="tools">Php代码 <a href="admin.php" title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;"></a></div></div><ol class="dp-c"><li><span><span>&lt;?php &nbsp;&nbsp;</span></span></li><li><span>define(</span><span class="string"><span style="color: #0000ff">'MY_SESS_TIME'</span></span><span>,&nbsp;3600);&nbsp;&nbsp;</span><span class="comment"><span style="color: #008200">//SESSION&nbsp;生存时长 </span></span><span>&nbsp;&nbsp;</span></li><li><span class="comment"><span style="color: #008200">//类定义 </span></span><span>&nbsp;&nbsp;</span></li><li><span class="keyword"><strong><span style="color: #7f0055">class</span></strong></span><span>&nbsp;My_Sess &nbsp;&nbsp;</span></li><li><span>&#123; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><strong><span style="color: #7f0055">function</span></strong></span><span>&nbsp;init() &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&#123; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$domain</span><span>&nbsp;=&nbsp;</span><span class="string"><span style="color: #0000ff">'.infor96.com'</span></span><span>; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment"><span style="color: #008200">//不使用&nbsp;GET/POST&nbsp;变量方式 </span></span><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="func">ini_set</span><span>(</span><span class="string"><span style="color: #0000ff">'session.use_trans_sid'</span></span><span>,&nbsp;&nbsp;&nbsp;&nbsp;0); &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment"><span style="color: #008200">//设置垃圾回收最大生存时间 </span></span><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="func">ini_set</span><span>(</span><span class="string"><span style="color: #0000ff">'session.gc_maxlifetime'</span></span><span>,&nbsp;&nbsp;MY_SESS_TIME); &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment"><span style="color: #008200">//使用&nbsp;COOKIE&nbsp;保存&nbsp;SESSION&nbsp;ID&nbsp;的方式 </span></span><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="func">ini_set</span><span>(</span><span class="string"><span style="color: #0000ff">'session.use_cookies'</span></span><span>,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1); &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="func">ini_set</span><span>(</span><span class="string"><span style="color: #0000ff">'session.cookie_path'</span></span><span>,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string"><span style="color: #0000ff">'/'</span></span><span>); &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment"><span style="color: #008200">//多主机共享保存&nbsp;SESSION&nbsp;ID&nbsp;的&nbsp;COOKIE </span></span><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="func">ini_set</span><span>(</span><span class="string"><span style="color: #0000ff">'session.cookie_domain'</span></span><span>,&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$domain</span><span>); &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment"><span style="color: #008200">//将&nbsp;session.save_handler&nbsp;设置为&nbsp;user，而不是默认的&nbsp;files </span></span><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session_module_name(</span><span class="string"><span style="color: #0000ff">'user'</span></span><span>); &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment"><span style="color: #008200">//定义&nbsp;SESSION&nbsp;各项操作所对应的方法名： </span></span><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session_set_save_handler( &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><strong><span style="color: #7f0055">array</span></strong></span><span>(</span><span class="string"><span style="color: #0000ff">'My_Sess'</span></span><span>,&nbsp;</span><span class="string"><span style="color: #0000ff">'open'</span></span><span>),&nbsp;&nbsp;</span><span class="comment"><span style="color: #008200">//对应于静态方法&nbsp;My_Sess::open()，下同。 </span></span><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><strong><span style="color: #7f0055">array</span></strong></span><span>(</span><span class="string"><span style="color: #0000ff">'My_Sess'</span></span><span>,&nbsp;</span><span class="string"><span style="color: #0000ff">'close'</span></span><span>), &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><strong><span style="color: #7f0055">array</span></strong></span><span>(</span><span class="string"><span style="color: #0000ff">'My_Sess'</span></span><span>,&nbsp;</span><span class="string"><span style="color: #0000ff">'read'</span></span><span>), &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><strong><span style="color: #7f0055">array</span></strong></span><span>(</span><span class="string"><span style="color: #0000ff">'My_Sess'</span></span><span>,&nbsp;</span><span class="string"><span style="color: #0000ff">'write'</span></span><span>), &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><strong><span style="color: #7f0055">array</span></strong></span><span>(</span><span class="string"><span style="color: #0000ff">'My_Sess'</span></span><span>,&nbsp;</span><span class="string"><span style="color: #0000ff">'destroy'</span></span><span>), &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><strong><span style="color: #7f0055">array</span></strong></span><span>(</span><span class="string"><span style="color: #0000ff">'My_Sess'</span></span><span>,&nbsp;</span><span class="string"><span style="color: #0000ff">'gc'</span></span><span>) &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;); &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;</span><span class="comment"><span style="color: #008200">//end&nbsp;function </span></span><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><strong><span style="color: #7f0055">function</span></strong></span><span>&nbsp;open(</span><span class="vars">$save_path</span><span>,&nbsp;</span><span class="vars">$session_name</span><span>)&nbsp;&#123; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><strong><span style="color: #7f0055">return</span></strong></span><span>&nbsp;true; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;</span><span class="comment"><span style="color: #008200">//end&nbsp;function </span></span><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><strong><span style="color: #7f0055">function</span></strong></span><span>&nbsp;close()&nbsp;&#123; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><strong><span style="color: #7f0055">global</span></strong></span><span>&nbsp;</span><span class="vars">$MY_SESS_CONN</span><span>; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><strong><span style="color: #7f0055">if</span></strong></span><span>&nbsp;(</span><span class="vars">$MY_SESS_CONN</span><span>)&nbsp;&#123;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment"><span style="color: #008200">//关闭数据库连接 </span></span><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$MY_SESS_CONN</span><span>-&gt;Close(); &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><strong><span style="color: #7f0055">return</span></strong></span><span>&nbsp;true; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;</span><span class="comment"><span style="color: #008200">//end&nbsp;function </span></span><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><strong><span style="color: #7f0055">function</span></strong></span><span>&nbsp;read(</span><span class="vars">$sesskey</span><span>)&nbsp;&#123; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><strong><span style="color: #7f0055">global</span></strong></span><span>&nbsp;</span><span class="vars">$MY_SESS_CONN</span><span>; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$sql</span><span>&nbsp;=&nbsp;</span><span class="string"><span style="color: #0000ff">'SELECT&nbsp;data&nbsp;FROM&nbsp;sess&nbsp;WHERE&nbsp;sesskey='</span></span><span>&nbsp;.&nbsp;</span><span class="vars">$MY_SESS_CONN</span><span>-&gt;qstr(</span><span class="vars">$sesskey</span><span>)&nbsp;.&nbsp;</span><span class="string"><span style="color: #0000ff">'&nbsp;AND&nbsp;expiry&gt;='</span></span><span>&nbsp;.&nbsp;time(); &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$rs</span><span>&nbsp;=&amp;&nbsp;</span><span class="vars">$MY_SESS_CONN</span><span>-&gt;Execute(</span><span class="vars">$sql</span><span>); &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><strong><span style="color: #7f0055">if</span></strong></span><span>&nbsp;(</span><span class="vars">$rs</span><span>)&nbsp;&#123; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><strong><span style="color: #7f0055">if</span></strong></span><span>&nbsp;(</span><span class="vars">$rs</span><span>-&gt;EOF)&nbsp;&#123; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><strong><span style="color: #7f0055">return</span></strong></span><span>&nbsp;</span><span class="string"><span style="color: #0000ff">''</span></span><span>; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;</span><span class="keyword"><strong><span style="color: #7f0055">else</span></strong></span><span>&nbsp;&#123;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment"><span style="color: #008200">//读取到对应于&nbsp;SESSION&nbsp;ID&nbsp;的&nbsp;SESSION&nbsp;数据 </span></span><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$v</span><span>&nbsp;=&nbsp;</span><span class="vars">$rs</span><span>-&gt;fields[0]; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$rs</span><span>-&gt;Close(); &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><strong><span style="color: #7f0055">return</span></strong></span><span>&nbsp;</span><span class="vars">$v</span><span>; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;</span><span class="comment"><span style="color: #008200">//end&nbsp;if </span></span><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;</span><span class="comment"><span style="color: #008200">//end&nbsp;if </span></span><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><strong><span style="color: #7f0055">return</span></strong></span><span>&nbsp;</span><span class="string"><span style="color: #0000ff">''</span></span><span>; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;</span><span class="comment"><span style="color: #008200">//end&nbsp;function </span></span><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><strong><span style="color: #7f0055">function</span></strong></span><span>&nbsp;write(</span><span class="vars">$sesskey</span><span>,&nbsp;</span><span class="vars">$data</span><span>)&nbsp;&#123; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><strong><span style="color: #7f0055">global</span></strong></span><span>&nbsp;</span><span class="vars">$MY_SESS_CONN</span><span>; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$qkey</span><span>&nbsp;=&nbsp;</span><span class="vars">$MY_SESS_CONN</span><span>-&gt;qstr(</span><span class="vars">$sesskey</span><span>); &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$expiry</span><span>&nbsp;=&nbsp;time()&nbsp;+&nbsp;My_SESS_TIME;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment"><span style="color: #008200">//设置过期时间 </span></span><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment"><span style="color: #008200">//写入&nbsp;SESSION </span></span><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$arr</span><span>&nbsp;=&nbsp;</span><span class="keyword"><strong><span style="color: #7f0055">array</span></strong></span><span>( &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string"><span style="color: #0000ff">'sesskey'</span></span><span>&nbsp;=&gt;&nbsp;</span><span class="vars">$qkey</span><span>, &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string"><span style="color: #0000ff">'expiry'</span></span><span>&nbsp;&nbsp;=&gt;&nbsp;</span><span class="vars">$expiry</span><span>, &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string"><span style="color: #0000ff">'data'</span></span><span>&nbsp;&nbsp;&nbsp;&nbsp;=&gt;&nbsp;</span><span class="vars">$data</span><span>); &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$MY_SESS_CONN</span><span>-&gt;Replace(</span><span class="string"><span style="color: #0000ff">'sess'</span></span><span>,&nbsp;</span><span class="vars">$arr</span><span>,&nbsp;</span><span class="string"><span style="color: #0000ff">'sesskey'</span></span><span>,&nbsp;</span><span class="vars">$autoQuote</span><span>&nbsp;=&nbsp;true); &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><strong><span style="color: #7f0055">return</span></strong></span><span>&nbsp;true; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;</span><span class="comment"><span style="color: #008200">//end&nbsp;function </span></span><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><strong><span style="color: #7f0055">function</span></strong></span><span>&nbsp;destroy(</span><span class="vars">$sesskey</span><span>)&nbsp;&#123; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><strong><span style="color: #7f0055">global</span></strong></span><span>&nbsp;</span><span class="vars">$MY_SESS_CONN</span><span>; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$sql</span><span>&nbsp;=&nbsp;</span><span class="string"><span style="color: #0000ff">'DELETE&nbsp;FROM&nbsp;sess&nbsp;WHERE&nbsp;sesskey='</span></span><span>&nbsp;.&nbsp;</span><span class="vars">$MY_SESS_CONN</span><span>-&gt;qstr(</span><span class="vars">$sesskey</span><span>); &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$rs</span><span>&nbsp;=&amp;&nbsp;</span><span class="vars">$MY_SESS_CONN</span><span>-&gt;Execute(</span><span class="vars">$sql</span><span>); &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><strong><span style="color: #7f0055">return</span></strong></span><span>&nbsp;true; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;</span><span class="comment"><span style="color: #008200">//end&nbsp;function </span></span><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><strong><span style="color: #7f0055">function</span></strong></span><span>&nbsp;gc(</span><span class="vars">$maxlifetime</span><span>&nbsp;=&nbsp;null)&nbsp;&#123; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><strong><span style="color: #7f0055">global</span></strong></span><span>&nbsp;</span><span class="vars">$MY_SESS_CONN</span><span>; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$sql</span><span>&nbsp;=&nbsp;</span><span class="string"><span style="color: #0000ff">'DELETE&nbsp;FROM&nbsp;sess&nbsp;WHERE&nbsp;expiry&lt;'</span></span><span>&nbsp;.&nbsp;time(); &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$MY_SESS_CONN</span><span>-&gt;Execute(</span><span class="vars">$sql</span><span>); &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment"><span style="color: #008200">//由于经常性的对表&nbsp;sess&nbsp;做删除操作，容易产生碎片， </span></span><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment"><span style="color: #008200">//所以在垃圾回收中对该表进行优化操作。 </span></span><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$sql</span><span>&nbsp;=&nbsp;</span><span class="string"><span style="color: #0000ff">'OPTIMIZE&nbsp;TABLE&nbsp;sess'</span></span><span>; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$MY_SESS_CONN</span><span>-&gt;Execute(</span><span class="vars">$sql</span><span>); &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><strong><span style="color: #7f0055">return</span></strong></span><span>&nbsp;true; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;</span><span class="comment"><span style="color: #008200">//end&nbsp;function </span></span><span>&nbsp;&nbsp;</span></li><li><span>&#125;&nbsp;&nbsp;</span><span class="comment"><span style="color: #008200">///:~ </span></span><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span></li><li><span class="comment"><span style="color: #008200">//使用&nbsp;ADOdb&nbsp;作为数据库抽象层。 </span></span><span>&nbsp;&nbsp;</span></li><li><span class="keyword"><strong><span style="color: #7f0055">require_once</span></strong></span><span>(</span><span class="string"><span style="color: #0000ff">'adodb/adodb.inc.php'</span></span><span>); &nbsp;&nbsp;</span></li><li><span class="comment"><span style="color: #008200">//数据库配置项，可放入配置文件中（如：config.inc.php）。 </span></span><span>&nbsp;&nbsp;</span></li><li><span class="vars">$db_type</span><span>&nbsp;=&nbsp;</span><span class="string"><span style="color: #0000ff">'mysql'</span></span><span>; &nbsp;&nbsp;</span></li><li><span class="vars">$db_host</span><span>&nbsp;=&nbsp;</span><span class="string"><span style="color: #0000ff">'192.168.212.1'</span></span><span>; &nbsp;&nbsp;</span></li><li><span class="vars">$db_user</span><span>&nbsp;=&nbsp;</span><span class="string"><span style="color: #0000ff">'sess_user'</span></span><span>; &nbsp;&nbsp;</span></li><li><span class="vars">$db_pass</span><span>&nbsp;=&nbsp;</span><span class="string"><span style="color: #0000ff">'sess_pass'</span></span><span>; &nbsp;&nbsp;</span></li><li><span class="vars">$db_name</span><span>&nbsp;=&nbsp;</span><span class="string"><span style="color: #0000ff">'sess_db'</span></span><span>; &nbsp;&nbsp;</span></li><li><span class="comment"><span style="color: #008200">//创建数据库连接，这是一个全局变量。 </span></span><span>&nbsp;&nbsp;</span></li><li><span class="vars">$GLOBALS</span><span>[</span><span class="string"><span style="color: #0000ff">'MY_SESS_CONN'</span></span><span>]&nbsp;=&amp;&nbsp;ADONewConnection(</span><span class="vars">$db_type</span><span>); &nbsp;&nbsp;</span></li><li><span class="vars">$GLOBALS</span><span>[</span><span class="string"><span style="color: #0000ff">'MY_SESS_CONN'</span></span><span>]-&gt;Connect(&nbsp;</span><span class="vars">$db_host</span><span>,&nbsp;</span><span class="vars">$db_user</span><span>,&nbsp;</span><span class="vars">$db_pass</span><span>,&nbsp;</span><span class="vars">$db_name</span><span>); &nbsp;&nbsp;</span></li><li><span class="comment"><span style="color: #008200">//初始化&nbsp;SESSION&nbsp;设置，必须在&nbsp;session_start()&nbsp;之前运行！！ </span></span><span>&nbsp;&nbsp;</span></li><li><span>My_Sess::init(); &nbsp;&nbsp;</span></li><li><span>?&gt;&nbsp;&nbsp;</span></li></ol></div><pre class="php" style="display: none">&lt;?php define('MY_SESS_TIME', 3600);&nbsp;&nbsp;//SESSION 生存时长 //类定义 class My_Sess &#123;&nbsp;&nbsp;&nbsp;&nbsp; function init()&nbsp;&nbsp;&nbsp;&nbsp; &#123;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $domain = '.infor96.com';&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //不使用 GET/POST 变量方式&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ini_set('session.use_trans_sid',&nbsp;&nbsp;&nbsp;&nbsp;0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //设置垃圾回收最大生存时间&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ini_set('session.gc_maxlifetime',&nbsp;&nbsp;MY_SESS_TIME);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//使用 COOKIE 保存 SESSION ID 的方式&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ini_set('session.use_cookies',&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ini_set('session.cookie_path',&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'/');&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //多主机共享保存 SESSION ID 的 COOKIE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ini_set('session.cookie_domain',&nbsp;&nbsp;&nbsp;&nbsp;$domain);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//将 session.save_handler 设置为 user，而不是默认的 files&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session_module_name('user');&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //定义 SESSION 各项操作所对应的方法名：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session_set_save_handler(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; array('My_Sess', 'open'),&nbsp;&nbsp;//对应于静态方法 My_Sess::open()，下同。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; array('My_Sess', 'close'),&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; array('My_Sess', 'read'),&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; array('My_Sess', 'write'),&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; array('My_Sess', 'destroy'),&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; array('My_Sess', 'gc')&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );&nbsp;&nbsp;&nbsp;&nbsp; &#125;&nbsp;&nbsp;//end function&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function open($save_path, $session_name) &#123;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;&nbsp;&nbsp;&nbsp;&nbsp; &#125;&nbsp;&nbsp;//end function&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function close() &#123;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; global $MY_SESS_CONN;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ($MY_SESS_CONN) &#123;&nbsp;&nbsp;&nbsp;&nbsp;//关闭数据库连接&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $MY_SESS_CONN-&gt;Close();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;&nbsp;&nbsp;&nbsp;&nbsp; &#125;&nbsp;&nbsp;//end function&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function read($sesskey) &#123;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; global $MY_SESS_CONN;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$sql = 'SELECT data FROM sess WHERE sesskey=' . $MY_SESS_CONN-&gt;qstr($sesskey) . ' AND expiry&gt;=' . time();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $rs =&amp; $MY_SESS_CONN-&gt;Execute($sql);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ($rs) &#123;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ($rs-&gt;EOF) &#123;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return '';&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125; else &#123;&nbsp;&nbsp;&nbsp;&nbsp;//读取到对应于 SESSION ID 的 SESSION 数据&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $v = $rs-&gt;fields[0];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $rs-&gt;Close();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return $v;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;&nbsp;&nbsp;//end if&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;&nbsp;&nbsp;//end if&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return '';&nbsp;&nbsp;&nbsp;&nbsp; &#125;&nbsp;&nbsp;//end function&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function write($sesskey, $data) &#123;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; global $MY_SESS_CONN;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $qkey = $MY_SESS_CONN-&gt;qstr($sesskey);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $expiry = time() + My_SESS_TIME;&nbsp;&nbsp;&nbsp;&nbsp;//设置过期时间&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //写入 SESSION&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $arr = array(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'sesskey' =&gt; $qkey,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'expiry'&nbsp;&nbsp;=&gt; $expiry,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'data'&nbsp;&nbsp;&nbsp;&nbsp;=&gt; $data);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $MY_SESS_CONN-&gt;Replace('sess', $arr, 'sesskey', $autoQuote = true);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;&nbsp;&nbsp;&nbsp;&nbsp; &#125;&nbsp;&nbsp;//end function&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function destroy($sesskey) &#123;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; global $MY_SESS_CONN;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$sql = 'DELETE FROM sess WHERE sesskey=' . $MY_SESS_CONN-&gt;qstr($sesskey);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $rs =&amp; $MY_SESS_CONN-&gt;Execute($sql);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;&nbsp;&nbsp;&nbsp;&nbsp; &#125;&nbsp;&nbsp;//end function&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function gc($maxlifetime = null) &#123;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; global $MY_SESS_CONN;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$sql = 'DELETE FROM sess WHERE expiry&lt;' . time();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $MY_SESS_CONN-&gt;Execute($sql);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //由于经常性的对表 sess 做删除操作，容易产生碎片，&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //所以在垃圾回收中对该表进行优化操作。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $sql = 'OPTIMIZE TABLE sess';&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $MY_SESS_CONN-&gt;Execute($sql);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;&nbsp;&nbsp;&nbsp;&nbsp; &#125;&nbsp;&nbsp;//end function &#125;&nbsp;&nbsp;///:~&nbsp;&nbsp;//使用 ADOdb 作为数据库抽象层。 require_once('adodb/adodb.inc.php'); //数据库配置项，可放入配置文件中（如：config.inc.php）。 $db_type = 'mysql'; $db_host = '192.168.212.1'; $db_user = 'sess_user'; $db_pass = 'sess_pass'; $db_name = 'sess_db'; //创建数据库连接，这是一个全局变量。 $GLOBALS['MY_SESS_CONN'] =&amp; ADONewConnection($db_type); $GLOBALS['MY_SESS_CONN']-&gt;Connect( $db_host, $db_user, $db_pass, $db_name); //初始化 SESSION 设置，必须在 session_start() 之前运行！！ My_Sess::init(); ?&gt;</pre>&nbsp; <p>五、遗留问题<br /><br />如果网站的访问量很大的话，SESSION 的读写会频繁地对数据库进行操作，这样效率就会明显降低。考虑到 SESSION 数据一般不会很大，可以尝试用 C/Java 写个多线程的程序，用 HASH 表保存 SESSION 数据，并通过 socket 通信进行数据读写，这样 SESSION 就保存在内存中，读写速度应该会快很多。另外还可以通过负载均衡来分担服务器负载。</p><p></p><p>网站服的访问量很大时，Memcache-php是一种不错的解决方案。</p></div>
]]>
</description>
</item><item>
<link>http://www.gaoolp.com/read.php/305.htm</link>
<title><![CDATA[PHP 及的非正常用法]]></title> 
<author>gaoolp &lt;gaoolp@126.com&gt;</author>
<category><![CDATA[php]]></category>
<pubDate>Wed, 02 Mar 2011 04:50:04 +0000</pubDate> 
<guid>http://www.gaoolp.com/read.php/305.htm</guid> 
<description>
<![CDATA[ 
	<div class="blog_content"><p>&amp;&amp;及&#124;&#124;的非正常用法</p><p>$a &amp;&amp; $b=10;<br />当$a为真是才执行$b=10;<br />$a &#124;&#124; $b=10;<br />当$a为假是才执行$b=10;</p><p></p></div>
]]>
</description>
</item><item>
<link>http://www.gaoolp.com/read.php/304.htm</link>
<title><![CDATA[PHP学习---变量使用总结]]></title> 
<author>gaoolp &lt;gaoolp@126.com&gt;</author>
<category><![CDATA[php]]></category>
<pubDate>Wed, 02 Mar 2011 04:38:29 +0000</pubDate> 
<guid>http://www.gaoolp.com/read.php/304.htm</guid> 
<description>
<![CDATA[ 
	<strong>1.定义常量</strong>define(&quot;CONSTANT&quot;, &quot;Hello world.&quot;); <br />常量只能包含标量数据（boolean，integer，float 和 string）。 <br />调用常量时，只需要简单的用名称取得常量的值，而不能加&ldquo;$&rdquo;符号，如：echo CONSTANT； <br />注: 常量和（全局）变量在不同的名字空间中。这意味着例如 TRUE 和 $TRUE 是不同的。 <br /><br /><strong>2.普通变量</strong>$a = &quot;hello&quot;; <br /><br /><strong>3.可变变量（使用两个美元符号（$））</strong> <br />$$a = &quot;world&quot;; <br />两个变量都被定义了： <br />$a 的内容是&ldquo;hello&rdquo;并且 $hello 的内容是&ldquo;world&rdquo;。 <br />因此，可以表述为： <br />echo &quot;$a $&#123;$a&#125;&quot;;或者&nbsp; echo &quot;$a $hello&quot;;它们都会输出：hello world <br />要将可变变量用于数组，必须解决一个模棱两可的问题。这就是当写下 $$a[1] 时，解析器需要知道是想要 $a[1] 作为一个变量呢，还是想要 $$a 作为一个变量并取出该变量中索引为 [1] 的值。解决此问题的语法是，对第一种情况用 $&#123;$a[1]&#125;，对第二种情况用 $&#123;$a&#125;[1]。 <br /><br /><strong>4.静态变量</strong> <br />在函数内部static $a = 0; <br />注意：声明中用表达式的结果对其赋值会导致解析错误如static&nbsp; $a =3+3;（error） <br />静态变量仅在局部函数域中存在（函数内部），函数执行完之后，变量值不会丢失,可用于递归调用 <br /><br /><strong>5.全局变量</strong> <br />在函数体内定义的global变量,函数体外可以使用,在函数体外定义的global变量不能在函数体内使用，在全局范围内访问变量可以用特殊的 PHP 自定义 $GLOBALS 数组： <br />如：$GLOBALS[&quot;b&quot;] = $GLOBALS[&quot;a&quot;] + $GLOBALS[&quot;b&quot;]; <br />在一个函数域内用 global 语句导入的一个真正的全局变量实际上是建立了一个到全局变量的引用 <br />global $obj; <br />注：对于变量的 static 和 global 定义是以 应用 的方式实现的 <br /><br /><strong>6.给变量赋值：传地址赋值（简单引用）：</strong> <br />$bar = &amp;$foo;&nbsp; //加&amp;符号到将要赋值的变量前 <br />改动新的变量将影响到原始变量，这种赋值操作更加快速 <br />注意：只有命名变量才可以传地址赋值 <br />注意：如果 <br />$bar = &amp;$a; <br />$bar = &amp;$foo; <br />改变$bar的值只能改变变量foo的值，而不改变a的值（引用改变了） <br /><br /><strong>7.PHP 超全局变量</strong>$GLOBALS ： 包含一个引用指向每个当前脚本的全局范围内有效的变量。该数组的键标为全局变量的 名称。从 PHP 3 开始存在 $GLOBALS 数组。 <br />$_SERVER ： 变量由 Web 服务器设定或者直接与当前脚本的执行环境相关联。类似于旧数组 $HTTP_SERVER_VARS 数组（依然有效，但反对使用）。 <br />$_GET ：&nbsp;&nbsp;&nbsp; 经由 HTTP GET 方法提交至脚本的变量。 <br />$_POST ：&nbsp;&nbsp; 经由 HTTP POST 方法提交至脚本的变量。 <br />$_COOKIE ： 经由 HTTP Cookies 方法提交至脚本的变量。 <br />$_FILES ：&nbsp; 经由 HTTP POST 文件上传而提交至脚本的变量。 <br />文件上传表单中要有 enctype=&quot;multipart/form-data&quot; <br />$_ENV ：&nbsp;&nbsp;&nbsp; 执行环境提交至脚本的变量。 <br />$_REQUEST ：经由 GET，POST 和 COOKIE 机制提交至脚本的变量，因此该数组并不值得信任。所有包含在该数组中的变量的存在与否以及变量的顺序均按照 php.ini 中的 variables_order 配置指示来定义。该数组没有直接模拟 PHP 4.1.0 的早期版本。参见 import_request_variables()。 <br />注意：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 自 PHP 4.3.0 起，$_FILES 中的文件信息不再存在于 $_REQUEST 中。 <br />$_SESSION ：当前注册给脚本会话的变量。
]]>
</description>
</item><item>
<link>http://www.gaoolp.com/read.php/303.htm</link>
<title><![CDATA[php引用()详解]]></title> 
<author>gaoolp &lt;gaoolp@126.com&gt;</author>
<category><![CDATA[php]]></category>
<pubDate>Wed, 02 Mar 2011 04:32:23 +0000</pubDate> 
<guid>http://www.gaoolp.com/read.php/303.htm</guid> 
<description>
<![CDATA[ 
	<div class="blog_content">php引用(&amp;)详解 <br />php的引用（就是在变量或者函数、对象等前面加上&amp;符号） <br /><br />在PHP 中引用的意思是：不同的名字访问同一个变量内容. <br />与Ｃ语言中的指针是有差别的．Ｃ语言中的指针里面存储的是变量的内容在内存中存放的地址 <br /><br />变量的引用 <br /><br />PHP 的引用允许你用两个变量来指向同一个内容 <br />&lt;? <br />$a=&quot;ABC&quot;; <br />$b =&amp;$a; <br />echo $a;//这里输出:ABC <br />echo $b;//这里输出:ABC <br />$b=&quot;EFG&quot;; <br />echo $a;//这里$a的值变为EFG 所以输出EFG <br />echo $b;//这里输出EFG <br />?&gt; <br /><br />函数的传址调用 <br />传址调用我就不多说了 下面直接给出代码 <br />function test(&amp;$a) <br />&#123; <br />$a=$a+100; <br />&#125; <br />$b=1; <br />echo $b;//输出１ <br />test($b);&nbsp;&nbsp; //这里$b传递给函数的其实是$b的变量内容所处的内存地址，通过在函数里改变$a的值　就可以改变$b的值了 <br />echo &quot;&lt;br&gt;&quot;; <br />echo $b;//输出101 <br />要注意的是，在这里test(１);的话就会出错，原因自己去想 <br /><br />函数的引用返回 <br />先看代码 <br />function &amp;test() <br />&#123; <br />static $b=0;//申明一个静态变量 <br />$b=$b+1; <br />echo $b; <br />return $b; <br />&#125; <br /><br />$a=test();//这条语句会输出　$b的值　为１ <br />$a=5; <br />$a=test();//这条语句会输出　$b的值　为2 <br /><br />$a=&amp;test();//这条语句会输出　$b的值　为3 <br />$a=5; <br />$a=test();//这条语句会输出　$b的值　为6 <br />下面解释下：　 <br />通过这种方式$a=test();得到的其实不是函数的引用返回，这跟普通的函数调用没有区别　至于原因：　这是ＰＨＰ的规定 <br />ＰＨＰ规定通过$a=&amp;test(); 方式得到的才是函数的引用返回 <br />至于什么是引用返回呢（ＰＨＰ手册上说：引用返回用在当想用函数找到引用应该被绑定在哪一个变量上面时。) 这句狗屁话　害我半天没看懂 <br /><br />用上面的例子来解释就是 <br />$a=test()方式调用函数，只是将函数的值赋给$a而已，　而$a做任何改变　都不会影响到函数中的$b <br />而通过$a=&amp;test()方式调用函数呢, 他的作用是　将return $b中的　$b变量的内存地址与$a变量的内存地址　指向了同一个地方 <br />即产生了相当于这样的效果($a=&amp;b;) 所以改变$a的值　也同时改变了$b的值　所以在执行了 <br />$a=&amp;test(); <br />$a=5; <br />以后，$b的值变为了5 <br /><br />这里是为了让大家理解函数的引用返回才使用静态变量的，其实函数的引用返回多用在对象中 <br /><br />对象的引用 <br />&lt;? <br />class a&#123; <br />var $abc=&quot;ABC&quot;; <br />&#125; <br />$b=new a; <br />$c=$b; <br />echo $b-&gt;abc;//这里输出ABC <br />echo $c-&gt;abc;//这里输出ABC <br />$b-&gt;abc=&quot;DEF&quot;; <br />echo $c-&gt;abc;//这里输出DEF <br />?&gt; <br />以上代码是在PHP5中的运行效果 <br />在PHP5中 对象的复制 是通过引用来实现的。上列中$b=new a; $c=$b; 其实等效于$b=new a; $c=&amp;$b; <br />PHP5中默认就是通过引用来调用对象， 但有时你可能想建立一个对象的副本，并希望原来的对象的改变不影响到副本 . 为了这样的目的，PHP定义了一个特殊的方法，称为__clone. <br /><br />引用的作用 <br />如果程序比较大,引用同一个对象的变量比较多,并且希望用完该对象后手工清除它,个人建议用 &quot;&amp;&quot; 方式,然后用$var=null的方式清除. 其它时候还是用php5的默认方式吧. 另外, php5中对于大数组的传递,建议用 &quot;&amp;&quot; 方式, 毕竟节省内存空间使用。 <br /><br /><br />取消引用 <br />当你 unset 一个引用，只是断开了变量名和变量内容之间的绑定。这并不意味着变量内容被销毁了。例如： <br /><br />&lt;?php <br />$a = 1; <br />$b =&amp; $a; <br />unset ($a); <br />?&gt; <br /><br />不会 unset $b，只是 $a。 <br /><br /><br />global 引用 <br />当用 global $var 声明一个变量时实际上建立了一个到全局变量的引用。也就是说和这样做是相同的： <br /><br />&lt;?php <br />$var =&amp; $GLOBALS[&quot;var&quot;]; <br />?&gt; <br /><br />这意味着，例如，unset $var 不会 unset 全局变量。 <br /><br />$this <br />在一个对象的方法中，$this 永远是调用它的对象的引用。 <br /><br /><br />//下面再来个小插曲 <br />php中对于地址的指向（类似指针）功能不是由用户自己来实现的，是由Zend核心实现的，php中引用采用的是&ldquo;写时拷贝&rdquo;的原理，就是除非发生写操作，指向同一个地址的变量或者对象是不会被拷贝的。 <br /><br />通俗的讲 <br />1:如果有下面的代码 <br />$a=&quot;ABC&quot;; <br />$b=$a; <br />其实此时　$a与$b都是指向同一内存地址　而并不是$a与$b占用不同的内存 <br /><br />２:如果在上面的代码基础上再加上如下代码 <br />$a=&quot;EFG&quot;; <br />由于$a与$b所指向的内存的数据要重新写一次了，此时Zend核心会自动判断　自动为$b生产一个$a的数据拷贝，重新申请一块内存进行存储<br /><br />来源：http://hi.baidu.com/webchenhui/blog/item/ba39184f9e8c24c2d1c86ab4.html <br /></div>
]]>
</description>
</item><item>
<link>http://www.gaoolp.com/read.php/302.htm</link>
<title><![CDATA[张家港夜间经过长途车站的公交车大全]]></title> 
<author>gaoolp &lt;gaoolp@126.com&gt;</author>
<category><![CDATA[收藏]]></category>
<pubDate>Sun, 27 Feb 2011 02:57:26 +0000</pubDate> 
<guid>http://www.gaoolp.com/read.php/302.htm</guid> 
<description>
<![CDATA[ 
	<table border="0" cellspacing="0" cellpadding="0" width="95%" align="center"><tbody><tr><td colspan="2"><div><div><div><span><p align="left"><span><strong><span style="font-family: 宋体">张家港晚间公交班车，途径长途车站的有：<br /><br />5路夜班(环形)&nbsp;<span>&nbsp;</span>客运站（新长途车站）（客运站首18：05、末21：00 &nbsp;班次间隔15）<br /></span></strong></span></p><p align="left"><span><span><span style="font-family: 宋体"><strong><span style="color: #ff0000">东线</span>：<span>客运站（新长途汽车站）</span>&mdash;实验小学东校区&mdash;梁丰花园&mdash;张高中&mdash;外国语学校&mdash;血站&mdash;二职中&mdash;澳洋顺济医院&mdash;电视大学&mdash;市政府&mdash;国贸酒店&mdash;<span>电信大厦（老长途汽车站旧址）</span>&mdash;张家港宾馆&mdash;社保大厦&mdash;图书馆&mdash;金海华&mdash;大润发&mdash;杨舍镇计生站&mdash;大成商贸&mdash;沙洲中学&mdash;南门路&mdash;国税局&mdash;港城汽车站&mdash;澳洋医院&mdash;东方明珠&mdash;<span>客运站（新长途汽车站）</span></strong></span></span></span></p><p align="left"><span><span><span style="font-family: 宋体"><strong><span style="color: #ff0000">西线</span>：<span>客运站（新长途汽车站）</span>&mdash;东方明珠&mdash;澳洋医院&mdash;港城汽车站&mdash;国税局&mdash;南门路&mdash;沙洲中学&mdash;大成商贸&mdash;杨舍镇计生站&mdash;张家港公园&mdash;大润发&mdash;金海华&mdash;图书馆&mdash;社保大厦&mdash;张家港宾馆&mdash;<span>电信大厦（老长途汽车站旧址）</span>&mdash;国贸酒店&mdash;市政府&mdash;电视大学&mdash;澳洋顺济医院&mdash;二职中&mdash;血站&mdash;外国语学校&mdash;张高中&mdash;梁丰花园&mdash;实验小学东校区&mdash;<span>客运站（新长途汽车站）</span></strong></span></span></span></p></span><strong><span>10</span></strong><strong><span>路夜班</span></strong><strong><span> </span></strong><strong><span>香港城</span></strong><strong><span>&mdash;</span></strong><strong><span>东莱（香港城</span></strong><strong><span>&mdash;</span></strong><strong><span>首</span></strong><strong><span>18</span></strong><strong><span>：</span></strong><strong><span>25 </span></strong><strong><span>末</span></strong><strong><span>20</span></strong><strong><span>：</span></strong><strong><span>45 </span></strong><strong><span>文化广场</span></strong><strong><span>&mdash;</span></strong><strong><span>首</span></strong><strong><span>19</span></strong><strong><span>：</span></strong><strong><span>15 </span></strong><strong><span>末</span></strong><strong><span>20</span></strong><strong><span>：</span></strong><strong><span>55<span>&nbsp; </span></span></strong><strong><span>班次间隔</span></strong><strong><span>40</span></strong><strong><span>&mdash;</span></strong><strong><span>60</span></strong><strong><span>）</span></strong><strong><span><br /></span></strong><span>香港城</span><span>&mdash;</span><span>交通大厦</span><span>&mdash;</span><strong><span>客运站（新长途汽车站）</span></strong><span>&mdash;</span><span>东方明珠</span><span>&mdash;</span><span>澳洋医院</span><span>&mdash;</span><span>湖滨新村</span><span>&mdash;</span><span>南城花园</span><span>&mdash;</span><span>港城汽车站</span><span>&mdash;</span><span>国际购物中心</span><span>&mdash;</span><span>实验小学</span><span>&mdash;</span><span>慕嘏桥</span><span>&mdash;</span><span>张家港宾馆</span><span>&mdash;</span><strong><span>电信大厦（老长途汽车站旧址）</span></strong><span>&mdash;</span><span>国贸酒店</span><span>&mdash;</span><span>市政府</span><span>&mdash;</span><span>电视大学</span><span>&mdash;</span><span>澳洋顺济医院</span><span>&mdash;</span><span>港通路桥集团</span><span>&mdash;</span><span>华亿集团</span><span>&mdash;</span><span>东门</span><span>&mdash;</span><span>蒋桥</span><span>&mdash;</span><span>新庄桥</span><span>&mdash;</span><span>红蕾学校</span><span>&mdash;</span><span>南桥村</span><span>&mdash;</span><span>东菜车站</span><span>&mdash;</span><span>东莱大桥</span><span>&mdash;</span><span>文化广场</span><span><br /></span><strong><span>13</span></strong><strong><span>路夜班</span></strong><strong><span> </span></strong><strong><span>香港城</span></strong><strong><span>&mdash;</span></strong><strong><span>闸上（香港城</span></strong><strong><span>&mdash;</span></strong><strong><span>首</span></strong><strong><span>18</span></strong><strong><span>：</span></strong><strong><span>30</span></strong><strong><span>末</span></strong><strong><span>20</span></strong><strong><span>：</span></strong><strong><span>00 </span></strong><strong><span>闸上</span></strong><strong><span>&mdash;</span></strong><strong><span>首</span></strong><strong><span>19</span></strong><strong><span>：</span></strong><strong><span>15 </span></strong><strong><span>末</span></strong><strong><span>20</span></strong><strong><span>：</span></strong><strong><span>45 <span>&nbsp;</span></span></strong><strong><span>班次间隔</span></strong><strong><span>90</span></strong><strong><span>）</span></strong><strong><span><br /></span></strong><span>香港城</span><span>&mdash;</span><span>交通大厦</span><span>&mdash;</span><strong><span>客运站（新长途汽车站）</span></strong><span>&mdash;</span><span>东方明珠</span><span>&mdash;</span><span>澳洋医院</span><span>&mdash;</span><span>港城汽车站</span><span>&mdash;</span><span>国际购物中心</span><span>&mdash;</span><span>商业大厦</span><span>&mdash;</span><span>市经委</span><span>&mdash;</span><span>图书馆</span><span>&mdash;</span><span>社保大厦</span><span>&mdash;</span><span>市二中</span><span>&mdash;</span><span>党校</span><span>&mdash;</span><span>云盘菜场</span><span>&mdash;</span><span>云盘新村</span><span>&mdash;</span><span>万红一村</span><span>&mdash;</span><span>第一人民医院</span><span>&mdash;</span><span>泗港办事处</span><span>&mdash;</span><span>悦盛花园</span><span>&mdash;</span><span>泗港中心医院</span><span>&mdash;</span><span>交通加油站</span><span>&mdash;</span><span>农业银行</span><span>&mdash;</span><span>建设银行</span><span>&mdash;</span><span>幸福桥</span><span>&mdash;</span><span>蒋西路</span><span>&mdash;</span><span>章卿村</span><span>&mdash;</span><span>扬帆建材</span><span>&mdash;</span><span>夏家埭</span><span>&mdash;</span><span>闸上</span><span><br /></span><strong><span>205</span></strong><strong><span>路夜班</span></strong><strong><span> </span></strong><strong><span>香港城</span></strong><strong><span>&mdash;</span></strong><strong><span>大新（大新发：</span></strong><strong><span>18</span></strong><strong><span>：</span></strong><strong><span>00 </span></strong><strong><span>香港城发：</span></strong><strong><span>21</span></strong><strong><span>：</span></strong><strong><span>00</span></strong><strong><span>）</span></strong><strong><span><br /></span></strong><p align="left"><span>香港城</span><span>&mdash;</span><span>交通大厦</span><span>&mdash;</span><strong><span>客运站（新长途汽车站）</span></strong><span>&mdash;</span><span>帝景豪园</span><span>&mdash;</span><span>林业局</span><span>&mdash;</span><span>东苑小区</span><span>&mdash;</span><span>外国语学校</span><span>&mdash;</span><span>血站</span><span>&mdash;</span><span>新市河路</span><span>&mdash;</span><span>御景苑</span><span>&mdash;</span><span>市政府</span><span>&mdash;</span><span>国贸酒店</span><span>&mdash;</span><span>公路处</span><span>&mdash;</span><span>锦绣花园</span><span>&mdash;</span><span>国泰科技园</span><span>&mdash;</span><span>高新张铜</span><span>&mdash;</span><span>粱丰食品</span><span>&mdash;</span><span>田垛里</span><span>&mdash;</span><span>国泰北路</span><span>&mdash;</span><span>振兴路</span><span>&mdash;</span><span>东港药化</span><span>&mdash;</span><span>泗港一号桥</span><span>&mdash;</span><span>周家桥</span><span>&mdash;</span><span>晨新路</span><span>&mdash;</span><span>金沙路</span><span>&mdash;</span><span>南新桥</span><span>&mdash;</span><span>南新老桥</span><span>&mdash;</span><span>晨丰桥</span><span>&mdash;</span><span>晨丰村</span><span>&mdash;</span><span>年丰桥</span><span>&mdash;</span><span>长青村</span><span>&mdash;</span><span>为民桥</span><span>&mdash;</span><span>长青桥</span><span>&mdash;</span><span>浦项公寓</span><span>&mdash;</span><span>阳光家园（东）</span><span>&mdash;</span><span>滨江商贸城</span><span>&mdash;</span><span>阳光家园</span><span>&mdash;</span><span>大新菜场</span><span>&mdash;</span><span>农业银行</span><span>&mdash;</span><span>大新车站<br /><br />在张家港这么长时间，一直受到晚上公交太早停开的困扰，夜班车又没有过在站台上公示，不知道为什么张家港公交要省这个钱，把服务大众早抛脑后了，这收集一些张家港夜间公交班车，主要是途径张家港长途车站的，发出来，方便大家查询，欢迎大家补充。</span></p></div></div></div></td></tr><tr align="right"><td colspan="2">&nbsp;</td></tr></tbody></table>
]]>
</description>
</item><item>
<link>http://www.gaoolp.com/read.php/301.htm</link>
<title><![CDATA[ThinkPHP夜话之13：数据缓存]]></title> 
<author>gaoolp &lt;gaoolp@126.com&gt;</author>
<category><![CDATA[php]]></category>
<pubDate>Sun, 20 Feb 2011 06:43:58 +0000</pubDate> 
<guid>http://www.gaoolp.com/read.php/301.htm</guid> 
<description>
<![CDATA[ 
	Think<span class="t_tag">PHP</span>的数据缓存<span class="t_tag">功能</span>应该是一个非常大的特色，期间也经历了不少完善，主要由Cache类来完成，并且以工厂模式支持了很多的缓存方式，目前支持的有：<br /><br /><div class="quote"><blockquote>File <span class="t_tag">文件</span>方式<br />Db <span class="t_tag">数据库</span>方式<br />Shmop 共享内存方式<br />Eaccelerator Eaccelerator (Turck MMcache fork)<br />Memcache Memched<br />Apc APC<br />Apachenote Apache note<br />Sqlite <span class="t_tag">SQL</span>ite<br />Xcache</blockquote></div><br /><br />对于<span class="t_tag">用户</span>来说，并不需要了解具体某种缓存方式实现的细节，而是统一通过公共的接口方法来实现缓存写入和读取，包括有效期<span class="t_tag">设置</span>。缓存的使用范围可以用在<span class="t_tag">框架</span>的各个层次，包括数据库<span class="t_tag">查询</span>缓存、数据对象缓存、<span class="t_tag">应用</span>自定义缓存等，使用缓存类的方式如下：<br /><br />Import(&quot;Think.Util.Cache&quot;);<br />// 取得缓存实例 其中type参数表示上面列出的缓存类型 默认为File类型<br />$cache&nbsp;&nbsp;= Cache: :getInstance($type);<br />// 写入缓存<br />$cache-&gt;set($name,$value,$expire);<br />// 读取缓存<br />$cache-&gt;get($name);<br />// 删除缓存<br />$cache-&gt;rm($name);<br />// 清空缓存<br />$cache-&gt;clear($name);<br /><br />通常来说缓存会<span class="t_tag">自动</span>管理，过期的会自动清除，所以不需要手动来清除。<br />在0.9.8版本以后，还增加了更加方便缓存操作的S方法，例如，上面的操作可以简化为<br /><br />// 写入缓存数据<br />S($name,$value,$expire);<br />// 读取缓存数据<br />S($name);<br />// 删除缓存<br />S($name,NULL);<br />// 另外还可以指定其它的缓存方式操作<br />S($name,$value,$expire,$type)<br /><br />ThinkPHP支持自动数据对象缓存，该功能无需启用动态数据缓存就可以使用了，事实上，ThinkPHP的核心Action类的预定义操作方法中大量使用了数据对象自动缓存功能。第一次读取某个Vo对象会自动生成缓存，重复刷新<span class="t_tag">页面</span>或者其他用户读取该数据对象的时候无需再次访问数据库，而当某个用户对该数据对象进行了修改，<span class="t_tag">系统</span>会自动删除缓存数据对象，以便下次自动重新生成缓存。自动缓存仅仅适用于数据对象，对于数据列表对象无法完成自动缓存的更新功能。<br />框架还支持对缓存读写次数的统计功能。
]]>
</description>
</item><item>
<link>http://www.gaoolp.com/read.php/300.htm</link>
<title><![CDATA[对象关系映射]]></title> 
<author>gaoolp &lt;gaoolp@126.com&gt;</author>
<category><![CDATA[web技术]]></category>
<pubDate>Sun, 20 Feb 2011 05:02:26 +0000</pubDate> 
<guid>http://www.gaoolp.com/read.php/300.htm</guid> 
<description>
<![CDATA[ 
	<h2>引言</h2><p>大多数情况下，大家都在使用面向对象的思想进行程序开发与设计。与此同时，和我们打交道最多的数据库莫过于关系数据库了。而如何使这两个不同领域的对象相互协作自然成了我们日常讨论最多的话题之一。</p><p>作为本系列的第一篇文章，我主要向大家介绍了理解对象关系映射的一些预备知识和基础概念。主要包括：一对一关系、面向对象基础、关系基础并对 对象与关系之间存在的差异作了简要的讨论。</p><p>对象关系映射的英文全名为：Object Relational Mapping，简写为：ORM。为了简便，本文下面提到对象关系映射，均使用 ORM 。</p><h2>一对一关系</h2><p>在讲述对象关系映射 ORM 之前，我们首先需要了解一下什么是一对一关系以及 如何实现一对一关系。一对一关系也叫做超类/子类关系。</p><p>在实际的开发中，大家最熟悉的数据库关系可能就是一对多了。比如说一个分类下有很多篇随笔，又比如一篇随笔下有很多条评论。不知不觉中，对于需要使用一对一来实现的情况，也不假思索地使用一对多的方式去实现了。</p><p>我们来看这样一个例子，为了演示我做了简化：</p><p>假如我们正在设计一个论坛的用户表User，那么一般来说需要这样几个字段：UserId，用户ID；Name，用户名称；Password，密码；Email，电子邮件。我们还要设置管理员和版主，所以我们继续添加字段：AdminPwd，后台密码；Level，用户级别：0，普通会员；1，版主；2，管理员。</p><p>这个表的建立脚本是这样的：</p><p class="Code">Create Table [User]<br />(<br />UserId Int Identity(1,1),<br />Name Varchar(30) Not Null,<br />Password Varchar(50) Not Null,<br />Email Varchar(50) Not Null,<br />AdminPwd Varchar(50) Null,<br />Level TinyInt Not Null Default 0 Constraint ck_UserLevel Check(Level between 0 and 2) --0,普通会员；1,版主；2,管理员<br /><br />Constraint pk_User Primary Key(UserId) -- 建立主键<br />)</p><p>很快就会发现，用户与管理员的比例往往是 1000:1。这时候对于99.9%的用户来说，它的 AdminPwd 字段都是Null，Level字段是 0。于是，为了避免这种不必要的空间浪费，我们将管理员抽象出来，新建一个Admin表。</p><p>这时候，问题出来了，很多人都是采用这种方式建立的：</p><p class="Code">Create Table [User]<br />(<br />UserId Int Identity(1,1),<br />Name Varchar(30) Not Null,<br />Password Varchar(50) Not Null,<br />Email Varchar(50) Not Null,<br /><br />Constraint pk_User Primary Key(UserId) -- 建立主键<br />)<br /><br />Create Table Admin<br />(<br />AdminId Int Identity(1,1),<br />AdminPwd Varchar(50) Null,<br />Level TinyInt Not Null Default 1 Constraint ck_UserLevel Check(Level between 1 and 2),<br />FKUserId Int Not Null<br /><br />Constraint pk_Admin Primary Key(AdminId) -- 建立主键<br />)</p><p>在Admin表中，不少朋友想当然地用 FKUserId 去对应 User 表中的 UserId，以此来实现 管理员与用户的对应关系。实际上，这是典型的一对多关系的做法。因为，你完全可以让两个不同的管理员拥有着相同的 FKUserId 字段值，也就是对应User表中的同一个用户。这时候，已经破坏了数据一致性。而且，还产生了一个没有任何意义的字段：AdminId。</p><p>那么，合理的方案是什么呢？那就是采用一对一关系，具体的实现脚本如下：</p><p class="Code">Create Table [User]<br />(<br />UserId Int Identity(1,1), -- 主表的主键<br />Name Varchar(30) Not Null,<br />Password Varchar(50) Not Null,<br />Email Varchar(50) Not Null,<br /><br />Constraint pk_User Primary Key(UserId)<br />)<br /><br />Create Table Admin<br />(<br />UserId Int, -- 不能是自增型<br />AdminPwd Varchar(50) Null,<br />Level TinyInt Not Null Default 1 Constraint ck_UserLevel Check(Level between 1 and 2), -- 1,版主；2,管理员<br /><br />Constraint pk_Admin Primary Key(UserId) -- 建立从表主键<br />)<br /><br />Alter Table Admin -- 建立从表外键<br />Add Constraint fk_Admin_User Foreign Key(UserId) References User (UserId)<br />On Delete No Action On Update No Action</p><p>我们看看现在与之前有什么区别？</p><ol><li>AdminId 字段重命名为了 UserId，为什么这么做？我的原则是：如果一个表中的字段与另一个表中的字段含义相同，那么它们的名字也相同，外键包含的字段视情况而定。</li><li>UserId 字段不再是自增型了，这个很容易理解：它要与User表中的UserId对应，以表示是同一个人。User表中的UserId已经是自增型了，它当然不能再自增了，不然如何对应？</li><li>取消了 FKUserId 字段，原因很简单，因为 UserId 现在不光是主键，也是外键，用来对应 User 表的 UserId 字段。</li></ol><p>在这个实例中：</p><ul><li>UserId是主键，保证了在Admin表中它只能有一个，不能重复。</li><li>UserId是外键，保证了它一定对应一条已经存在于User表中的记录，也就是一个用户。</li></ul><p><strong>我们现在总结一下，一对一关系实施的特点：</strong></p><ol><li>主表的主键为自增型或者其他任何能唯一标识记录的类型。</li><li>从表的主键(包含的字段) 与主表的主键(包含的字段) 名称与含义相同。</li><li>从表的外键(包含的字段) 与从表的主键(包含的字段) 相同。</li><li>从表的外键(包含的字段) 对应主表的主键(包含的字段)。</li></ol><h2>面向对象基础</h2><h3>类型</h3><p>个人认为，类型(Type)是面向对象思想中最重要的一个概念，许多其他的概念都是由它推演出来的。而很多朋友以为定义了一个类(Class)就是定义了一个类型，这样的理解有所偏差。</p><p><strong>类型是由类的接口决定的，当我们提到某个对象是什么类型的时候，实际上说的是它有什么样的接口，而并不关心其接口是如何实现的。反过来思考，就是：类型是 详细定义了的、对象所要支持的接口。</strong></p><p class="note"><strong>NOTE:</strong>如果一个对象实现了 类型 定义的 全部接口，那么我们就说： 这个对象实现了这个 类型，说得顺口一点，就是：某某类型的对象。如果一个对象实现了很多个类型的接口，那么它就同时是很多个类型。 </p><p>GOF四人组在其著作《设计模式》第13页中这样提到：A type is a name used to denote a particular interface. We speak of an object as having the type &quot;Window&quot; if it accepts all requests for the operation defined in the interface &quot;Window&quot;.</p><p>翻译过来是：类型是标识一种特定接口的名称。如果有一个对象，它满足定义在&quot;Window&quot;接口中的全部要求，那么我们就说这个对象具有&quot;Window&quot;类型。</p><h3>联系</h3><p><strong>类型并不是孤立存在的，一个类型可以与其他类型存在联系。如果两个类型之间存在着联系，那么某个类型的对象 就可以 转换为另一个类型的对象。</strong></p><p class="note"><strong>NOTE：</strong>大家整天在说面向对象的多态性，奇怪为什么一个类的实例可以转换成它的接口类型，而接口什么都没有做，只不过定义了一堆方法和属性签名而已。<br />现在明白了吧？<strong>这是因为类型间的联系，接口定义了类型，而类(class)与之联系。</strong></p><h3>类</h3><p>类定义了对象(反过来思考，就是类的实例)的具体实现。它定义了对象拥有什么样的类型，说得通俗一点，就是类实现了接口(抽象类是个特例)。</p><h3>继承</h3><p><strong>继承可以是类型继承，也可以是类继承。</strong></p><p>当是类型继承的时候：如果一个对象是类型B，而类型B继承自类型A，那么我们可以说：此对象也是类型A。</p><p>当是类继承的时候：我们说一个类继承了另一个类的实现，同时，继承类并不丧失对其基类的覆盖能力。</p><h3>状态</h3><p>状态这一概念相对来说比较好理解，它通常指的是对象拥有的值的集合。</p><h3>行为</h3><p>对象的行为是指：</p><ul><li>个对象所提供的操作的集合，也就是它的接口。</li><li>对象对于调用它的其他对象所做出的回应，通常来说就是方法的返回值。</li><li>操作对于对象本身所造成的影响。</li></ul><p>对于一个对象的所有互动和了解都是通过它的行为来完成。</p><h3>封装</h3><p>封装使得对象成为一个不依赖于其他对象的独立个体。外界对其内部的实现是不可见的。举个例子，当你与一个封装好了的对象进行交互，你只能通过它所提供的接口，而对于接口以内的具体实现是不能也不应该知道的。</p><p class="note"><strong>NOTE：</strong>本章仅为后面章节的说明提供预备知识，内容比较浅显，如果您对面向对象程序设计感兴趣，可以参考相关书籍。</p><h2>关系基础</h2><p>本章讲述的是关系(Relation)，尽管有的概念与之前面向对象的概念有几分相似，但请不要试图用面向对象的思想去理解关系中的概念。</p><h3>关系</h3><p>关系定义了一组属性，这组属性组合起来构成一个有意义的事物，以我们之前讨论过的一对一关系为例，它之中的一个关系就是：User&#123;Name, Email, Gender, BirthDay&#125;。</p><h3>属性</h3><p>属性是关系的组成部分，它提供了区分不同关系的依据。举个例子，为什么用户关系User&#123;Name, Email, Gender, BirthDay&#125; 和 汽车关系 Car&#123;Name, Color, Speed, Price&#125;不同？ 不是因为&ldquo;User&rdquo;的意思翻译过来是&ldquo;用户&rdquo;，&ldquo;Car&rdquo;翻译过来是&ldquo;汽车&rdquo;，而是因为它们的属性不同。</p><p>属性还定义了属性值的范围。例如，User关系的属性Gender (性别)，它的取值范围就只可能是&#123;男, 女&#125;，不可能再有其它值。</p><h3>值域</h3><p>简单地理解，值域就是一种数据类型，或者说，是值的一个取值范围。例如上面提到的Gender属性，它的值域就是&#123;男, 女&#125;。</p><h3>元组</h3><p>就如用说&ldquo;汽车&rdquo;一样，关系是在很高层次上的一个抽象，并不代表具体的事物。只有当关系的所有属性都有了其值域内的特定值时，它才能代表一个实际的事物。</p><p>当我们给一个关系的属性都赋予了其值域内的某个特定值以后，就构成了一个元组。</p><p>我们再以上面的User关系为例，它的一个元组是：</p><p class="Code">&lt;User Name=&quot;张子阳&quot; Gender=&quot;男&quot; Email=&quot;jimmy_dev@163.com&quot; BirthDay=&quot;1982-12-8&quot;&gt;</p><p>对于多个元组来说，如果它们的所有属性值都相同，那么我们就说它们是同一个元组。</p><h3>关系值</h3><p>一组元组就构成了关系值，我们再以User为例，它的一个关系值是：</p><p class="Code">&#123;<br />&lt;User Name=&quot;张子阳&quot; Gender=&quot;男&quot; Email=&quot;jimmy_dev@163.com&quot; BirthDay=&quot;1982-12-8&quot;&gt;<br />&lt;User Name=&quot;王五&quot; Gender=&quot;男&quot; Email=&quot;Wang5@cnblogs.com&quot; BirthDay=&quot;1983-7-17&quot;&gt;<br />&lt;User Name=&quot;李四&quot; Gender=&quot;女&quot; Email=&quot;Li4@cnblogs.com&quot; BirthDay=&quot;1984-5-20&quot;&gt;<br />&#125;</p><p>对于关系值来说：</p><ul><li>不存在重复的元组。</li><li>元组的先后顺序是无关紧要的。</li></ul><h3>关系和表</h3><p>在关系数据库中，关系通常表现为表的形式，例如上面的User关系，通常在数据库中表述成一张类似下面的User表。</p><p><strong>User 表</strong></p><table border="1" cellspacing="0"><tbody><tr><td><strong>Name</strong></td><td><strong>Gender</strong></td><td><strong>Email</strong></td><td><strong>BirthDay</strong></td></tr><tr><td>张子阳</td><td>男</td><td>jimmy_dev@163.com</td><td>1982-12-8</td></tr><tr><td>李四</td><td>女</td><td>li4@cnblogs.com</td><td>1983-7-17</td></tr><tr><td>王五</td><td>男</td><td>wang5@cnblogs.com</td><td>1984-5-20</td></tr></tbody></table><h3>关系系统和数据库系统的术语对应</h3><table border="1" cellspacing="0"><tbody><tr><td><strong>数据库系统</strong></td><td><strong>关系系统</strong></td></tr><tr><td>表(Table)</td><td>关系(Relation)</td></tr><tr><td>行(Row)</td><td>元组(Tuple)</td></tr><tr><td>列(Column)</td><td>属性(Attribute)</td></tr><tr><td>数据类型(Data Type)</td><td>值域(Domain)</td></tr><tr><td>列值(Column Value)</td><td>属性值(Attribute Value)</td></tr></tbody></table><h3>基关系</h3><p>现在请回想一下本文第一章所讲述的一对一关系，在前面的范例中，相对于Admin关系来说，User关系就是一个基关系。</p><h3>继承关系</h3><p>子关系是相对于基关系而言的，相对于User来说，Admin关系就是一个继承关系。</p><p class="note"><strong>NOTE：</strong>本章仅为后面章节的说明提供预备知识，内容比较浅显，如果您对关系系统感兴趣，可以参考《离散数学》和《关系数据库系统概论》。</p><h2>对象 vs 关系</h2><p>如果我们现在要对&ldquo;汽车&rdquo;这一概念进行建模，它有四个属性：Name(车名)、Head(车头)、Body(车身)、Rear(车尾)。</p><h3>面向对象的做法</h3><p>我们首先定义一个 Car 类：</p><p class="Code">public class Car&#123;<br />public string Name;<br />public string Head;<br />public string Body;<br />public string Rear;<br /><br />public Car(name, head, body, rear)&#123;<br />this.Name = name;<br />this.Head = head;<br />this.Body = body;<br />this.Rear = rear;<br />&#125;<br />&#125;</p><p>当我们需要一辆宝马(BMW)、一辆奔驰(MB)、一辆奥迪(Audi)的时候：</p><p class="Code">Car BMW = new Car(&quot;宝马&quot;, &quot;宝马车头&quot;, &quot;宝马车身&quot;, &quot;宝马车尾&quot;);<br />Car MB = new Car(&quot;奔驰&quot;, &quot;奔驰车头&quot;, &quot;奔驰车身&quot;, &quot;奔驰车尾&quot;)<br />Car Audi = new Car(&quot;奥迪&quot;, &quot;奥迪车头&quot;, &quot;奥迪车身&quot;, &quot;奥迪车尾&quot;)</p><p class="note"><strong>NOTE：</strong>上面这个例子实际并不合适，你可以将CarHead、CarBody想象成还拥有各自属性的实体类。</p><h3>关系数据库的做法</h3><p>建四张表，分别为：CarName、CarHead、CarBody、CarRear，然后将三辆车分成四个部分，将每个部分分别放置到合适的表中，需要用的时候，再进行组装。</p><h3>问题提出</h3><p>如果仅仅只是如此而已，问题似乎很容易解决：让类的属性去对应数据库中表的字段。</p><p>现在，请回想之前面向对象基础那一节的内容，对象不仅仅只有属性而已，还包括 行为、封装、继承、联系 等复杂特性。它们并不能够在数据库中找到良好的对应，这样的问题该如何解决呢？</p><p>限于篇幅，本文就介绍的这里，更多的内容将在后续文章中讲述。</p><h2>总结</h2><p>在本文中，我们首先了解了什么是一对一关系 以及 如何实现一对一关系。</p><p>随后我们对 面向对象 和 关系系统 的基础概念和理论做了复习和回顾。</p><p>最后，我们结合之前介绍的知识，提出了在软件开发中面向对象与关系系统之间存在的差异。</p><p>希望本文能给你带来帮助。<br /><br /><span style="font-size: small">原文：</span><a href="http://www.cnblogs.com/JimmyZhang/archive/2007/10/03/913337.html"><span style="font-size: small">http://www.cnblogs.com/JimmyZhang/archive/2007/10/03/913337.html</span></a><br /></p>
]]>
</description>
</item><item>
<link>http://www.gaoolp.com/read.php/299.htm</link>
<title><![CDATA[BOM 隐藏字符，PHP的大麻烦]]></title> 
<author>gaoolp &lt;gaoolp@126.com&gt;</author>
<category><![CDATA[生活随笔]]></category>
<pubDate>Fri, 11 Feb 2011 09:35:07 +0000</pubDate> 
<guid>http://www.gaoolp.com/read.php/299.htm</guid> 
<description>
<![CDATA[ 
	如果您在修改任何PHP文件後发生：<br />&nbsp;　　* 不能登入或者不能登出；<br />&nbsp;　　* 页顶出现一条空白；<br />&nbsp;　　* 页顶出现错误警告；<br />&nbsp;　　* 其它不正常的情况。<br />&nbsp;　　则多半是<span style="color: #136ec2">编辑器</span>的问题。<br />&nbsp;　　现在几乎所有的文本编辑软件都可以显示并编辑UTF-8编码的文件。但是很遗憾，其中很多软件的表现并不理想。<br />&nbsp;　　类似WINDOWS自带的<span style="color: #136ec2">记事本</span>等软件，在保存一个以UTF-8编码的文件时，会在文件开始的地方插入三个不可见的字符（0xEF 0xBB 0xBF，即BOM）。它是一串隐藏的字符，用于让记事本等编辑器识别这个文件是否以UTF-8编码。对于一般的文件，这样并不会产生什么麻烦。但对于 PHP来说，BOM是个大麻烦。<br />&nbsp;　　PHP并不会忽略BOM，所以在读取、包含或者引用这些文件时，会把BOM作为该文件开头正文的一部分。根据嵌入式语言的特点，这串字符将被直接执行（显示）出来。由此造成即使页面的 top padding 设置为0，也无法让整个网页紧贴浏览器顶部，因为在html一开头有这3个字符呢！<br />&nbsp;　　最大的麻烦还不是这个。受COOKIE送出机制的限制，在这些文件开头已经有BOM的文件中，COOKIE无法送出（因为在COOKIE送出前PHP已经送出了文件头），所以登入和登出功能失效。一切依赖COOKIE、SESSION实现的功能全部无效。<br />&nbsp;　　因此，在编辑、更改任何文本文件时，请务必使用不会乱加BOM的编辑器。Linux下的编辑器应该都没有这个问题。WINDOWS下，请勿使用记事本等编辑器。推荐的编辑器是： Editplus 2.12版本以上； EmEditor； UltraEdit（需要取消&lsquo;添加BOM&rsquo;的相关选项）； Dreamweaver（需要取消&lsquo;添加BOM&rsquo;的相关选项）等。<br />&nbsp;　　对于已经添加了BOM的文件，要取消的话，可以用以上编辑器另存一次。（Editplus需要先另存为gb，再另存为UTF-8。）不过有时候不会显 。<br/>Tags - <a href="http://www.gaoolp.com/go.php/tags/bom/" rel="tag">bom</a>
]]>
</description>
</item>
</channel>
</rss>
