<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>SLJ.me - 申力军 &#187; PHP</title>
	<atom:link href="http://slj.me/category/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://slj.me</link>
	<description>申力军的博客</description>
	<lastBuildDate>Mon, 05 Dec 2011 05:35:19 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1</generator>
		<item>
		<title>疯狂的 Web 应用开源项目</title>
		<link>http://slj.me/2011/08/web-open-source-project/</link>
		<comments>http://slj.me/2011/08/web-open-source-project/#comments</comments>
		<pubDate>Thu, 11 Aug 2011 02:58:10 +0000</pubDate>
		<dc:creator>SLJ</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[开源]]></category>

		<guid isPermaLink="false">http://slj.me/?p=2249</guid>
		<description><![CDATA[下面是一个Web应用的开源列表。没什么可说的，太疯狂了。尤其是Web 2.0那一堆。我不知道你怎么想，有些开源项目的源码写得挺不好的，尤其是性能方面。或许你会以为改一改他们就可以成为为自己所用，不过，改这些开源的项目还真不容易。玩玩还可以。 数字媒体 相册（Flickr, Picasa） Gallery，基于PHP + MySQL的Web相册。非常易于使用，包括一个配置向导，对于相片的操作包括自动生成缩略图、相片的大小改变、选择、排序等。 Piwigo，基于PHP + MySQL。配备了强大的功能，发布和管理您的照片，可扩展性和智能浏览功能，如类别，标签，或年表。这是网络和照片的标准要求。扩展使Piwigo更可扩展性和可定制的。 UberGallery，一个简单易用的相册。PHP。不需要数据库。 Zenphoto，一个简单的web相册程序,它能够简单的展示你的图片，并含有你所需要的所有功能和特点。可以和Wordpress集成。 视频（YouTube） Flowplayer，一个用Flash开发的在Web上的视频播放器，可以很容易将它集成在任何的网页上。支持HTTP以及流媒体传输。 Plumi，一个建立在Plone 内容管理系统上的视频分享系统，可帮助你轻松建立视频分享网站。 音乐电台社区（last.fm, ulike） Libre.fm，对Last.fm 的克隆。 视频电影社区（netflix, criticker） Filmaster，fileaster.com的源码。 书（LibraryThing, Shelfari, Goodreads） O’Reilly Bookworm，在线电子图书阅读。 期刊参考论文数据库（Emerald Insight, Springer Link） CiteSeerX，采用机器自动识别技术搜集网上以Postscrip和PDF文件格式存在的学术论文，然后依照引文索引方法标引和链接每一篇文章。（其是CiteSeer的换代产品。1997年，CiteSeer引文搜索引擎由NEC公司在美国普林斯顿研究所的三位研究人员Steve Lawrence, Lee Giles和Kurt Bollacker研制开发。它是利用自动引文标引系统ACI（Autonomous Citation Indexing）建立的第一个科学文献数字图书馆（Scientific Literature Digital Library））。 地图（Google Maps） OpenStreetMap，一个可供自由编辑的世界地图，它是由所有的用户创造的。OpenStreetMap允许您查看，编辑或者使用世界各地的地理数据来帮助您。其就像Wikipedia一样，全世界的人都可以编辑，据说其上面的数据超过了政府的数据。当然，目前其参与的人数还不够，大量的地方都是白板。 文件存储 文件共享/同步（DropBox, drop.io, Ubuntu One） Tahoe Least-Authority Filesystem，一个云存储分布式文件系统。 iFolder，一个简单安全的存储解决方案，可在计算机间文件的同步和分享。可以用来随时备份本地的文件。 [...]]]></description>
			<content:encoded><![CDATA[<p>下面是一个Web应用的开源列表。没什么可说的，太疯狂了。尤其是Web 2.0那一堆。我不知道你怎么想，有些开源项目的源码写得挺不好的，尤其是性能方面。或许你会以为改一改他们就可以成为为自己所用，不过，改这些开源的项目还真不容易。玩玩还可以。</p>
<h3><strong>数字媒体</strong></h3>
<p><strong>相册</strong>（Flickr, Picasa）</p>
<ul>
<li><span><a rel="external nofollow" href="http://gallery.menalto.com/">Gallery</a></span>，基于PHP + MySQL的Web相册。非常易于使用，包括一个配置向导，对于相片的操作包括自动生成缩略图、相片的大小改变、选择、排序等。</li>
<li><span><a rel="external nofollow" href="http://piwigo.org/">Piwigo</a></span>，基于PHP + MySQL。配备了强大的功能，发布和管理您的照片，可扩展性和智能浏览功能，如类别，标签，或年表。这是网络和照片的标准要求。扩展使Piwigo更可扩展性和可定制的。</li>
<li><span><a rel="external nofollow" href="http://www.ubergallery.net/">UberGallery</a></span>，一个简单易用的相册。PHP。不需要数据库。</li>
<li><span><a rel="external nofollow" href="http://www.zenphoto.org/">Zenphoto</a></span>，一个简单的web相册程序,它能够简单的展示你的图片，并含有你所需要的所有功能和特点。可以和Wordpress集成。</li>
</ul>
<p><strong>视频</strong>（YouTube）</p>
<ul>
<li><span><a rel="external nofollow" href="http://www.flowplayer.org/">Flowplayer</a></span>，一个用Flash开发的在Web上的视频播放器，可以很容易将它集成在任何的网页上。支持HTTP以及流媒体传输。</li>
<li><span><a rel="external nofollow" href="http://blog.plumi.org/">Plumi</a></span>，一个建立在Plone 内容管理系统上的视频分享系统，可帮助你轻松建立视频分享网站。</li>
</ul>
<p><span id="more-2249"></span></p>
<p><strong>音乐电台社区</strong>（last.fm, ulike）</p>
<ul>
<li><span><a rel="external nofollow" href="http://libre.fm/">Libre.fm</a></span>，对Last.fm 的克隆。</li>
</ul>
<p><strong>视频电影社区</strong>（netflix, criticker）</p>
<ul>
<li><span><a rel="external nofollow" href="http://filmaster.com/">Filmaster</a></span>，fileaster.com的源码。</li>
</ul>
<p><strong>书</strong>（LibraryThing, Shelfari, Goodreads）</p>
<ul>
<li><span><a rel="external nofollow" href="http://bookworm.oreilly.com/">O’Reilly Bookworm</a></span>，在线电子图书阅读。</li>
</ul>
<p><strong>期刊参考论文数据库</strong>（Emerald Insight, Springer Link）</p>
<ul>
<li><span><a rel="external nofollow" href="http://citeseerx.ist.psu.edu/">CiteSeerX</a></span>，采用机器自动识别技术搜集网上以Postscrip和PDF文件格式存在的学术论文，然后依照引文索引方法标引和链接每一篇文章。（其是CiteSeer的换代产品。1997年，CiteSeer引文搜索引擎由NEC公司在美国普林斯顿研究所的三位研究人员Steve Lawrence, Lee Giles和Kurt Bollacker研制开发。它是利用自动引文标引系统ACI（Autonomous Citation Indexing）建立的第一个科学文献数字图书馆（Scientific Literature Digital Library））。</li>
</ul>
<p><strong>地图</strong>（Google Maps）</p>
<ul>
<li><span><a rel="external nofollow" href="http://www.openstreetmap.org/">OpenStreetMap</a></span>，一个可供自由编辑的世界地图，它是由所有的用户创造的。OpenStreetMap允许您查看，编辑或者使用世界各地的地理数据来帮助您。其就像Wikipedia一样，全世界的人都可以编辑，据说其上面的数据超过了政府的数据。当然，目前其参与的人数还不够，大量的地方都是白板。</li>
</ul>
<h3><strong>文件存储</strong></h3>
<p><strong>文件共享/同步</strong>（DropBox, drop.io, Ubuntu One）</p>
<ul>
<li><span><a rel="external nofollow" href="http://tahoe-lafs.org/trac/tahoe-lafs/">Tahoe Least-Authority Filesystem</a></span>，一个云存储分布式文件系统。</li>
<li><span><a rel="external nofollow" href="http://www.kablink.org/ifolder/">iFolder</a></span>，一个简单安全的存储解决方案，可在计算机间文件的同步和分享。可以用来随时备份本地的文件。</li>
</ul>
<p><strong>存储</strong>（Amazon S3, Imageshack, Box, Variety of models）</p>
<ul>
<li><span><a rel="external nofollow" href="http://search.cpan.org/~jesse/Prophet-0.72/">Jesse Vincent’s Prophet</a></span>，你可以看看他的<span><a rel="external nofollow" href="http://search.cpan.org/~jesse/Prophet-0.72/lib/Prophet/Manual.pod">文档介绍</a></span>吧。</li>
</ul>
<p><strong>在线文件编辑</strong>（Google Docs）</p>
<ul>
<li><span><a rel="external nofollow" href="https://abicollab.net/">AbiCollab</a></span>，基于AbiWord的社群的线上文书处理协作服务。</li>
<li><span><a rel="external nofollow" href="http://etherpad.org/">Etherpad</a></span>，基于开放软体的线上文书处理服务，最大的特色在于多人即时共同协作一份文件，软体组织不直接提供服务，而是透过其他没有连系的组织网站提供。</li>
</ul>
<p><strong>虚拟机供应</strong>（Amazon EC2）</p>
<ul>
<li><span><a rel="external nofollow" href="http://www.open.eucalyptus.com/">Eucalyptus (computing)</a></span>，是一用来通过计算集群或工作站群实现弹性的、实用的云计算。它最初是美国加利福尼亚大学 Santa Barbara 计算机科学学院的一个研究项目，现在已经商业化，发展成为了 Eucalyptus Systems Inc。不过，Eucalyptus 仍然按开源项目那样维护和开发。Eucalyptus Systems 还在基于开源的 Eucalyptus 构建额外的产品；它还提供支持服务。</li>
<li><span><a rel="external nofollow" href="http://www.globus.org/">Globus Toolkit</a></span>，Globus项目工具包，其可以在计算机上提供稳定、安全和对等网络的分布式运算，集群和其它高性能系统功能。</li>
<li><span><a rel="external nofollow" href="http://www.opennebula.org/">OpenNebula</a></span>，一个虚拟基础设备引擎， 用来动态布署虚拟机器在一群实体资源上，OpenNEbula 最大的特色在于将虚拟平台从单一实体机器到一群实体资源。</li>
</ul>
<h3><strong>内容服务</strong></h3>
<p><strong>Wiki</strong>（Wikispaces）</p>
<ul>
<li><span><a rel="external nofollow" href="http://www.dokuwiki.org/dokuwiki/">Dokuwiki</a></span>，一个针对小公司文件需求而开发的Wiki引擎。DokuWiki是用程序设计语言PHP开发的并以GPL 2发布。DokuWiki基于文本存储，所以不需要数据库，其数据文件在Wiki系统外也是可读的。DokuWiki的功能齐全，支持UTF-8，最新版支持中文链接。能够单独编辑页面中的某个章节，能够自动生成目录，适合中小企业、个人使用，用作资料归档、指南、读书笔记等。DokuWiki安装很简单，默认提供配置工具。</li>
<li><span><a rel="external nofollow" href="http://www.mediawiki.org/wiki/MediaWiki/">Mediawiki</a></span>，是一套基于网络的Wiki引擎，维基媒体基金会的所有项目乃至众多wiki网站皆采用了这一软件。MediaWiki软件最初是为自由内容百科全书维基百科所开发，今日已被一些公司机构部署为内部的知识管理和内容管理系统。Novell甚而还在多个高流量的网站中使用了该软件。</li>
<li><span><a rel="external nofollow" href="https://github.com/rongarret/microWiki/">μWiki</a></span>，一个小巧而功能齐全的wiki，所有的代码才3500行，可通过facebook和openID认证。</li>
</ul>
<p><strong>出版</strong></p>
<ul>
<li><span><a rel="external nofollow" href="http://www.topazproject.org/trac/">Topaz</a></span></li>
<li><span><a rel="external nofollow" href="http://www.ambraproject.org/">Ambra</a></span>，是一个期刊管理与发布系统。它具有一个高容量、高效、经济的系统来在所有科学领域发表研究文章。</li>
<li><span><a rel="external nofollow" href="http://pkp.sfu.ca/?q=ojs/">Open Journal Systems</a></span>，简称OJS，此系统是一个开源码的期刊管理与出版软件，由公共知识项目(PKP; Public Knowledge Project)研发与支持。（<span><a rel="external nofollow" href="http://www.chinajol.info/">中国肺癌杂志</a></span>使用了这个系统）</li>
</ul>
<p><strong>Blog</strong></p>
<ul>
<li><span><a rel="external nofollow" href="http://wordpress.org/">WordPress</a></span>，这个不用说了吧。</li>
<li><span><a rel="external nofollow" href="http://www.livejournal.com/">LiveJournal</a></span>，一个综合型SNS交友网站，有论坛，博客等功能，Brad Fitzpatrick始建于1999年4月15日，目的是为了与同学保持联系，之后发展为大型网络社区平台，是网友聚集的好地方，LJ支持多国语言，ALEXA综合排名84 ，日均访客可达6,288,000以上</li>
</ul>
<p><strong>微博</strong> （Twitter）</p>
<ul>
<li><span><a rel="external nofollow" href="http://jisko.org/">Jisko</a></span>，界面和Twitter很像，集成Twitter同步功能，它能够自动将你在Jisko平台上发布的内容发表到您的Twitter账户上。也能够自动读取您的Twitter更新，但是并不能将这些内容发布到Jisko平台，只能在自己的好友Timeline里查看。Jisko平台还能够连接您的Jabber/GTalk账户，让您通过IM发帖。并且有数个缩链服务供选择，十分实用。</li>
<li><span><a rel="external nofollow" href="http://www.jaiku.com/">Jaiku Engine</a></span>，Google曾经收购的类Twitter平台Jaiku现在已经完全开源并且切换AppEngine上运行，早前Google曾经宣布停止Jaiku等项目的维护和开发，现在更将Jaiku完全开源提供用户免费下载，所有人都可以在自己的主机上建立和运行自己的Jaiku应用了。</li>
<li><span><a rel="external nofollow" href="http://status.net/">Status.net</a></span>，一个开源微博服务。同时，它又可将信息同步到Twitter。所以我们也可以把它理解为“开源的Twitter客户端”。但它与客户端又有本质的不同：拥有自己的数据库，只是把数据同步到推特而已。</li>
</ul>
<p><strong>网页访问量统计</strong>（Google Analytics）</p>
<ul>
<li><span><a rel="external nofollow" href="http://en.wikipedia.org/wiki/Piwik">Piwik</a></span>，一套基于Php+MySQL技术构建，能够与Google Analytics相媲美的开源网站访问统计系统，前身是phpMyVisites。Piwik可以给你详细的统计信息，比如网页浏览人数, 访问最多的页面, 搜索引擎关键词等等，并且采用了大量的AJAX/Flash技术，使得在操作上更加便易。此外，它还采用了插件扩展及开放API架构，可以让开发人员根据自已的实际需求创建更多的功能．</li>
<li><span><a rel="external nofollow" href="http://www.openwebanalytics.com/">Open Web Analytics</a></span>，一个开源的网站流量统计系统。基于PHP/Open Flash Chart/Ajax技术开发，既可以单独使用也可以与WordPress、Gallery&amp;MediaWiki集成使用。支持多个网站，集成Google Maps，RSS/Atom订阅跟踪等功能。</li>
</ul>
<p><strong>虚拟主机平台</strong>（Google AppEngine）</p>
<ul>
<li><span><a rel="external nofollow" href="http://code.google.com/p/appscale/">AppScale</a></span>，是一个平台，允许用户发布和托管自己的 Google App Engine 的应用程序。支持 Python, Java, and Go Google App Engine 平台。</li>
</ul>
<p><strong>办公</strong>（Google Docs）</p>
<ul>
<li><span><a rel="external nofollow" href="http://www.zimbra.com/products/zimbra-open-source.html">Zimbra Collaboration Suite</a></span>，其英文缩写为ZCA。全功能的通信及协作办公应用程序，提供可靠和高效能的邮件、地址簿、效率手册、任务列表以及网络文档制作功能。</li>
<li><span><a rel="external nofollow" href="http://www.phpgroupware.org/">PHPGroupware</a></span>，功能强大，基于Web的Messaging ，Collaboration和企业管理平台。phpGroupWare包含50多个模块可根据你的需求进行搭配与组合。它提供了约50种基于网络的应用，有日历，通讯录，先进的项目经理，待办事项列表，笔记，电子邮件，新闻组和新闻阅读器，一个文件管理器和更多应用。</li>
<li><span><a rel="external nofollow" href="http://fengoffice.com/web/index.php/">OpenGoo,Fengoffice</a></span>，基于ExtJs+XAMP（Apache、PHP、MySQL）开发的开源web office。它具备了主流在线协作系统所应具备的所有功能，包括任务管理、日程管理、文件管理、联系人管理以及email收发功能。其文件管理模块，实现了文件版本管理的功能，能够方便的查找、下载同一文件的不同版本。适用于任何单位或个人创建，共享，协作维护和发布它们所有内部与外部文档。</li>
<li><span><a rel="external nofollow" href="http://crabgrass.riseuplabs.org/">Crabgrass</a></span>，社会网络，小组协作，网络组织的Web应用程序。它由一组协作工具固体套件，如私人维基，任务列表，文件库，和决策工具。程序目前正在做了大量的用户界面改革，更完善的社会网络工具，博客和活动日程，以及更好的协作和决策制定各独立团体的支持。</li>
<li><span><a rel="external nofollow" href="http://etherpad.org/">Etherpad</a></span>，由两位Google 前员工所开发，已被Google 收购成为开放原始码项目。主要功能是让多个使用者透过网路来共同编辑一份文件，与先前介绍过的Sync.in 好用的线上即时文件协作平台类似。EtherPad 无须注册就能使用，建立文件后会产生一个网址，其它用户可以透过该网址与你编辑同一份文件，并标记出不同用户所编辑的位置，也有提供汇入汇出及时间轴等功能。</li>
</ul>
<h3><strong>Groupware群件</strong></h3>
<p><strong>Webmail</strong> (gmail, hotmail)</p>
<ul>
<li><span><a rel="external nofollow" href="http://www.zimbra.com/">Zimbra</a></span>，强大的开源协同办公套件包括WebMail，日历，通信录，Web文档管理和创作。它最大的特色在于其采用Ajax技术模仿CS桌面应用软件的风格开发的客户端兼容Firefox,Safari和IE浏览器。</li>
<li><span><a rel="external nofollow" href="http://roundcube.net/">Roundcube</a></span>，支持多国语言的IMAP客户端，操作界面看起像一个桌面应用程序。它提供一个e-mail客户端应该具备的所有功能包括MIME支持,地址薄，文件夹操作，信息搜索和拼写检查。RoundCube Webmail采用PHP+Ajax开发并且需要MySQL数据库来存储数据。 用户界面采用XHTML+CSS2设计。</li>
<li><span><a rel="external nofollow" href="http://www.conjoon.org/">conjoon</a></span>，基于Ext JS+PHP/MySQL开发的Webmail和RSS客户端阅读器。此外还包含一个联系人管理模块。</li>
<li><span><a rel="external nofollow" href="http://www.tdah.us/">Tdah</a></span>，一个PHP Webmail系统。该系统采用POP3协议收邮件，可以配置使用SMTP、PHP mail、Sendmail或Qmail来发送邮件。T-dah还包含以下几个模块：事件日历、群组聊天、文件夹管理、邮件搜索等。T-dah使用 TinyMCE WYSIWYG编辑器来创建新邮件。</li>
<li><span><a rel="external nofollow" href="https://funambol.com/">Funambol</a></span>，世界领先的开源云同步和PUSHMAIL工具，支持诸多手提移动设备，包括苹果、黑莓、Android、Windows Mobile、索爱、三星、诺基亚等20余款。</li>
<li><span><a rel="external nofollow" href="http://www.hastymail.org/">Hastymail</a></span>，一个使用方便快捷、安全，跨平台的IMAP/SMTP客户端。采用PHP语言编写，运行于PHP+MYSQL平台环境。提供一个简洁的Web界面来发送和读取E-mail。</li>
<li><span><a rel="external nofollow" href="http://www.xuheki.com/">Xuheki</a></span>，一个很快的IMAP 使用AJAX 技术开发的客户端。你能想到的功能它基本上都有了。</li>
<li><span><a rel="external nofollow" href="http://www.claros.org/">Claros</a></span>，一个比较简单的，采用pop3/smtp收发邮件的webMail系统。不需要数据库的支持。提供一个独立于SMTP服务器的垃圾邮件过滤机制。</li>
</ul>
<p><strong>Email 服务器</strong>（MS Exchange）</p>
<ul>
<li><span><a rel="external nofollow" href="http://archiveopteryx.org/">Archiveopteryx</a></span>，一个互联网归档邮件服务器，支持强大的归档功能。可以运行在Linux, FreeBSD, NetBSD, OpenBSD 和 Mac OS X。</li>
<li><span><a rel="external nofollow" href="http://roundcube.net/">Roundcube</a></span>，提供一个e-mail客户端应该具备的所有功能包括MIME支持,地址薄，文件夹操作，信息搜索和拼写检查。RoundCube Webmail采用PHP+Ajax开发并且需要MySQL数据库来存储数据。 用户界面采用XHTML+CSS2设计。</li>
<li><span><a rel="external nofollow" href="http://www.squirrelmail.org/">Squirrelmail</a></span>，一款由PHP语言编写，基于标准的webmail软件包。它包括内建的纯PHP支持的IMAP和SMTP协议，所生成的页面绝对支持HTML4.0标准(无需JavaScript支持)，这样可以运行在更多的平台和更多的浏览器上。它的系统安装要求非常低，但是非常容易安装和配置。SquirrelMail拥有你的客户端邮件程序所拥有的一切，比如增强型的MIME支持、地址薄、文件夹操作等等功能。</li>
<li><span><a rel="external nofollow" href="http://www.horde.org/">Horde Groupware Suite</a></span>，一个强大的邮件办公套件。</li>
</ul>
<p><strong>邮件列表</strong> （Google Groups, Yahoo Groups）</p>
<ul>
<li><span><a rel="external nofollow" href="http://www.freelists.org/">Freelists</a></span></li>
<li><span><a rel="external nofollow" href="http://www.gnu.org/software/mailman/index.html">Mailman</a></span>，管理电子信箱讨论和自由软件电子通讯清单。 支持内置的归档，自动退回处理，内容过滤，消化交货，垃圾邮件过滤器等。</li>
</ul>
<p><strong>论坛</strong> （vBulletin）（注：国内的主要是用Discuz!）</p>
<ul>
<li><span><a rel="external nofollow" href="http://www.phpbb.com/">phpBB</a></span>，中文的在这里<span><a rel="external nofollow" href="http://www.phpbbchina.com/">http://www.phpbbchina.com</a></span></li>
<li><span><a rel="external nofollow" href="http://www.phorum.org/">Phorum</a></span>，基于PHP+MySQL开发的开源论坛项目。它的特点是速度快，功能强大，面向模块化设计，安装简单。此外Phorum还集成电子报。</li>
<li><span><a rel="external nofollow" href="http://www.vanillaforums.org/">Vanilla</a></span>，是很多外国牛人都在用的一款开源论坛程序，它不像我们熟知的phpBB之类的或是类似我国discuz，phpwind的模式，而是采取了全新的内核和界面，界面类似于stackflow，所以用它来做一个社交性的问答网站也是个不错的选择。</li>
<li><span><a rel="external nofollow" href="http://sourceforge.net/projects/ospo/">Ospo</a></span>，是一项开源社交门户站点方案。它拥有标准功能（添加、删除好友，前十排行榜），论坛整合、音乐模块（带有艺术家目录的专辑和歌曲）、广播心情整合、日志（添加、删除、修改、检查）等等众多功能。</li>
</ul>
<p><strong>日历</strong>（cf, 30boxes, Google calendars, ScheduleWorld）</p>
<ul>
<li><span><a rel="external nofollow" href="http://www.zimbra.com/products/zimbra-open-source.html">Zimbra Collaboration Suite</a></span>，功能的通信及协作办公应用程序，提供可靠和高效能的邮件、地址簿、效率手册、任务列表以及网络文档制作功能。</li>
<li><span><a rel="external nofollow" href="http://www.k5n.us/webcalendar.php/">Web Calendar</a></span>，一款漂亮的Flash日历，可以添加在网页上，它可以高亮显示事件，会议，节假日的日期。</li>
<li><span><a rel="external nofollow" href="https://www.forge.funambol.org/DomainHome.html">Funambol</a></span>，世界领先的开源云同步和PUSHMAIL工具，支持诸多手提移动设备，包括苹果、黑莓、Android、Windows Mobile、索爱、三星、诺基亚等20余款。</li>
<li><span><a rel="external nofollow" href="https://dev.joyent.com/projects/connector/wiki/Connector/">Joyent Connector</a></span>，免费提供Office 2.0的功能，如团队电子邮件、日程安排、相互联系、文档和书签。</li>
<li><span><a rel="external nofollow" href="http://www.horde.org/apps/kronolith/">Horde Groupware Suite</a></span>，协同办公套件。</li>
</ul>
<p><strong>会议和评审管理</strong></p>
<ul>
<li><span><a rel="external nofollow" href="http://www.openconf.com/">Openconf</a></span>，开源的会议管理系统，主要提供以下功能：电子提交、评审、论文答辩，以及会议主席对整个过程的管理等。</li>
<li><span><a rel="external nofollow" href="http://myreview.lri.fr/">MyReview</a></span>，学术会议的论文提交和论文评审。</li>
<li><span><a rel="external nofollow" href="http://www.easychair.org/">EasyChair</a></span>，会议管理系统。</li>
<li><span><a rel="external nofollow" href="http://borbala.com/cyberchair/">CyberChair</a></span>，论文提交和评审系统。</li>
<li><span><a rel="external nofollow" href="http://lasecwww.epfl.ch/iChair/">iChair</a></span>，会议系统，支持论文提交，评审，讨论等。</li>
<li><span><a rel="external nofollow" href="http://indico-software.org/">Indico</a></span>，会议计划，组织，支持从简单到复杂的会议。</li>
<li><span><a rel="external nofollow" href="http://www.oschina.net/p/icecore">ICEcore</a></span>，开放团队合作软件使用社交联网统一团队工作空间、实时网络会议、项目管理、实践团体以及远程操作。</li>
</ul>
<p><strong>反馈</strong>（Pollmonkey, Google Forms）</p>
<ul>
<li><span><a rel="external nofollow" href="http://www.limesurvey.org/">Limesurvey</a></span>，前身为PHPSurveyor）是一款在线问卷调查程序，它用PHP语言编写并可以使用MySQL，PostgreSQL或者MSSQL等多种数据库，它集成了调查程序开发、调查问卷的发布以及数据收集等功能，使用它，用户不必了解这些功能的编程细节。</li>
</ul>
<p><strong>其它</strong></p>
<ul>
<li><span><a rel="external nofollow" href="http://www.barnraiser.org/aroundme/">AROUNDMe</a></span>，可以创建像Ning, Myspace, Yahoo or Google groups一样的合作网站。每个群组可以创建多个网页，网页上包括留言簿、博客、论坛、维基百科等功能。每个群组还可以通过xHTML, CSS, JavaScript and PHP来进行自定义。</li>
<li><span><a rel="external nofollow" href="http://interactome.org/">InteractOLE</a></span>，是一款网络学习的递交和支持平台。与其他在线学习平台不同，InteractOLE致力于教学与学习的社交和互动方面，而不是向学生们学习内容的提供。</li>
</ul>
<h3><strong>纯Web 2.0服务</strong></h3>
<p><strong>Feed操作</strong>（Yahoo Pipes）</p>
<ul>
<li><span><a rel="external nofollow" href="http://pipes.deri.org/">Deri Pipes</a></span>，像Yahoo Pipes一样，可视化的在线编程工具，它是一个用于过滤、转换和聚合网页内容的服务。</li>
</ul>
<p><strong>Feed 聚合</strong>（Bloglines, Google Reader）</p>
<ul>
<li><span><a rel="external nofollow" href="http://newsblur.com/">Newsblur</a></span>，像Google Reader一样的一个RSS在线阅读器。</li>
<li><span><a rel="external nofollow" href="http://rsslounge.aditu.de/">rsslounge</a></span>，基于PHP+MySQL开发的RSS供稿阅读器。可以分类，过滤供稿，设置优先权。除标准的供稿项目之外，还支持图片/照片。</li>
<li><span><a rel="external nofollow" href="http://tt-rss.org/redmine/">Tiny Tiny RSS</a></span>，基于Web的RSS/Atom新闻聚合器。它的UI基于Ajax技术开发所以看起非常像一个桌面应用程序。</li>
<li><span><a rel="external nofollow" href="http://getlilina.org/">Lilina</a></span>，一个开源的RSS新闻聚合器实现，功能强大，方便易用，而且最大的好处是不需要数据库支持。</li>
<li><span><a rel="external nofollow" href="http://openwebreader.org/">OpenWebReader</a></span>，多用户的RSS聚合阅读。</li>
<li><span><a rel="external nofollow" href="http://sourceforge.net/projects/gregarius/">Gregarius</a></span>，RSS/RDF/ATOM新闻聚合器支持OPML导入/导出，XHTML/CSS输出。它包含一个基于Ajax的itemtagging系统。</li>
<li><span><a rel="external nofollow" href="http://cheetah-news.com/">Cheetah News</a></span>，利用AJAX技术构建的RSS阅读器，完美支持中文。</li>
<li><span><a rel="external nofollow" href="http://www.oschina.net/p/memephage">Memephage</a></span>，是一种自动化网络日志。它能搜集并总结从不同地方收集来的连接，目前是从IRC, 社交MUD，邮件和浏览器中搜集，并使用POE多任务处理和网络框架。</li>
<li><span><a rel="external nofollow" href="http://sourceforge.net/projects/ozcode/">Ozcode</a></span>，是Ozmozr.com背后的源代码, 一个微型RSS聚合器，可以进行网络社交、信息分享、身份聚合与展示的网站。</li>
</ul>
<p><strong>社区聚合</strong>（FriendFeed）</p>
<ul>
<li><span><a rel="external nofollow" href="http://identi.ca/">Identi.ca</a></span>，一个新的微网志服务, 其实现在微博服务真的是很多了, 不过这个比较特别一点的是, identi.ca 用PHP 开发, 可以用jabber/GTalk, 也可以用openid 来登录，主要的是，其是开源项目。</li>
<li><span><a rel="external nofollow" href="http://noserub.com/">Noserub</a></span>，提供的建站程序，可以创建属于你的微型门户，包括 Blog、网络摘录、图片分享、视频、Twitter 等等的，都可以罗列出来，并且通过 RSS 实时更新内容，你的朋友们可以方便的获知你在网络里经常去哪里，最近在关注一些什么，做些什么，想些什么。</li>
</ul>
<p><strong>社区新闻</strong>（digg）</p>
<ul>
<li><span><a rel="external nofollow" href="http://meneame.net/">Meneame</a></span>，程序是类似Digg的西班牙程序，网址是<span><a rel="external nofollow" href="http://websvn.meneame.net/">http://websvn.meneame.net/</a></span></li>
<li><span><a rel="external nofollow" href="http://pligg.com/">Pligg</a></span>，最灵活的类似Digg的Web2.0 CMS系统！网页设计师可以使用Pligg做他(她)想做的任何事情。稍微懂一些PHP和Mysql的知识即可安装Pligg。</li>
<li><span><a rel="external nofollow" href="http://drupal.org/project/drigg/">Drigg</a></span>，基于Drupal 构建的PHP的Digg网站系统。</li>
<li><span><a rel="external nofollow" href="http://www.reddit.com/">Reddit</a></span>，其源码和文档在这里：<span><a rel="external nofollow" href="https://github.com/reddit/reddit">https://github.com/reddit/reddit</a></span></li>
<li><span><a rel="external nofollow" href="http://sourceforge.net/projects/communitynews/">CommunityNews</a></span>，通过使用社交书签和贝叶斯定理技术向博客定期提供记录。用户可以通过投票支持或反对RSS来源以支持那些受欢迎的资源。</li>
<li><span><a rel="external nofollow" href="http://opensource.newscloud.com/">NewsCloud</a></span>，是一款基于NewsCloud.com专为平民新闻业和社会新闻网络设计的开源传媒平台。</li>
<li><span><a rel="external nofollow" href="http://jamss.sourceforge.net/">Jamss</a></span>，是基于Digg.com的社交新闻网站, 其通过PHP/MySQL运行。.Jamss 考虑到了行内意见和网络文章的评论，还可以灵活适应多种主题。</li>
</ul>
<p><strong>社区网络</strong>（Facebook, Twitter）</p>
<ul>
<li><span><a rel="external nofollow" href="http://portal.friendika.com/">Friendika</a></span>，一个由PHP+MySQL的免费应用程式(Open Source)，提供使用者一个单一的界面来控制社群网路服务。支援的社群网路应用服务包括Facebook，Twitter、WordPress、Blogger、Identi.ca、RSS订阅与电子邮件等等的整合服务。</li>
<li><span><a rel="external nofollow" href="https://joindiaspora.com/">Diaspora</a></span>，让你将您的关系分成多个视图（Google+的圈子），每个视图是您生活的不同部分。这是Diaspora首创，用来确保您的照片、经历和笑话，只与您所希望分享的人分享。</li>
<li><span><a rel="external nofollow" href="http://buddypress-es.com/">Buddypress</a></span>，是 WordPress 母公司的一个全新的开源程序，BuddyPress 从本质上说其实是 WordPress 的插件。BuddyPress 把 WordPress的关注点从博客转移到了社区。当然，用户还是能够使用WordPress的所有的博客功能，只是当用户使用 BuddyPress 时，第一要做的是创建他们个人档案，第二才是写博客。</li>
<li><span><a rel="external nofollow" href="http://foocorp.org/projects/social/">GNU Social</a></span>，GNU的SNS。</li>
<li><span><a rel="external nofollow" href="http://www.elgg.org/">Elgg</a></span>，一款免费开源的社会性网络脚本程序(php/mysql)，以BLOG为中心实现社会网络化，从社会性来讲：Elgg以兴趣为核心的社交平台。它包括网络日志、资料存储、RSS集合、个人档案、FOAF功能等等。</li>
<li><span><a rel="external nofollow" href="http://www.socialengine.net/index_vivalogo.php">SocialEngine</a></span>，是一款由PHP和Zend控制的网络软件，其脚本让你可以轻松地创建属于你自己社交网站或是在线社区，包括自定义群组、相册、消息、用户档案、视频、新闻订阅，拖放群集邮箱服务器等等功能。</li>
<li><span><a rel="external nofollow" href="http://www.isocial.in/">iSocial</a></span>，是一款免费社交网络脚本平台，你可以用它建立像Friendster和Orkut那样可以一键使用书签，约会和建立群组的社交网站。</li>
<li><span><a rel="external nofollow" href="http://mahara.org/">Mahara</a></span>，有着电子档案、网络日志、简历编辑工具、联系用户的社交网络系统以及建立在线社区的齐全功能。</li>
<li><span><a rel="external nofollow" href="http://sourceforge.net/projects/peepagg/">The PeopleAggregator</a></span>，是全新一代的社交网站系统，它力求应用开放的标准、密切的网络互动和强大的灵活性。</li>
<li><span><a rel="external nofollow" href="http://opensource.appleseedproject.org/">Appleseed</a></span>，是一款类似Friendster的社交网站软件。网站运行appleseed将互通，形成Appleseed的社交网站。该软件发展的重点是对隐私和安全，以及易用的配置。</li>
<li><span><a rel="external nofollow" href="http://www.mugshots.com/">Mugshot</a></span>，则通过一系列的WEB CRM、照片、日志等等让你时刻了解朋友们的最新动态。</li>
<li><span><a rel="external nofollow" href="http://code.google.com/p/clonesumating/">Clonesumating</a></span>，是<span><a rel="external nofollow" href="http://consumating.com/">CONSUMATING.COM</a></span>代码的开源版本， 其功能有用户档案、用户标签、配对并发现古怪标签合并、团队活动（比如每周照片评选、博客问答）、事件日历、PSS订阅等等。</li>
<li><span><a rel="external nofollow" href="http://www.bevolunteer.org/trac/">BeWelcom Rox</a></span>，是<span><a rel="external nofollow" href="http://www.bewelcome.org/">www.bewelcome.org</a></span>等其他社交网站的运作平台，它将人们真实地聚集了在一起。在那里人们了解全球村庄以及其他文化，分享自己的所在地，组织旅游，写旅游博客等等。</li>
<li><span><a rel="external nofollow" href="http://sourceforge.net/projects/openpne/">OpenPNE</a></span>，是由PHP写成的网络社交服务引擎，其功能有好友管理、好友邀请、日记、博客、订收件箱等等。</li>
<li><span><a rel="external nofollow" href="http://sourceforge.net/projects/worldspace/">WorldSpace</a></span>，是一款用户可拓展的共享虚拟空间，它致力于成为新一代的社交网络系统。</li>
<li><span><a rel="external nofollow" href="http://zoints.com/">Zoints</a></span>，这一款软件熟知在线社区是互联网中最重要的一部分，它所正是为帮助解决论坛版主所面临的三大问题（即获得会员，保留会员和盈利）而设计的。</li>
</ul>
<p><strong>社区书签</strong>（Delicious）</p>
<ul>
<li><span><a rel="external nofollow" href="http://en.wikipedia.org/wiki/Scuttle">Scuttle</a></span>，开源Web书签系统，允许多个用户在线存储，共享和Tag他们喜欢的链接。</li>
<li><span><a rel="external nofollow" href="http://sourceforge.net/projects/semanticscuttle/">Semantic Scuttle</a></span>，是一款基于Scuttle的社交书签工具。它可以试验像层次化标签、合作描述、OpenID认证这样的全新功能。</li>
<li><span><a rel="external nofollow" href="http://sourceforge.net/projects/sabrosus/">Sabros.us</a></span>，一个基于互联网的书签系统。它与del.icio.us 是相似，您能在网上处理您的书签, 或者自己建立一个网站。</li>
<li><span><a rel="external nofollow" href="http://www.connotea.org/">Connotea</a></span>，是 NGP(Nature Publishing Group) 旗下的网站，借鉴当前流行的 del.icio.us 等社会书签的创意，专注于科研领域，并可导入桌面文献管理软件的数据，是当前比较流行的一款在线文献管理工具。</li>
<li><span><a rel="external nofollow" href="https://github.com/alx/pressmark/">Pressmark</a></span></li>
<li><span><a rel="external nofollow" href="http://www.shiftspace.org/">Shiftspace</a></span>，让你的Wordpress成为像?<span><a rel="external nofollow" href="http://del.icio.us/">del.icio.us</a></span>,?<span><a rel="external nofollow" href="http://sabros.us/">sabros.us</a></span>这样的站点。</li>
<li><span><a rel="external nofollow" href="http://wwwhatsnew.com/2006/02/02/magnolia-algo-grande-llega-desde-el-mundo-de-los-bookmarks/">Ma.gnolia 2</a></span>，基于Ruby开发。它的界面比较漂亮，但速度比较慢，另外搜索仅限于tag。</li>
<li><span><a rel="external nofollow" href="http://sourceforge.net/projects/akarru">Akarru</a></span>，是一款用来建立像<span><a rel="external nofollow" href="http://www.blogmemes.com/">www.blogmemes.com</a></span>网站的社交书签引擎。用户可以通过投票系统在首页上张贴链接并推销链接。</li>
<li><span><a rel="external nofollow" href="http://www.shokk.com/blog/articles/category/monkeychow/">Monkey Chow</a></span>，是一款带有社交书签、主题文章、来源标签、OPML、文章搜索、编辑来源属性等等众多功能的新闻聚合浏览器。</li>
<li><span><a rel="external nofollow" href="http://feedmelinks.com/">Feed Me Links</a></span>，可以将你的书签存储在网上以便随时随地使用，输入你最喜爱的网址并和好友们分享，加标签来管理不同链接，还有更多新鲜事物等待你来发现。</li>
</ul>
<p><strong>短网址服务</strong>（TinyURL）</p>
<ul>
<li><span><a rel="external nofollow" href="https://gitorious.org/mencey/tinyull">tinyULL</a></span>，不是tinyURL，别看错了。</li>
</ul>
<h3><strong>身份和安全</strong></h3>
<p><strong>域名</strong></p>
<ul>
<li><span><a rel="external nofollow" href="http://www.namecoin.us/">Namecoin</a></span>/<span><a rel="external nofollow" href="http://dot-bit.org/">.bit</a></span>，基于bitcoin技术的分散、开放DNS系统。.bit域名到底靠不靠谱啊，是不是有P2P网络存在，.bit网站就能永远访问？会不会被墙？我们不得而之。</li>
<li><span><a rel="external nofollow" href="http://www.socialdns.net/">Social DNS</a></span></li>
<li><span><a rel="external nofollow" href="http://distributeddns.sourceforge.net/">Distributed DNS</a></span></li>
</ul>
<p><strong>身份凭证</strong></p>
<ul>
<li><span><a rel="external nofollow" href="http://wiki.openid.net/w/page/12995176/Libraries/">OpenID</a></span>，一个去中心化的网上身份认证系统。对于支持OpenID的网站，用户不需要记住像用户名和密码这样的传统验证标记。取而代之的是，他们只需要预先在一个作为OpenID身份提供者（identity provider, IdP）的网站上注册。OpenID是去中心化的，任何网站都可以使用OpenID来作为用户登录的一种方式，任何网站也都可以作为OpenID身份提供者。OpenID既解决了问题而又不需要依赖于中心性的网站来确认数字身份。OpenID正在被越来越多的大网站采用</li>
<li><span><a rel="external nofollow" href="http://oauth.net/code/">OAuth</a></span>，（开放授权）是一个开放标准，允许用户让第三方应用访问该用户在某一网站上存储的私密的资源（如照片，视频，联系人列表），而无需将用户名和密码提供给第三方应用。</li>
</ul>
<p><strong>加密</strong></p>
<ul>
<li><span><a rel="external nofollow" href="http://www.cacert.org/">CACert</a></span>，想给自己申请一份电子邮件证书或者给自己的<span><a rel="external nofollow" href="http://blog.mop.name/category/%e8%b6%a3%e7%ab%99">网站</a></span>、服务器申请一个SSL证书是很不容易的，你每年都得给CA（证书颁发验证组织）缴纳不少的证书申请费。有了CAcert，国外一个<span><a rel="external nofollow" href="http://blog.mop.name/category/free">免费</a></span>的数字证书颁发组织，你可以<span><a rel="external nofollow" href="http://blog.mop.name/category/free">免费</a></span>注册成为用户，申领个人证书和服务器证书等。证书被各种浏览器、邮件客户端所支持。</li>
</ul>
<h3><strong>其它</strong></h3>
<p><strong>翻译</strong>（Google Translator）</p>
<ul>
<li><span><a rel="external nofollow" href="http://www.apertium.org/">Apertium</a></span>，一个机器翻译平台，由西班牙政府和加泰罗尼亚自治政府拨款支持阿利坎特大学开发。</li>
</ul>
<p><strong>桌面</strong>（iGoogle, netbives）</p>
<ul>
<li><span><a rel="external nofollow" href="http://www.eyeos.org/">EyeOS</a></span>，一款web桌面环境, 俗称Web Operating System (Web OS)或者Web Office. eyeOS是一个开源的软件, 用户可以自由下载或者在eyeOS的服务器 eyeOS server 上使用. 基本的系统附带一些办公软件和 PIM 应用, 并且在官方<a rel="external nofollow" href="http://eyeos.org/">http://eyeos.org</a>可以找到完整的程序代码。其开发哲学是：Taking Your Life Everywhere!</li>
<li>CorneliOS，一款运行在服务器端、基于网络的网络虚拟操作系统，本身通过HTML和（或）XHTML为用户提供各种服务，这也就意味着用户只需要使用普通浏览器即可连接并使用这款操作系统。非常类似 eyeOS。</li>
</ul>
<p><strong>3D库</strong>（Google SketchUp 3D Warehouse, Google O3D API）</p>
<ul>
<li><span><a rel="external nofollow" href="https://wiki.mozilla.org/Canvas:3D">Mozilla Canvas 3D</a></span>，OpenGL 3D Web。</li>
<li><span><a rel="external nofollow" href="http://www.doogal.co.uk/KmlViewer.php/">Web KML Viewer</a></span>。</li>
</ul>
<p><strong>参考</strong></p>
<ul>
<li><span><a rel="external nofollow" href="http://en.wikipedia.org/wiki/List_of_free_software_for_Web_2.0_services">Wikipedia</a></span></li>
<li><span><a rel="external nofollow" href="http://www.dasheyin.com/da_jian_ni_zi_ji_de_she_jiao_wang_luo_kai_yuan_she_jiao_wang_luo_cheng_xu_ji_he.html">搭建你自己的社交网络：开源社交网络程序集合</a></span></li>
<li>From?<a rel="external nofollow" href="http://coolshell.cn/articles/5132.html">http://coolshell.cn/articles/5132.html</a></li>
</ul>
<h2  class="related_post_title">Related Posts / 相关文章</h2><ul class="related_post"><li><a href="http://slj.me/2011/06/php-daemon-notice/" title="[转] 代替bash，书写 PHP daemon 后台程序">[转] 代替bash，书写 PHP daemon 后台程序</a></li><li><a href="http://slj.me/2011/04/xdebug-for-php/" title="Xdebug for php 一个实用的PHP调试扩展">Xdebug for php 一个实用的PHP调试扩展</a></li><li><a href="http://slj.me/2011/02/php-share-session-between-servers/" title="PHP 实现多服务器共享 SESSION 数据">PHP 实现多服务器共享 SESSION 数据</a></li><li><a href="http://slj.me/2010/12/php-ini_set-fail-reason/" title="PHP ini_set() 无效的原因">PHP ini_set() 无效的原因</a></li><li><a href="http://slj.me/2010/12/centos-php5-2-yum/" title="CentOS 用 yum 官方源安裝 PHP5.2.x">CentOS 用 yum 官方源安裝 PHP5.2.x</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://slj.me/2011/08/web-open-source-project/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>[转] 代替bash，书写 PHP daemon 后台程序</title>
		<link>http://slj.me/2011/06/php-daemon-notice/</link>
		<comments>http://slj.me/2011/06/php-daemon-notice/#comments</comments>
		<pubDate>Mon, 20 Jun 2011 07:16:08 +0000</pubDate>
		<dc:creator>SLJ</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[daemon]]></category>

		<guid isPermaLink="false">http://slj.me/?p=2236</guid>
		<description><![CDATA[最近在雅虎的一个朋友和我说，以前用bash csh 写脚本, 它现在都在用PHP 写后台程序，觉得PHP的函数最全，而且很容易用 shell_exec 很容易调用系统内核。 我和他交流了一下写后台程序的一些原则，归纳如下。 首先，要去掉以前写网页脚本的一些思维习惯。网页脚本运行一次以后，就马上释放内存。而daemon 程序不一样，它会一直运行一年，甚至几年。 作为一个好的习惯，一定要在while (1) {} 这样一个死循环里面运行代码。这样，只要代码不出状况，脚本就不会停止。 echo 不能用，而是用log 代替。用写日志的方法代替echo。因为echo 是 向 屏幕输出一个字符，如果没有任何输出的对象，就会报一个致命错误。 如果MYSQL，要每次重新连接MYSQL。 function connnect() { global $db; if (is_resource($db)) { mysqli_close($db); } $db = mysqli_connect("123.1.2.3", 'dbuser', 'dbpsw', 'dbname'); } 上面就是连接的一个例子。这个代码曾经被一个高手狠狠的批评了一顿。这个主要是为了防止下面的事情： mysql 重启了，$db 变量肯定还是个资源，但是这个资源已经无效了。如果再执行代码就会发生： mysql has go away 这样的错误。这个会向屏幕输出，即时关闭错误报告也一样会输出。这样导致整个 脚本运行错误，和echo 产生的错误一样。 虽然每次连接数据库有些浪费，但是也只能宁可错杀1000，也不放过一个。这个错误，是大多数朋友都会犯的 错误，很多人和我说这个是mysql的bug，因为，本来写文件好好的，后来连接带mysql就出错了。 其实不是mysql的bug。 新产生的变量，如果不是自动释放的，要马上释放。否则日积月累，程序就要崩溃。很多PHP程序员没有一点 内存管理的概念，觉得内存是无限的，随便用，写后台程序一定要注意内存的管理。 如果要访问文件，首先要 clearstatcache, 否则很有可能会不精确的统计，或者 判断文件是否存在变的不准确了。更要命的是，如果你频繁打开文件，文件的handle 值会 不断增加，等到超过整数的最大值，程序就无法打开文件。很多人的程序，3个月挂一次， 没有出现错误，也没有出现内存问题，很有可能就是每次操作文件前，没有清除statcache。 附：运行的时候sh脚本可以是： #!/bin/sh daemon [...]]]></description>
			<content:encoded><![CDATA[<p>    最近在雅虎的一个朋友和我说，以前用bash csh 写脚本, 它现在都在用PHP 写后台程序，觉得PHP的函数最全，而且很容易用 shell_exec 很容易调用系统内核。<br />
我和他交流了一下写后台程序的一些原则，归纳如下。<br />
首先，要去掉以前写网页脚本的一些思维习惯。网页脚本运行一次以后，就马上释放内存。而daemon 程序不一样，它会一直运行一年，甚至几年。<br />
<span id="more-2236"></span>
<ol>
<li>作为一个好的习惯，一定要在while (1) {} 这样一个死循环里面运行代码。这样，只要代码不出状况，脚本就不会停止。</li>
<li>echo 不能用，而是用log 代替。用写日志的方法代替echo。因为echo 是 向 屏幕输出一个字符，如果没有任何输出的对象，就会报一个致命错误。</li>
<li> 如果MYSQL，要每次重新连接MYSQL。
<pre class="php" name="code">
function connnect()
{
global $db;
if (is_resource($db)) {
mysqli_close($db);
}
$db = mysqli_connect("123.1.2.3", 'dbuser', 'dbpsw', 'dbname');
}
</pre>
<p>上面就是连接的一个例子。这个代码曾经被一个高手狠狠的批评了一顿。这个主要是为了防止下面的事情：<br />
mysql 重启了，$db 变量肯定还是个资源，但是这个资源已经无效了。如果再执行代码就会发生：<br />
mysql has go away 这样的错误。这个会向屏幕输出，即时关闭错误报告也一样会输出。这样导致整个<br />
脚本运行错误，和echo 产生的错误一样。<br />
虽然每次连接数据库有些浪费，但是也只能宁可错杀1000，也不放过一个。这个错误，是大多数朋友都会犯的<br />
错误，很多人和我说这个是mysql的bug，因为，本来写文件好好的，后来连接带mysql就出错了。<br />
其实不是mysql的bug。
</li>
<li>新产生的变量，如果不是自动释放的，要马上释放。否则日积月累，程序就要崩溃。很多PHP程序员没有一点<br />
内存管理的概念，觉得内存是无限的，随便用，写后台程序一定要注意内存的管理。
</li>
<li>如果要访问文件，首先要 clearstatcache, 否则很有可能会不精确的统计，或者<br />
判断文件是否存在变的不准确了。更要命的是，如果你频繁打开文件，文件的handle 值会<br />
不断增加，等到超过整数的最大值，程序就无法打开文件。很多人的程序，3个月挂一次，<br />
没有出现错误，也没有出现内存问题，很有可能就是每次操作文件前，没有清除statcache。
</li>
</ol>
<p>附：运行的时候sh脚本可以是：</p>
<blockquote><p>
#!/bin/sh<br />
daemon &#8211;respawn &#8211;pidfile=/data/abc.pid &#8211;output=/data/abc/log/output.log &#8211;stderr=/data/abc/log/error.log &#8211;name=abcd &#8212; /usr/local/php/bin/php /data/abc/abc.class.php</p></blockquote>
<h2  class="related_post_title">Related Posts / 相关文章</h2><ul class="related_post"><li><a href="http://slj.me/2011/08/web-open-source-project/" title="疯狂的 Web 应用开源项目">疯狂的 Web 应用开源项目</a></li><li><a href="http://slj.me/2011/04/xdebug-for-php/" title="Xdebug for php 一个实用的PHP调试扩展">Xdebug for php 一个实用的PHP调试扩展</a></li><li><a href="http://slj.me/2011/03/share-bash-script/" title="分享两则我在VPS上执行的sh脚本">分享两则我在VPS上执行的sh脚本</a></li><li><a href="http://slj.me/2011/02/php-share-session-between-servers/" title="PHP 实现多服务器共享 SESSION 数据">PHP 实现多服务器共享 SESSION 数据</a></li><li><a href="http://slj.me/2010/12/php-ini_set-fail-reason/" title="PHP ini_set() 无效的原因">PHP ini_set() 无效的原因</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://slj.me/2011/06/php-daemon-notice/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Xdebug for php 一个实用的PHP调试扩展</title>
		<link>http://slj.me/2011/04/xdebug-for-php/</link>
		<comments>http://slj.me/2011/04/xdebug-for-php/#comments</comments>
		<pubDate>Tue, 19 Apr 2011 03:02:52 +0000</pubDate>
		<dc:creator>SLJ</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[xdebug]]></category>

		<guid isPermaLink="false">http://slj.me/?p=2226</guid>
		<description><![CDATA[Xdebug简介 Xdebug是一个开放源代码的PHP程序调试器(即一个Debug工具)，可以用来跟踪，调试和分析PHP程序的运行状况。Xdebug现在的最新版本是Xdebug 2.1.0, release日期 2010-6-29，支持PHP4/PHP5。 xdebug for php安装 首先去官网下载新版的xdebug http://www.xdebug.org/docs/install linux下解压xdebug包。 进入xdebug,在这个目录下先运行php目录下面的bin/phpize； 一定要先运行这个，不然不可以./configure 执行 ./configure  --enable-xdebug  --with-php-config=/你php的bin路径/php-config  ; make 好了，结束了。这是时候会在xdebug的目录下生成 目录modules，目录下有xdebug.so文件，把xdebug.so复制到你想放的目录。 在php的配置文件后面加上 zend_extension = &#8220;/路径/xdebug.so&#8221; 重启，看phpinfo();    或者 命令行里 ./php -m &#124;grep debug  有结果就成了。 Related Posts / 相关文章疯狂的 Web 应用开源项目[转] 代替bash，书写 PHP daemon 后台程序PHP 实现多服务器共享 SESSION 数据PHP ini_set() 无效的原因CentOS 用 yum 官方源安裝 PHP5.2.x]]></description>
			<content:encoded><![CDATA[<h3>Xdebug简介</h3>
<p>Xdebug是一个开放源代码的PHP程序调试器(即一个Debug工具)，可以用来跟踪，调试和分析PHP程序的运行状况。Xdebug现在的最新版本是Xdebug 2.1.0, release日期 2010-6-29，支持PHP4/PHP5。<br />
<span id="more-2226"></span></p>
<h3>xdebug for php安装</h3>
<p>首先去官网下载新版的xdebug<br />
<a href="http://www.xdebug.org/docs/install" target="_blank">http://www.xdebug.org/docs/install</a></p>
<p>linux下解压xdebug包。</p>
<ol>
<li> 进入xdebug,在这个目录下先运行php目录下面的bin/phpize；<br />
一定要先运行这个，不然不可以./configure</li>
<li> 执行<br />
<code>./configure  --enable-xdebug  --with-php-config=/你php的bin路径/php-config  ;</code></li>
<li>make<br />
好了，结束了。这是时候会在xdebug的目录下生成 目录modules，目录下有xdebug.so文件，把xdebug.so复制到你想放的目录。</li>
<li>在php的配置文件后面加上<br />
zend_extension = &#8220;/路径/xdebug.so&#8221;</li>
<li>重启，看phpinfo();    或者 命令行里 ./php -m |grep debug  有结果就成了。</li>
</ol>
<h2  class="related_post_title">Related Posts / 相关文章</h2><ul class="related_post"><li><a href="http://slj.me/2011/08/web-open-source-project/" title="疯狂的 Web 应用开源项目">疯狂的 Web 应用开源项目</a></li><li><a href="http://slj.me/2011/06/php-daemon-notice/" title="[转] 代替bash，书写 PHP daemon 后台程序">[转] 代替bash，书写 PHP daemon 后台程序</a></li><li><a href="http://slj.me/2011/02/php-share-session-between-servers/" title="PHP 实现多服务器共享 SESSION 数据">PHP 实现多服务器共享 SESSION 数据</a></li><li><a href="http://slj.me/2010/12/php-ini_set-fail-reason/" title="PHP ini_set() 无效的原因">PHP ini_set() 无效的原因</a></li><li><a href="http://slj.me/2010/12/centos-php5-2-yum/" title="CentOS 用 yum 官方源安裝 PHP5.2.x">CentOS 用 yum 官方源安裝 PHP5.2.x</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://slj.me/2011/04/xdebug-for-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP 实现多服务器共享 SESSION 数据</title>
		<link>http://slj.me/2011/02/php-share-session-between-servers/</link>
		<comments>http://slj.me/2011/02/php-share-session-between-servers/#comments</comments>
		<pubDate>Thu, 24 Feb 2011 15:33:59 +0000</pubDate>
		<dc:creator>SLJ</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web Structure]]></category>
		<category><![CDATA[session]]></category>

		<guid isPermaLink="false">http://slj.me/?p=2152</guid>
		<description><![CDATA[PHP 实现多服务器共享 SESSION 数据 一、问题起源 稍大一些的网站，通常都会有好几个服务器，每个服务器运行着不同功能的模块，使用不同的二级域名，而一个整体性强的网站，用户系统是统一的，即一套用户名、密码在整个网站的各个模块中都是可以登录使用的。各个服务器共享用户数据是比较容易实现的，只需要在后端放个数据库服务器，各个服务器通过统一接口对用户数据进行访问即可。但还存在一个问题，就是用户在这个服务器登录之后，进入另一个服务器的别的模块时，仍然需要重新登录，这就是一次登录，全部通行的问题，映射到技术上，其实就是各个服务器之间如何实现共享 SESSION 数据的问题。 二、PHP SESSION 的工作原理 在解决问题之前，先来了解一下 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 方式进行说明，因为应用比较广泛。 那么 SESSION 的数据保存在哪里呢？当然是在服务器端，但不是保存在内存中，而是保存在文件或数据库中。默认情况下，php.ini [...]]]></description>
			<content:encoded><![CDATA[<p>PHP 实现多服务器共享 SESSION 数据</p>
<p>一、问题起源</p>
<p>稍大一些的网站，通常都会有好几个服务器，每个服务器运行着不同功能的模块，使用不同的二级域名，而一个整体性强的网站，用户系统是统一的，即一套用户名、密码在整个网站的各个模块中都是可以登录使用的。各个服务器共享用户数据是比较容易实现的，只需要在后端放个数据库服务器，各个服务器通过统一接口对用户数据进行访问即可。但还存在一个问题，就是用户在这个服务器登录之后，进入另一个服务器的别的模块时，仍然需要重新登录，这就是一次登录，全部通行的问题，映射到技术上，其实就是各个服务器之间如何实现共享 SESSION 数据的问题。</p>
<p><span id="more-2152"></span>二、PHP SESSION 的工作原理</p>
<p>在解决问题之前，先来了解一下 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 方式进行说明，因为应用比较广泛。</p>
<p>那么 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=”N;/save_path”，N 为分级的级数，save_path 为开始目录。当写入 SESSION 数据的时候，PHP 会获取到客户端的 SESSION_ID，然后根据这个 SESSION ID 到指定的 SESSION 文件保存目录中找到相应的 SESSION 文件，不存在则创建之，最后将数据序列化之后写入文件。读取 SESSION 数据是也是类似的操作流程，对读出来的数据需要进行解序列化，生成相应的 SESSION 变量。</p>
<p>三、多服务器共享 SESSION 的主要障碍及解决办法</p>
<p>通过了解 SESSION 的工作原理，我们可以发现，在默认情况下，各个服务器会各自分别对同一个客户端产生 SESSION ID，如对于同一个用户浏览器，A 服务器产生的 SESSION ID 是 30de1e9de3192ba6ce2992d27a1b6a0a，而 B 服务器生成的则是 c72665af28a8b14c0fe11afe3b59b51b。另外，PHP 的 SESSION 数据都是分别保存在本服务器的文件系统中。如下图所示：</p>
<p>确定了问题所在之后，就可以着手进行解决了。想要共享 SESSION 数据，那就必须实现两个目标：一个是各个服务器对同一个客户端产生的 SESSION ID 必须相同，并且可通过同一个 COOKIE 进行传递，也就是说各个服务器必须可以读取同一个名为 PHPSESSID 的 COOKIE；另一个是 SESSION 数据的存储方式/位置必须保证各个服务器都能够访问到。简单地说就是多服务器共享客户端的 SESSION ID，同时还必须共享服务器端的 SESSION 数据。</p>
<p>第一个目标的实现其实很简单，只需要对 COOKIE 的域（domain）进行特殊地设置即可，默认情况下，COOKIE 的域是当前服务器的域名/IP 地址，而域不同的话，各个服务器所设置的 COOKIE 是不能相互访问的，如 www.aaa.com 的服务器是不能读写 www.bbb.com 服务器设置的 COOKIE 的。</p>
<p>这里我们所说的同一网站的服务器有其特殊性，那就是他们同属于同一个一级域，如：aaa.infor96.com 和 www.infor96.com 都属于域 .infor96.com，那么我们就可以设置 COOKIE 的域为 .infor96.com，这样 aaa.infor96.com、www.infor96.com 等等都可以访问此 COOKIE。PHP 代码中的设置方法如下：</p>
<div class="hl-surround">
<div class="hl-main"><span style="color: blue;">&lt;?php</span><span style="color: gray;"><br />
</span><span style="color: blue;">ini_set</span><span style="color: olive;">(</span><span style="color: #8b0000;">&#8216;</span><span style="color: red;">session.cookie_domain</span><span style="color: #8b0000;">&#8216;</span><span style="color: gray;">, </span><span style="color: #8b0000;">&#8216;</span><span style="color: red;">.infor96.com</span><span style="color: #8b0000;">&#8216;</span><span style="color: olive;">)</span><span style="color: gray;">;</span><span style="color: gray;"><br />
?&gt;</span></div>
</div>
<p>这样各个服务器共享同一客户端 SESSION ID 的目的就达到了。</p>
<p>第二个目标的实现可以使用文件共享方式，如 NFS 方式，但设置、操作上有些复杂。我们可以参考先前所说的统一用户系统的方式，即使用数据库来保存 SESSION 数据，这样各个服务器就可以方便地访问同一个数据源，获取相同的 SESSION 数据了。</p>
<p>解决办法如下图所示：</p>
<p>四、代码实现</p>
<p>首先创建数据表，MySQL 的 SQL 语句如下：</p>
<p>CREATE TABLE `sess` (</p>
<p>`sesskey` varchar(32) NOT NULL default ”,</p>
<p>`expiry` bigint(20) NOT NULL default ‘0′,</p>
<p>`data` longtext NOT NULL,</p>
<p>PRIMARY KEY  (`sesskey`),</p>
<p>KEY `expiry` (`expiry`)</p>
<p>) TYPE=MyISAM</p>
<p>sesskey 为 SESSION ID，expiry 为 SESSION 过期时间，data 用于保存 SESSION 数据。</p>
<p>默认情况下 SESSION 数据是以文件方式保存，想要使用数据库方式保存，就必须重新定义 SESSION 各个操作的处理函数。PHP 提供了session_set_save_handle() 函数，可以用此函数自定义 SESSION 的处理过程，当然首先要先将 session.save_handler 改成 user，可在 PHP 中进行设置：</p>
<div class="hl-surround">
<div class="hl-main"><span style="color: blue;">&lt;?php</span><span style="color: gray;"><br />
</span><span style="color: blue;">session_module_name</span><span style="color: olive;">(</span><span style="color: #8b0000;">&#8216;</span><span style="color: red;">user</span><span style="color: #8b0000;">&#8216;</span><span style="color: olive;">)</span><span style="color: gray;">;</span><span style="color: gray;"><br />
?&gt;</span></div>
</div>
<p>接下来着重讲一下 session_set_save_handle() 函数，此函数有六个参数：</p>
<p>session_set_save_handler ( string open, string close, string read, string write, string destroy, string gc )</p>
<p>各个参数为各项操作的函数名，这些操作依次是：打开、关闭、读取、写入、销毁、垃圾回收。PHP 手册中有详细的例子，在这里我们使用 OO 的方式来实现这些操作，详细代码如下：</p>
<div class="hl-surround">
<div class="hl-main"><span style="color: blue;">&lt;?php</span><span style="color: gray;"><br />
</span><span style="color: green;">define</span><span style="color: olive;">(</span><span style="color: #8b0000;">&#8216;</span><span style="color: red;">MY_SESS_TIME</span><span style="color: #8b0000;">&#8216;</span><span style="color: gray;">, </span><span style="color: maroon;">3600</span><span style="color: olive;">)</span><span style="color: gray;">; </span><span style="color: #ffa500;">//SESSION 生存时长</span><span style="color: gray;"><br />
</span><span style="color: #ffa500;">//类定义</span><span style="color: gray;"><br />
</span><span style="color: green;">class</span><span style="color: gray;"> </span><span style="color: blue;">My_Sess</span><span style="color: gray;"><br />
</span><span style="color: olive;">{</span><span style="color: gray;"><br />
</span><span style="color: green;">function</span><span style="color: gray;"> </span><span style="color: blue;">init</span><span style="color: olive;">()</span><span style="color: gray;"><br />
</span><span style="color: olive;">{</span><span style="color: gray;"><br />
</span><span style="color: #00008b;">$domain</span><span style="color: gray;"> = </span><span style="color: #8b0000;">&#8216;</span><span style="color: red;">.infor96.com</span><span style="color: #8b0000;">&#8216;</span><span style="color: gray;">;<br />
</span><span style="color: #ffa500;">//不使用 GET/POST 变量方式</span><span style="color: gray;"><br />
</span><span style="color: blue;">ini_set</span><span style="color: olive;">(</span><span style="color: #8b0000;">&#8216;</span><span style="color: red;">session.use_trans_sid</span><span style="color: #8b0000;">&#8216;</span><span style="color: gray;">, </span><span style="color: maroon;">0</span><span style="color: olive;">)</span><span style="color: gray;">;<br />
</span><span style="color: #ffa500;">//设置垃圾回收最大生存时间</span><span style="color: gray;"><br />
</span><span style="color: blue;">ini_set</span><span style="color: olive;">(</span><span style="color: #8b0000;">&#8216;</span><span style="color: red;">session.gc_maxlifetime</span><span style="color: #8b0000;">&#8216;</span><span style="color: gray;">, </span><span style="color: blue;">MY_SESS_TIME</span><span style="color: olive;">)</span><span style="color: gray;">;</p>
<p></span><span style="color: #ffa500;">//使用 COOKIE 保存 SESSION ID 的方式</span><span style="color: gray;"><br />
</span><span style="color: blue;">ini_set</span><span style="color: olive;">(</span><span style="color: #8b0000;">&#8216;</span><span style="color: red;">session.use_cookies</span><span style="color: #8b0000;">&#8216;</span><span style="color: gray;">, </span><span style="color: maroon;">1</span><span style="color: olive;">)</span><span style="color: gray;">;<br />
</span><span style="color: blue;">ini_set</span><span style="color: olive;">(</span><span style="color: #8b0000;">&#8216;</span><span style="color: red;">session.cookie_path</span><span style="color: #8b0000;">&#8216;</span><span style="color: gray;">, </span><span style="color: #8b0000;">&#8216;</span><span style="color: red;">/</span><span style="color: #8b0000;">&#8216;</span><span style="color: olive;">)</span><span style="color: gray;">;<br />
</span><span style="color: #ffa500;">//多主机共享保存 SESSION ID 的 COOKIE</span><span style="color: gray;"><br />
</span><span style="color: blue;">ini_set</span><span style="color: olive;">(</span><span style="color: #8b0000;">&#8216;</span><span style="color: red;">session.cookie_domain</span><span style="color: #8b0000;">&#8216;</span><span style="color: gray;">, </span><span style="color: #00008b;">$domain</span><span style="color: olive;">)</span><span style="color: gray;">;</p>
<p></span><span style="color: #ffa500;">//将 session.save_handler 设置为 user，而不是默认的 files</span><span style="color: gray;"><br />
</span><span style="color: blue;">session_module_name</span><span style="color: olive;">(</span><span style="color: #8b0000;">&#8216;</span><span style="color: red;">user</span><span style="color: #8b0000;">&#8216;</span><span style="color: olive;">)</span><span style="color: gray;">;<br />
</span><span style="color: #ffa500;">//定义 SESSION 各项操作所对应的方法名：</span><span style="color: gray;"><br />
</span><span style="color: blue;">session_set_save_handler</span><span style="color: olive;">(</span><span style="color: gray;"><br />
</span><span style="color: green;">array</span><span style="color: olive;">(</span><span style="color: #8b0000;">&#8216;</span><span style="color: red;">My_Sess</span><span style="color: #8b0000;">&#8216;</span><span style="color: gray;">, </span><span style="color: #8b0000;">&#8216;</span><span style="color: red;">open</span><span style="color: #8b0000;">&#8216;</span><span style="color: olive;">)</span><span style="color: gray;">, </span><span style="color: #ffa500;">//对应于静态方法 My_Sess::open()，下同。</span><span style="color: gray;"><br />
</span><span style="color: green;">array</span><span style="color: olive;">(</span><span style="color: #8b0000;">&#8216;</span><span style="color: red;">My_Sess</span><span style="color: #8b0000;">&#8216;</span><span style="color: gray;">, </span><span style="color: #8b0000;">&#8216;</span><span style="color: red;">close</span><span style="color: #8b0000;">&#8216;</span><span style="color: olive;">)</span><span style="color: gray;">,<br />
</span><span style="color: green;">array</span><span style="color: olive;">(</span><span style="color: #8b0000;">&#8216;</span><span style="color: red;">My_Sess</span><span style="color: #8b0000;">&#8216;</span><span style="color: gray;">, </span><span style="color: #8b0000;">&#8216;</span><span style="color: red;">read</span><span style="color: #8b0000;">&#8216;</span><span style="color: olive;">)</span><span style="color: gray;">,<br />
</span><span style="color: green;">array</span><span style="color: olive;">(</span><span style="color: #8b0000;">&#8216;</span><span style="color: red;">My_Sess</span><span style="color: #8b0000;">&#8216;</span><span style="color: gray;">, </span><span style="color: #8b0000;">&#8216;</span><span style="color: red;">write</span><span style="color: #8b0000;">&#8216;</span><span style="color: olive;">)</span><span style="color: gray;">,<br />
</span><span style="color: green;">array</span><span style="color: olive;">(</span><span style="color: #8b0000;">&#8216;</span><span style="color: red;">My_Sess</span><span style="color: #8b0000;">&#8216;</span><span style="color: gray;">, </span><span style="color: #8b0000;">&#8216;</span><span style="color: red;">destroy</span><span style="color: #8b0000;">&#8216;</span><span style="color: olive;">)</span><span style="color: gray;">,<br />
</span><span style="color: green;">array</span><span style="color: olive;">(</span><span style="color: #8b0000;">&#8216;</span><span style="color: red;">My_Sess</span><span style="color: #8b0000;">&#8216;</span><span style="color: gray;">, </span><span style="color: #8b0000;">&#8216;</span><span style="color: red;">gc</span><span style="color: #8b0000;">&#8216;</span><span style="color: olive;">)</span><span style="color: gray;"><br />
</span><span style="color: olive;">)</span><span style="color: gray;">;<br />
</span><span style="color: olive;">}</span><span style="color: gray;"> </span><span style="color: #ffa500;">//end function</span><span style="color: gray;"></p>
<p></span><span style="color: green;">function</span><span style="color: gray;"> </span><span style="color: blue;">open</span><span style="color: olive;">(</span><span style="color: #00008b;">$save_path</span><span style="color: gray;">, </span><span style="color: #00008b;">$session_name</span><span style="color: olive;">)</span><span style="color: gray;"> </span><span style="color: olive;">{</span><span style="color: gray;"><br />
</span><span style="color: green;">return</span><span style="color: gray;"> </span><span style="color: green;">true</span><span style="color: gray;">;<br />
</span><span style="color: olive;">}</span><span style="color: gray;"> </span><span style="color: #ffa500;">//end function</span><span style="color: gray;"></p>
<p></span><span style="color: green;">function</span><span style="color: gray;"> </span><span style="color: blue;">close</span><span style="color: olive;">()</span><span style="color: gray;"> </span><span style="color: olive;">{</span><span style="color: gray;"><br />
</span><span style="color: green;">global</span><span style="color: gray;"> </span><span style="color: #00008b;">$MY_SESS_CONN</span><span style="color: gray;">;</p>
<p></span><span style="color: green;">if</span><span style="color: gray;"> </span><span style="color: olive;">(</span><span style="color: #00008b;">$MY_SESS_CONN</span><span style="color: olive;">)</span><span style="color: gray;"> </span><span style="color: olive;">{</span><span style="color: gray;"> </span><span style="color: #ffa500;">//关闭数据库连接</span><span style="color: gray;"><br />
</span><span style="color: #00008b;">$MY_SESS_CONN</span><span style="color: gray;">-&gt;</span><span style="color: blue;">Close</span><span style="color: olive;">()</span><span style="color: gray;">;<br />
</span><span style="color: olive;">}</span><span style="color: gray;"><br />
</span><span style="color: green;">return</span><span style="color: gray;"> </span><span style="color: green;">true</span><span style="color: gray;">;<br />
</span><span style="color: olive;">}</span><span style="color: gray;"> </span><span style="color: #ffa500;">//end function</span><span style="color: gray;"></p>
<p></span><span style="color: green;">function</span><span style="color: gray;"> </span><span style="color: blue;">read</span><span style="color: olive;">(</span><span style="color: #00008b;">$sesskey</span><span style="color: olive;">)</span><span style="color: gray;"> </span><span style="color: olive;">{</span><span style="color: gray;"><br />
</span><span style="color: green;">global</span><span style="color: gray;"> </span><span style="color: #00008b;">$MY_SESS_CONN</span><span style="color: gray;">;</p>
<p></span><span style="color: #00008b;">$sql</span><span style="color: gray;"> = </span><span style="color: #8b0000;">&#8216;</span><span style="color: red;">SELECT data FROM sess WHERE sesskey=</span><span style="color: #8b0000;">&#8216;</span><span style="color: gray;"> . </span><span style="color: #00008b;">$MY_SESS_CONN</span><span style="color: gray;">-&gt;</span><span style="color: blue;">qstr</span><span style="color: olive;">(</span><span style="color: #00008b;">$sesskey</span><span style="color: olive;">)</span><span style="color: gray;"> . </span><span style="color: #8b0000;">&#8216;</span><span style="color: red;"> AND expiry&gt;=</span><span style="color: #8b0000;">&#8216;</span><span style="color: gray;"> . </span><span style="color: blue;">time</span><span style="color: olive;">()</span><span style="color: gray;">;<br />
</span><span style="color: #00008b;">$rs</span><span style="color: gray;"> =&amp; </span><span style="color: #00008b;">$MY_SESS_CONN</span><span style="color: gray;">-&gt;</span><span style="color: blue;">Execute</span><span style="color: olive;">(</span><span style="color: #00008b;">$sql</span><span style="color: olive;">)</span><span style="color: gray;">;<br />
</span><span style="color: green;">if</span><span style="color: gray;"> </span><span style="color: olive;">(</span><span style="color: #00008b;">$rs</span><span style="color: olive;">)</span><span style="color: gray;"> </span><span style="color: olive;">{</span><span style="color: gray;"><br />
</span><span style="color: green;">if</span><span style="color: gray;"> </span><span style="color: olive;">(</span><span style="color: #00008b;">$rs</span><span style="color: gray;">-&gt;</span><span style="color: blue;">EOF</span><span style="color: olive;">)</span><span style="color: gray;"> </span><span style="color: olive;">{</span><span style="color: gray;"><br />
</span><span style="color: green;">return</span><span style="color: gray;"> </span><span style="color: #8b0000;">&#8221;</span><span style="color: gray;">;<br />
</span><span style="color: olive;">}</span><span style="color: gray;"> </span><span style="color: green;">else</span><span style="color: gray;"> </span><span style="color: olive;">{</span><span style="color: gray;"> </span><span style="color: #ffa500;">//读取到对应于 SESSION ID 的 SESSION 数据</span><span style="color: gray;"><br />
</span><span style="color: #00008b;">$v</span><span style="color: gray;"> = </span><span style="color: #00008b;">$rs</span><span style="color: gray;">-&gt;</span><span style="color: blue;">fields</span><span style="color: olive;">[</span><span style="color: maroon;">0</span><span style="color: olive;">]</span><span style="color: gray;">;<br />
</span><span style="color: #00008b;">$rs</span><span style="color: gray;">-&gt;</span><span style="color: blue;">Close</span><span style="color: olive;">()</span><span style="color: gray;">;<br />
</span><span style="color: green;">return</span><span style="color: gray;"> </span><span style="color: #00008b;">$v</span><span style="color: gray;">;<br />
</span><span style="color: olive;">}</span><span style="color: gray;"> </span><span style="color: #ffa500;">//end if</span><span style="color: gray;"><br />
</span><span style="color: olive;">}</span><span style="color: gray;"> </span><span style="color: #ffa500;">//end if</span><span style="color: gray;"><br />
</span><span style="color: green;">return</span><span style="color: gray;"> </span><span style="color: #8b0000;">&#8221;</span><span style="color: gray;">;<br />
</span><span style="color: olive;">}</span><span style="color: gray;"> </span><span style="color: #ffa500;">//end function</span><span style="color: gray;"></p>
<p></span><span style="color: green;">function</span><span style="color: gray;"> </span><span style="color: blue;">write</span><span style="color: olive;">(</span><span style="color: #00008b;">$sesskey</span><span style="color: gray;">, </span><span style="color: #00008b;">$data</span><span style="color: olive;">)</span><span style="color: gray;"> </span><span style="color: olive;">{</span><span style="color: gray;"><br />
</span><span style="color: green;">global</span><span style="color: gray;"> </span><span style="color: #00008b;">$MY_SESS_CONN</span><span style="color: gray;">;</p>
<p></span><span style="color: #00008b;">$qkey</span><span style="color: gray;"> = </span><span style="color: #00008b;">$MY_SESS_CONN</span><span style="color: gray;">-&gt;</span><span style="color: blue;">qstr</span><span style="color: olive;">(</span><span style="color: #00008b;">$sesskey</span><span style="color: olive;">)</span><span style="color: gray;">;<br />
</span><span style="color: #00008b;">$expiry</span><span style="color: gray;"> = </span><span style="color: blue;">time</span><span style="color: olive;">()</span><span style="color: gray;"> + </span><span style="color: blue;">My_SESS_TIME</span><span style="color: gray;">; </span><span style="color: #ffa500;">//设置过期时间</span><span style="color: gray;"></p>
<p></span><span style="color: #ffa500;">//写入 SESSION</span><span style="color: gray;"><br />
</span><span style="color: #00008b;">$arr</span><span style="color: gray;"> = </span><span style="color: green;">array</span><span style="color: olive;">(</span><span style="color: gray;"><br />
</span><span style="color: #8b0000;">&#8216;</span><span style="color: red;">sesskey</span><span style="color: #8b0000;">&#8216;</span><span style="color: gray;"> =&gt; </span><span style="color: #00008b;">$qkey</span><span style="color: gray;">,<br />
</span><span style="color: #8b0000;">&#8216;</span><span style="color: red;">expiry</span><span style="color: #8b0000;">&#8216;</span><span style="color: gray;"> =&gt; </span><span style="color: #00008b;">$expiry</span><span style="color: gray;">,<br />
</span><span style="color: #8b0000;">&#8216;</span><span style="color: red;">data</span><span style="color: #8b0000;">&#8216;</span><span style="color: gray;"> =&gt; </span><span style="color: #00008b;">$data</span><span style="color: olive;">)</span><span style="color: gray;">;<br />
</span><span style="color: #00008b;">$MY_SESS_CONN</span><span style="color: gray;">-&gt;</span><span style="color: blue;">Replace</span><span style="color: olive;">(</span><span style="color: #8b0000;">&#8216;</span><span style="color: red;">sess</span><span style="color: #8b0000;">&#8216;</span><span style="color: gray;">, </span><span style="color: #00008b;">$arr</span><span style="color: gray;">, </span><span style="color: #8b0000;">&#8216;</span><span style="color: red;">sesskey</span><span style="color: #8b0000;">&#8216;</span><span style="color: gray;">, </span><span style="color: #00008b;">$autoQuote</span><span style="color: gray;"> = </span><span style="color: green;">true</span><span style="color: olive;">)</span><span style="color: gray;">;<br />
</span><span style="color: green;">return</span><span style="color: gray;"> </span><span style="color: green;">true</span><span style="color: gray;">;<br />
</span><span style="color: olive;">}</span><span style="color: gray;"> </span><span style="color: #ffa500;">//end function</span><span style="color: gray;"></p>
<p></span><span style="color: green;">function</span><span style="color: gray;"> </span><span style="color: blue;">destroy</span><span style="color: olive;">(</span><span style="color: #00008b;">$sesskey</span><span style="color: olive;">)</span><span style="color: gray;"> </span><span style="color: olive;">{</span><span style="color: gray;"><br />
</span><span style="color: green;">global</span><span style="color: gray;"> </span><span style="color: #00008b;">$MY_SESS_CONN</span><span style="color: gray;">;</p>
<p></span><span style="color: #00008b;">$sql</span><span style="color: gray;"> = </span><span style="color: #8b0000;">&#8216;</span><span style="color: red;">DELETE FROM sess WHERE sesskey=</span><span style="color: #8b0000;">&#8216;</span><span style="color: gray;"> . </span><span style="color: #00008b;">$MY_SESS_CONN</span><span style="color: gray;">-&gt;</span><span style="color: blue;">qstr</span><span style="color: olive;">(</span><span style="color: #00008b;">$sesskey</span><span style="color: olive;">)</span><span style="color: gray;">;<br />
</span><span style="color: #00008b;">$rs</span><span style="color: gray;"> =&amp; </span><span style="color: #00008b;">$MY_SESS_CONN</span><span style="color: gray;">-&gt;</span><span style="color: blue;">Execute</span><span style="color: olive;">(</span><span style="color: #00008b;">$sql</span><span style="color: olive;">)</span><span style="color: gray;">;<br />
</span><span style="color: green;">return</span><span style="color: gray;"> </span><span style="color: green;">true</span><span style="color: gray;">;<br />
</span><span style="color: olive;">}</span><span style="color: gray;"> </span><span style="color: #ffa500;">//end function</span><span style="color: gray;"></p>
<p></span><span style="color: green;">function</span><span style="color: gray;"> </span><span style="color: blue;">gc</span><span style="color: olive;">(</span><span style="color: #00008b;">$maxlifetime</span><span style="color: gray;"> = </span><span style="color: green;">null</span><span style="color: olive;">)</span><span style="color: gray;"> </span><span style="color: olive;">{</span><span style="color: gray;"><br />
</span><span style="color: green;">global</span><span style="color: gray;"> </span><span style="color: #00008b;">$MY_SESS_CONN</span><span style="color: gray;">;</p>
<p></span><span style="color: #00008b;">$sql</span><span style="color: gray;"> = </span><span style="color: #8b0000;">&#8216;</span><span style="color: red;">DELETE FROM sess WHERE expiry&lt; </span><span style="color: #8b0000;">&#8216;</span><span style="color: gray;"> . </span><span style="color: blue;">time</span><span style="color: olive;">()</span><span style="color: gray;">;<br />
</span><span style="color: #00008b;">$MY_SESS_CONN</span><span style="color: gray;">-&gt;</span><span style="color: blue;">Execute</span><span style="color: olive;">(</span><span style="color: #00008b;">$sql</span><span style="color: olive;">)</span><span style="color: gray;">;<br />
</span><span style="color: #ffa500;">//由于经常性的对表 sess 做删除操作，容易产生碎片，</span><span style="color: gray;"><br />
</span><span style="color: #ffa500;">//所以在垃圾回收中对该表进行优化操作。</span><span style="color: gray;"><br />
</span><span style="color: #00008b;">$sql</span><span style="color: gray;"> = </span><span style="color: #8b0000;">&#8216;</span><span style="color: red;">OPTIMIZE TABLE sess</span><span style="color: #8b0000;">&#8216;</span><span style="color: gray;">;<br />
</span><span style="color: #00008b;">$MY_SESS_CONN</span><span style="color: gray;">-&gt;</span><span style="color: blue;">Execute</span><span style="color: olive;">(</span><span style="color: #00008b;">$sql</span><span style="color: olive;">)</span><span style="color: gray;">;<br />
</span><span style="color: green;">return</span><span style="color: gray;"> </span><span style="color: green;">true</span><span style="color: gray;">;<br />
</span><span style="color: olive;">}</span><span style="color: gray;"> </span><span style="color: #ffa500;">//end function</span><span style="color: gray;"><br />
</span><span style="color: olive;">}</span><span style="color: gray;"> </span><span style="color: #ffa500;">///:~</span><span style="color: gray;"></p>
<p></span><span style="color: #ffa500;">//使用 ADOdb 作为数据库抽象层。</span><span style="color: gray;"><br />
</span><span style="color: green;">require_once</span><span style="color: olive;">(</span><span style="color: #8b0000;">&#8216;</span><span style="color: red;">adodb/adodb.inc.php</span><span style="color: #8b0000;">&#8216;</span><span style="color: olive;">)</span><span style="color: gray;">;<br />
</span><span style="color: #ffa500;">//数据库配置项，可放入配置文件中（如：config.inc.php）。</span><span style="color: gray;"><br />
</span><span style="color: #00008b;">$db_type</span><span style="color: gray;"> = </span><span style="color: #8b0000;">&#8216;</span><span style="color: red;">mysql</span><span style="color: #8b0000;">&#8216;</span><span style="color: gray;">;<br />
</span><span style="color: #00008b;">$db_host</span><span style="color: gray;"> = </span><span style="color: #8b0000;">&#8216;</span><span style="color: red;">192.168.212.1</span><span style="color: #8b0000;">&#8216;</span><span style="color: gray;">;<br />
</span><span style="color: #00008b;">$db_user</span><span style="color: gray;"> = </span><span style="color: #8b0000;">&#8216;</span><span style="color: red;">sess_user</span><span style="color: #8b0000;">&#8216;</span><span style="color: gray;">;<br />
</span><span style="color: #00008b;">$db_pass</span><span style="color: gray;"> = </span><span style="color: #8b0000;">&#8216;</span><span style="color: red;">sess_pass</span><span style="color: #8b0000;">&#8216;</span><span style="color: gray;">;<br />
</span><span style="color: #00008b;">$db_name</span><span style="color: gray;"> = </span><span style="color: #8b0000;">&#8216;</span><span style="color: red;">sess_db</span><span style="color: #8b0000;">&#8216;</span><span style="color: gray;">;<br />
</span><span style="color: #ffa500;">//创建数据库连接，这是一个全局变量。</span><span style="color: gray;"><br />
</span><span style="color: #00008b;">$GLOBALS</span><span style="color: olive;">[</span><span style="color: #8b0000;">'</span><span style="color: red;">MY_SESS_CONN</span><span style="color: #8b0000;">'</span><span style="color: olive;">]</span><span style="color: gray;"> =&amp; </span><span style="color: blue;">ADONewConnection</span><span style="color: olive;">(</span><span style="color: #00008b;">$db_type</span><span style="color: olive;">)</span><span style="color: gray;">;<br />
</span><span style="color: #00008b;">$GLOBALS</span><span style="color: olive;">[</span><span style="color: #8b0000;">'</span><span style="color: red;">MY_SESS_CONN</span><span style="color: #8b0000;">'</span><span style="color: olive;">]</span><span style="color: gray;">-&gt;</span><span style="color: blue;">Connect</span><span style="color: olive;">(</span><span style="color: gray;"> </span><span style="color: #00008b;">$db_host</span><span style="color: gray;">, </span><span style="color: #00008b;">$db_user</span><span style="color: gray;">, </span><span style="color: #00008b;">$db_pass</span><span style="color: gray;">, </span><span style="color: #00008b;">$db_name</span><span style="color: olive;">)</span><span style="color: gray;">;<br />
</span><span style="color: #ffa500;">//初始化 SESSION 设置，必须在 session_start() 之前运行！！</span><span style="color: gray;"><br />
</span><span style="color: blue;">My_Sess</span><span style="color: gray;">::</span><span style="color: blue;">init</span><span style="color: olive;">()</span><span style="color: gray;">;</span><span style="color: gray;"><br />
?&gt;</span></div>
</div>
<p>五、遗留问题</p>
<p>如果网站的访问量很大的话，SESSION 的读写会频繁地对数据库进行操作，这样效率就会明显降低。考虑到 SESSION 数据一般不会很大，可以尝试用 C/Java 写个多线程的程序，用 HASH 表保存 SESSION 数据，并通过 socket 通信进行数据读写，这样 SESSION 就保存在内存中，读写速度应该会快很多。另外还可以通过负载均衡来分担服务器负载。不过这些都只是我自己的一些想法和假设，并没有实践过</p>
<h2  class="related_post_title">Related Posts / 相关文章</h2><ul class="related_post"><li><a href="http://slj.me/2011/08/web-open-source-project/" title="疯狂的 Web 应用开源项目">疯狂的 Web 应用开源项目</a></li><li><a href="http://slj.me/2011/06/php-daemon-notice/" title="[转] 代替bash，书写 PHP daemon 后台程序">[转] 代替bash，书写 PHP daemon 后台程序</a></li><li><a href="http://slj.me/2011/04/xdebug-for-php/" title="Xdebug for php 一个实用的PHP调试扩展">Xdebug for php 一个实用的PHP调试扩展</a></li><li><a href="http://slj.me/2010/12/php-ini_set-fail-reason/" title="PHP ini_set() 无效的原因">PHP ini_set() 无效的原因</a></li><li><a href="http://slj.me/2010/12/centos-php5-2-yum/" title="CentOS 用 yum 官方源安裝 PHP5.2.x">CentOS 用 yum 官方源安裝 PHP5.2.x</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://slj.me/2011/02/php-share-session-between-servers/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>2010中国首届微博开发者大会演讲稿PPT</title>
		<link>http://slj.me/2010/12/2010-china-tblog-ppt/</link>
		<comments>http://slj.me/2010/12/2010-china-tblog-ppt/#comments</comments>
		<pubDate>Sat, 18 Dec 2010 13:32:29 +0000</pubDate>
		<dc:creator>SLJ</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web Structure]]></category>
		<category><![CDATA[backend]]></category>
		<category><![CDATA[ppt]]></category>

		<guid isPermaLink="false">http://slj.me/?p=2117</guid>
		<description><![CDATA[2010中国首届微博开发者大会演讲稿PPT 演讲视频 微博架构与平台安全 Related Posts / 相关文章PHP Quebec 2009 PHP全球聚会PPT下载]]></description>
			<content:encoded><![CDATA[<p>2010中国首届<a href="http://open.t.sina.com.cn/conference/">微博开发者大会</a>演讲稿PPT</p>
<p><a href="http://video.sina.com.cn/p/tech/i/v/2010-11-16/232961185323.html">演讲视频</a></p>
<div id="__ss_5861024" style="width: 425px;"><strong><a title="微博架构与平台安全" href="http://www.slideshare.net/iso1600/ss-5861024">微博架构与平台安全</a></strong><object id="__sse5861024" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="355" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=2-101122080933-phpapp02&amp;stripped_title=ss-5861024&amp;userName=iso1600" /><param name="name" value="__sse5861024" /><param name="allowfullscreen" value="true" /><embed id="__sse5861024" type="application/x-shockwave-flash" width="425" height="355" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=2-101122080933-phpapp02&amp;stripped_title=ss-5861024&amp;userName=iso1600" name="__sse5861024" allowscriptaccess="always" allowfullscreen="true"></embed></object></div>
<h2  class="related_post_title">Related Posts / 相关文章</h2><ul class="related_post"><li><a href="http://slj.me/2009/04/php-quebec-2009-ppt-download/" title="PHP Quebec 2009 PHP全球聚会PPT下载">PHP Quebec 2009 PHP全球聚会PPT下载</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://slj.me/2010/12/2010-china-tblog-ppt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP ini_set() 无效的原因</title>
		<link>http://slj.me/2010/12/php-ini_set-fail-reason/</link>
		<comments>http://slj.me/2010/12/php-ini_set-fail-reason/#comments</comments>
		<pubDate>Sat, 18 Dec 2010 03:22:37 +0000</pubDate>
		<dc:creator>SLJ</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[ini]]></category>

		<guid isPermaLink="false">http://slj.me/?p=2114</guid>
		<description><![CDATA[关于ini_set,post_max_size,upload_max_filesize,magic_quotes_gpc等用ini_set设置不了! ini_set(&#8216;max_execution_time&#8217;,&#8217;10&#8242;); ini_set(&#8216;memory_limit&#8217;,&#8217;1024M&#8217;); echo &#8216;max_execution_time = &#8216; . ini_get(&#8216;max_execution_time&#8217;) . &#8221; &#8220;; echo &#8216;memory_limit = &#8216; . ini_get(&#8216;memory_limit&#8217;) . &#8221; &#8220;; echo &#8216;post_max_size = &#8216; . ini_get(&#8216;post_max_size&#8217;) . &#8221; &#8220;; echo &#8216;upload_max_filesize = &#8216; . ini_get(&#8216;upload_max_filesize&#8217;) . &#8221; &#8220;; ini_set(&#8216;max_execution_time&#8217;,&#8217;10&#8242;); ini_set(&#8216;memory_limit&#8217;,&#8217;1024M&#8217;); 注意: post_max_size,upload_max_filesize用下面的方法是修改不了的. ini_set(&#8216;post_max_size&#8217;,&#8217;1024M&#8217;); ini_set(&#8216;upload_max_filesize&#8217;,&#8217;1024M&#8217;); 正确做法是用.htaccess文件: php_value upload_max_filesize &#8220;80M&#8221; php_value post_max_size &#8220;80M&#8221; php_value max_execution_time &#8220;2000&#8243; [...]]]></description>
			<content:encoded><![CDATA[<p>关于ini_set,post_max_size,upload_max_filesize,magic_quotes_gpc等用ini_set设置不了!</p>
<p>ini_set(&#8216;max_execution_time&#8217;,&#8217;10&#8242;);<br />
ini_set(&#8216;memory_limit&#8217;,&#8217;1024M&#8217;);</p>
<p><span id="more-2114"></span>echo &#8216;max_execution_time = &#8216; . ini_get(&#8216;max_execution_time&#8217;) . &#8221;<br />
&#8220;;<br />
echo &#8216;memory_limit = &#8216; . ini_get(&#8216;memory_limit&#8217;) . &#8221;<br />
&#8220;;<br />
echo &#8216;post_max_size = &#8216; . ini_get(&#8216;post_max_size&#8217;) . &#8221;<br />
&#8220;;<br />
echo &#8216;upload_max_filesize = &#8216; . ini_get(&#8216;upload_max_filesize&#8217;) . &#8221;<br />
&#8220;;</p>
<p>ini_set(&#8216;max_execution_time&#8217;,&#8217;10&#8242;);<br />
ini_set(&#8216;memory_limit&#8217;,&#8217;1024M&#8217;);<br />
注意:<br />
post_max_size,upload_max_filesize用下面的方法是修改不了的.<br />
ini_set(&#8216;post_max_size&#8217;,&#8217;1024M&#8217;);<br />
ini_set(&#8216;upload_max_filesize&#8217;,&#8217;1024M&#8217;);<br />
正确做法是用.htaccess文件:<br />
php_value upload_max_filesize &#8220;80M&#8221;<br />
php_value post_max_size &#8220;80M&#8221;<br />
php_value max_execution_time &#8220;2000&#8243;<br />
php_value memory_limit &#8220;150M&#8221;</p>
<p>补充知识点：<br />
其实在php文档里有说明upload_max_filesize的可修改范围是PHP_INI_PERDIR。<br />
PHP_INI_PERDIR的意思是域内指令可以在php.ini、httpd.conf或.htaccess文件中修改。<br />
PHP_INI_SYSTEM       域内指令可以在php.ini和httpd.conf文件中修改<br />
所以upload_max_filesize用int_set是无法修改的。只有可修改范围是PHP_INI_ALL的才可以用int_set修改。</p>
<p>magic_quotes_gpc 用 get_magic_quotes_gpc() 获得，不能用 set_magic_quotes_gpc 修改，原因是没这个函数。而magic_quotes_runtime可以用set_magic_quotes_runtime()来设置</p>
<h2  class="related_post_title">Related Posts / 相关文章</h2><ul class="related_post"><li><a href="http://slj.me/2011/08/web-open-source-project/" title="疯狂的 Web 应用开源项目">疯狂的 Web 应用开源项目</a></li><li><a href="http://slj.me/2011/06/php-daemon-notice/" title="[转] 代替bash，书写 PHP daemon 后台程序">[转] 代替bash，书写 PHP daemon 后台程序</a></li><li><a href="http://slj.me/2011/04/xdebug-for-php/" title="Xdebug for php 一个实用的PHP调试扩展">Xdebug for php 一个实用的PHP调试扩展</a></li><li><a href="http://slj.me/2011/02/php-share-session-between-servers/" title="PHP 实现多服务器共享 SESSION 数据">PHP 实现多服务器共享 SESSION 数据</a></li><li><a href="http://slj.me/2010/12/centos-php5-2-yum/" title="CentOS 用 yum 官方源安裝 PHP5.2.x">CentOS 用 yum 官方源安裝 PHP5.2.x</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://slj.me/2010/12/php-ini_set-fail-reason/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CentOS 用 yum 官方源安裝 PHP5.2.x</title>
		<link>http://slj.me/2010/12/centos-php5-2-yum/</link>
		<comments>http://slj.me/2010/12/centos-php5-2-yum/#comments</comments>
		<pubDate>Tue, 14 Dec 2010 14:01:37 +0000</pubDate>
		<dc:creator>SLJ</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web Structure]]></category>
		<category><![CDATA[CentOS]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[yum]]></category>

		<guid isPermaLink="false">http://slj.me/?p=2105</guid>
		<description><![CDATA[由于CentOS默认yum安装php的版本是5.1.6，使用yum update命令不能升级php到最新版本。 并且PHP在5.2之前都有个小小的错误，升级到最新版的PHP是非常有必要的。 以下为在CentOS5.4用yum安装PHP5.2.9的步骤。 首先在/etc/yum.repos.d/CentOS-Base.repo 文件末尾添加以下代码： [c5-testing] name=CentOS-5 Testing baseurl=http://dev.centos.org/centos/$releasever/testing/$basearch/ enabled=0 gpgcheck=1 gpgkey=http://dev.centos.org/centos/RPM-GPG-KEY-CentOS-testing 保存此文件，执行 yum &#8211;disablerepo=* &#8211;enablerepo=c5-testing update php 接着根据提示Y同意执行，另外如果装有ZEND，则根据实际情况是否需要修改zend在php.ini和选择正确对应的ZendOptimizer.so ，然后再执行service httpd restart 重启Apache。 最后输入php -v 检查是否已经升级成功。 Related Posts / 相关文章分享21Andy的CentOS的repoCentOS 安装 Apache 后其他机器无法访问的解决方法疯狂的 Web 应用开源项目[转] 代替bash，书写 PHP daemon 后台程序Xdebug for php 一个实用的PHP调试扩展]]></description>
			<content:encoded><![CDATA[<p> 由于CentOS默认yum安装php的版本是5.1.6，使用yum update命令不能升级php到最新版本。 <span>并且PHP在5.2之前都有个小小的错误，升级到最新版的PHP是非常有必要的。<br />
 以下为在CentOS5.4用yum安装PHP5.2.9的步骤。 <span>首先在/etc/yum.repos.d/CentOS-Base.repo 文件末尾添加以下代码：</p>
<blockquote><p>
[c5-testing]<br />
name=CentOS-5 Testing<br />
baseurl=http://dev.centos.org/centos/$releasever/testing/$basearch/<br />
enabled=0<br />
gpgcheck=1<br />
gpgkey=http://dev.centos.org/centos/RPM-GPG-KEY-CentOS-testing</p></blockquote>
<p> 保存此文件，执行<br />
yum &#8211;disablerepo=* &#8211;enablerepo=c5-testing update php<br />
接着根据提示Y同意执行，另外如果装有ZEND，则根据实际情况是否需要修改zend在php.ini和选择正确对应的ZendOptimizer.so ，然后再执行service httpd restart 重启Apache。 最后输入php -v 检查是否已经升级成功。</span></span></p>
<h2  class="related_post_title">Related Posts / 相关文章</h2><ul class="related_post"><li><a href="http://slj.me/2011/03/21andy-centos-repo/" title="分享21Andy的CentOS的repo">分享21Andy的CentOS的repo</a></li><li><a href="http://slj.me/2010/12/centos-apache-firewall-settings/" title="CentOS 安装 Apache 后其他机器无法访问的解决方法">CentOS 安装 Apache 后其他机器无法访问的解决方法</a></li><li><a href="http://slj.me/2011/08/web-open-source-project/" title="疯狂的 Web 应用开源项目">疯狂的 Web 应用开源项目</a></li><li><a href="http://slj.me/2011/06/php-daemon-notice/" title="[转] 代替bash，书写 PHP daemon 后台程序">[转] 代替bash，书写 PHP daemon 后台程序</a></li><li><a href="http://slj.me/2011/04/xdebug-for-php/" title="Xdebug for php 一个实用的PHP调试扩展">Xdebug for php 一个实用的PHP调试扩展</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://slj.me/2010/12/centos-php5-2-yum/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Mac OS 中为PHP编译memcache.so</title>
		<link>http://slj.me/2010/12/compile-memcache-so-for-php-in-mac-os/</link>
		<comments>http://slj.me/2010/12/compile-memcache-so-for-php-in-mac-os/#comments</comments>
		<pubDate>Thu, 09 Dec 2010 07:10:07 +0000</pubDate>
		<dc:creator>SLJ</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web Structure]]></category>
		<category><![CDATA[macos]]></category>
		<category><![CDATA[memcache]]></category>

		<guid isPermaLink="false">http://slj.me/?p=2090</guid>
		<description><![CDATA[在Mac OS中给PHP编译memcache.so扩展其实没那么复杂，不过首先请先确认你的MacOS是32位的还是64位的。如果是64位的请在开始阅读下文前先看最后一段： 1，由于 MacOS 下的 PHP 没有 PECL, 所以请自行下载源码并且编译！ http://pecl.php.net/package/memcache 展开后在目录中执行 phpize; configure; make; sudo make install 2，编辑你的PHP.INI： vim /etc/php.ini: 按需设置你的扩展目录: extension_dir = /usr/lib/php/extensions/no-debug-non-zts-20060613/ 并且同时请增加扩展： extension=memcache.so 3，试试看能不能用？如果出现类似如下错误： PHP Startup: Unable to load dynamic library ‘/usr/lib/php/extensions/no-debug-non-zts-20060613/memcache.so’ – (null) in Unknown on line 0 原因是因为你使用的MacOS是64位的。这个时候得重新编译。 在执行./configure时请使用参数如下： MACOSX_DEPLOYMENT_TARGET=10.5 CFLAGS=”-arch ppc -arch ppc64 -arch i386 -arch x86_64 -g -Os [...]]]></description>
			<content:encoded><![CDATA[<p>在Mac OS中给PHP编译memcache.so扩展其实没那么复杂，不过首先请先确认你的MacOS是32位的还是64位的。如果是64位的请在开始阅读下文前先看最后一段：<br />
<span id="more-2090"></span><br />
1，由于 MacOS 下的 PHP 没有 PECL, 所以请自行下载源码并且编译！<br />
<a href="http://pecl.php.net/package/memcache" rel="external nofollow">http://pecl.php.net/package/memcache</a><br />
展开后在目录中执行 phpize; configure; make; sudo make install</p>
<p>2，编辑你的PHP.INI：<br />
vim /etc/php.ini:<br />
按需设置你的扩展目录:<br />
extension_dir = /usr/lib/php/extensions/no-debug-non-zts-20060613/<br />
并且同时请增加扩展：<br />
extension=memcache.so</p>
<p>3，试试看能不能用？如果出现类似如下错误：<br />
PHP Startup: Unable to load dynamic library ‘/usr/lib/php/extensions/no-debug-non-zts-20060613/memcache.so’ – (null) in Unknown on line 0</p>
<p>原因是因为你使用的MacOS是64位的。这个时候得重新编译。<br />
在执行./configure时请使用参数如下：<br />
MACOSX_DEPLOYMENT_TARGET=10.5 CFLAGS=”-arch ppc -arch ppc64 -arch i386 -arch x86_64 -g -Os -pipe -no-cpp-precomp” CCFLAGS=”-arch ppc -arch ppc64 -arch i386 -arch x86_64 -g -Os -pipe” CXXFLAGS=”-arch ppc -arch ppc64 -arch i386 -arch x86_64 -g -Os -pipe” LDFLAGS=”-arch ppc -arch ppc64 -arch i386 -arch x86_64 -bind_at_load” ./configure<br />
记得把中文引号改成半角英文的哦！而且记得先sudo su，否则无效哦！</p>
<h2  class="related_post_title">Related Posts / 相关文章</h2><ul class="related_post"><li><a href="http://slj.me/2011/04/redis-cli-commands/" title="[Redis] redis-cli 命令总结">[Redis] redis-cli 命令总结</a></li><li><a href="http://slj.me/2010/12/php-memcached-permission-denied/" title="PHP无法操作memcached提示Permission denied的解决方法">PHP无法操作memcached提示Permission denied的解决方法</a></li><li><a href="http://slj.me/2010/12/memcache-basic/" title="Memcache 基础">Memcache 基础</a></li><li><a href="http://slj.me/2010/12/install-memcache-on-centos/" title="安装memcache到CentOS（另附yum法）">安装memcache到CentOS（另附yum法）</a></li><li><a href="http://slj.me/2009/04/apcalternative-php-cache-memcache/" title="关于APC(Alternative PHP Cache)和MemCache">关于APC(Alternative PHP Cache)和MemCache</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://slj.me/2010/12/compile-memcache-so-for-php-in-mac-os/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>安装memcache到CentOS（另附yum法）</title>
		<link>http://slj.me/2010/12/install-memcache-on-centos/</link>
		<comments>http://slj.me/2010/12/install-memcache-on-centos/#comments</comments>
		<pubDate>Mon, 06 Dec 2010 12:16:49 +0000</pubDate>
		<dc:creator>SLJ</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web Structure]]></category>
		<category><![CDATA[CentOS]]></category>
		<category><![CDATA[memcache]]></category>

		<guid isPermaLink="false">http://slj.me/?p=2073</guid>
		<description><![CDATA[转载一篇在CentOS上安装memcache的方法。 所有操作都在SSH下，以根帐号登录。 我的版本为Centos Release 5.3 (Final) 使用这个命令可以知道你的Linux版本 cat /etc/redhat-release 首先要安装libevent库。 cd /usr/local/src curl -O http://monkey.org/~provos/libevent-1.4.10-stable.tar.gz tar xzvf libevent-1.4.10-stable.tar.gz cd libevent-1.4.10-stable ./configure &#8211;prefix=/usr/local make make install 接下来就是安装memcached cd /usr/local/src curl -O http://www.danga.com/memcached/dist/memcached-1.2.8.tar.gz tar xzvf memcached-1.2.8.tar.gz cd memcached-1.2.8 LDFLAGS=&#8217;-Wl,&#8211;rpath /usr/local/lib&#8217; ./configure &#8211;prefix=/usr/local make make install 安装完毕后，用下面这个命令以用户root来运行memcache memcached -u root -d -m 64 -l 192.168.0.101 -p 11211 root [...]]]></description>
			<content:encoded><![CDATA[<p>转载一篇在CentOS上安装memcache的方法。</p>
<p>所有操作都在SSH下，以根帐号登录。</p>
<p>我的版本为Centos Release 5.3 (Final)<br />
使用这个命令可以知道你的Linux版本<br />
cat /etc/redhat-release<br />
<span id="more-2073"></span>首先要安装libevent库。<br />
cd /usr/local/src<br />
curl -O http://monkey.org/~provos/libevent-1.4.10-stable.tar.gz<br />
tar xzvf libevent-1.4.10-stable.tar.gz<br />
cd libevent-1.4.10-stable<br />
./configure &#8211;prefix=/usr/local<br />
make<br />
make install</p>
<p>接下来就是安装memcached</p>
<div>
<div id="more">
<p>cd /usr/local/src<br />
curl -O http://www.danga.com/memcached/dist/memcached-1.2.8.tar.gz<br />
tar xzvf memcached-1.2.8.tar.gz<br />
cd memcached-1.2.8<br />
LDFLAGS=&#8217;-Wl,&#8211;rpath /usr/local/lib&#8217; ./configure &#8211;prefix=/usr/local<br />
make<br />
make install</p>
<p>安装完毕后，用下面这个命令以用户root来运行memcache<br />
memcached -u root -d -m 64 -l 192.168.0.101 -p 11211<br />
root 为所执行的用户<br />
64 为缓存大小64M<br />
192.168.0.101 为所在的服务器IP地址<br />
11211 是所在端口</p>
<p>要关闭memcache<br />
pkill memcached</p>
<p>接下来是安装php-pecl-memcache<br />
一个命令就可以。<br />
yum install php-pecl-memcache</p>
<p>还是需要php扩展，就用下面这个命令<br />
pecl install memcache</p>
<p>接下来重启apache，用phpinfo()查看，应该可以看到memcache的部分，如果没有的话，检查这里的设置：<br />
/etc/php.ini加上了 extension=memcache.so<br />
当然也要确认memcache.so是否存在，是否在/usr/lib/php/modules/下，如果不是，那么找到它，并用完整路径表示。</p>
<p>查看memcache的运行情况，可以用memcache.php来查看。<br />
当让也要有web 程序支持才有用，比如我用的phpbb 3就可以使用memcache，具体方法参考<a href="http://www.yinfor.com/blog/archives/2009/06/enable_memcache_on_phpbb_3.html">这里</a><br />
<a href="http://seo.g2soft.net/assets-c/2009/06/memcache-256.html"><br />
</a></p>
</div>
</div>
<p>原作者: <a rel="external nofollow" href="http://www.yinfor.com/blog/">David Yin</a></p>
<h2>Update</h2>
<p>不过我今天实战中并没有使用上面的方法：</p>
<p>介绍一下yum的方法：</p>
<p>yum install libevent</p>
<p>这个是第一步，</p>
<p>第二步是安装memcache，但是标准的CentOS5软件仓库里面是没有memcache相应的包的,所以，我们的第一步就是导入第三方软件仓库，这里推荐的是 Dag Wieers 库（现在叫 RPMForge 了），安装方法如下：</p>
<div>wget http://dag.wieers.com/rpm/packages/rpmforge-release/rpmforge-release-0.3.6-1.el5.rf.i386.rpm</div>
<div>rpm -ivh rpmforge-release-0.3.6-1.el5.rf.i386.rpm</div>
<div>查找相关软件包</div>
<div>yum search memcache</div>
<div>有了，现在可以安装了</div>
<div>yum -y install –enablerepo=rpmforge memcached php-pecl-memcache</div>
<div>验证一下安装结果</div>
<div>memcached -h</div>
<div>php -m|grep memcache</div>
<div>启动memcached</div>
<div>/sbin/servive memcached start</div>
<p>============</p>
<p>Update  Dec 16th</p>
<p>Linux下Memcache服务器端的安装<br />
服务器端主要是安装memcache服务器端，目前的最新版本是 memcached-1.3.0 。<br />
下载：http://www.danga.com/memcached/dist/memcached-1.2.2.tar.gz<br />
另外，Memcache用到了libevent这个库用于Socket的处理，所以还需要安装libevent，libevent的最新版本是libevent-1.3。（如果你的系统已经安装了libevent，可以不用安装）<br />
官网：http://www.monkey.org/~provos/libevent/<br />
下载：http://www.monkey.org/~provos/libevent-1.3.tar.gz</p>
<p>用wget指令直接下载这两个东西.下载回源文件后。<br />
1.先安装libevent。这个东西在配置时需要指定一个安装路径，即./configure –prefix=/usr；然后make；然后make install；<br />
2.再安装memcached，只是需要在配置时需要指定libevent的安装路径即./configure –with-libevent=/usr；然后make；然后make install；<br />
这样就完成了Linux下Memcache服务器端的安装。详细的方法如下：</p>
<p>    1.分别把memcached和libevent下载回来，放到 /tmp 目录下：<br />
    # cd /tmp<br />
    # wget http://www.danga.com/memcached/dist/memcached-1.2.0.tar.gz<br />
    # wget http://www.monkey.org/~provos/libevent-1.2.tar.gz</p>
<p>    2.先安装libevent：<br />
    # tar zxvf libevent-1.2.tar.gz<br />
    # cd libevent-1.2<br />
    # ./configure –prefix=/usr<br />
    # make<br />
    # make install</p>
<p>    3.测试libevent是否安装成功：<br />
    # ls -al /usr/lib | grep libevent<br />
    lrwxrwxrwx 1 root root 21 11?? 12 17:38 libevent-1.2.so.1 -> libevent-1.2.so.1.0.3<br />
    -rwxr-xr-x 1 root root 263546 11?? 12 17:38 libevent-1.2.so.1.0.3<br />
    -rw-r–r– 1 root root 454156 11?? 12 17:38 libevent.a<br />
    -rwxr-xr-x 1 root root 811 11?? 12 17:38 libevent.la<br />
    lrwxrwxrwx 1 root root 21 11?? 12 17:38 libevent.so -> libevent-1.2.so.1.0.3<br />
    还不错，都安装上了。</p>
<p>    4.安装memcached，同时需要安装中指定libevent的安装位置：<br />
    # cd /tmp<br />
    # tar zxvf memcached-1.2.0.tar.gz<br />
    # cd memcached-1.2.0<br />
    # ./configure –with-libevent=/usr<br />
    # make<br />
    # make install<br />
    如果中间出现报错，请仔细检查错误信息，按照错误信息来配置或者增加相应的库或者路径。<br />
    安装完成后会把memcached放到 /usr/local/bin/memcached ，</p>
<p>    5.测试是否成功安装memcached：<br />
    # ls -al /usr/local/bin/mem*<br />
    -rwxr-xr-x 1 root root 137986 11?? 12 17:39 /usr/local/bin/memcached<br />
    -rwxr-xr-x 1 root root 140179 11?? 12 17:39 /usr/local/bin/memcached-debug </p>
<p>安装Memcache的PHP扩展<br />
1.在http://pecl.php.net/package/memcache 选择相应想要下载的memcache版本。<br />
2.安装PHP的memcache扩展</p>
<p>tar vxzf memcache-2.2.1.tgz<br />
cd memcache-2.2.1<br />
/usr/bin/phpize<br />
./configure -enable-memcache -with-php-config=/usr/bin/php-config -with-zlib-dir<br />
make<br />
make install</p>
<p>3.上述安装完后会有类似这样的提示：</p>
<p>    Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-2007xxxx/</p>
<p>4.把php.ini中的extension_dir = “./”修改为</p>
<p>    extension_dir = “/usr/local/php/lib/php/extensions/no-debug-non-zts-2007xxxx/”</p>
<p>5.添加一行来载入memcache扩展：extension=memcache.so</p>
<p>memcached的基本设置：<br />
1.启动Memcache的服务器端：<br />
# /usr/local/bin/memcached -d -m 10 -u root -l 66.90.103.147 -p 12000 -c 256 -P /tmp/memcached.pid</p>
<p>    -d选项是启动一个守护进程，<br />
    -m是分配给Memcache使用的内存数量，单位是MB，我这里是10MB，<br />
    -u是运行Memcache的用户，我这里是root，<br />
    -l是监听的服务器IP地址，如果有多个地址的话，我这里指定了服务器的IP地址192.168.0.200，<br />
    -p是设置Memcache监听的端口，我这里设置了12000，最好是1024以上的端口，<br />
    -c选项是最大运行的并发连接数，默认是1024，我这里设置了256，按照你服务器的负载量来设定，<br />
    -P是设置保存Memcache的pid文件，我这里是保存在 /tmp/memcached.pid，</p>
<p>2.如果要结束Memcache进程，执行：</p>
<p>    # kill `cat /tmp/memcached.pid`</p>
<p>也可以启动多个守护进程，不过端口不能重复。</p>
<p>3.重启apache，service httpd restart</p>
<p>Memcache环境测试：<br />
运行下面的php文件，如果有输出This is a test!，就表示环境搭建成功。开始领略Memcache的魅力把！<br />
< ?php<br />
$mem = new Memcache;<br />
$mem->connect(&#8220;66.90.103.147&#8243;, 12000);<br />
$mem->set(&#8216;key&#8217;,'This is a test!&#8217;, 0, 60);<br />
$val = $mem->get(&#8216;key&#8217;);<br />
echo $val;<br />
?></p>
<h2  class="related_post_title">Related Posts / 相关文章</h2><ul class="related_post"><li><a href="http://slj.me/2010/12/php-memcached-permission-denied/" title="PHP无法操作memcached提示Permission denied的解决方法">PHP无法操作memcached提示Permission denied的解决方法</a></li><li><a href="http://slj.me/2011/04/redis-cli-commands/" title="[Redis] redis-cli 命令总结">[Redis] redis-cli 命令总结</a></li><li><a href="http://slj.me/2011/03/21andy-centos-repo/" title="分享21Andy的CentOS的repo">分享21Andy的CentOS的repo</a></li><li><a href="http://slj.me/2010/12/centos-php5-2-yum/" title="CentOS 用 yum 官方源安裝 PHP5.2.x">CentOS 用 yum 官方源安裝 PHP5.2.x</a></li><li><a href="http://slj.me/2010/12/centos-apache-firewall-settings/" title="CentOS 安装 Apache 后其他机器无法访问的解决方法">CentOS 安装 Apache 后其他机器无法访问的解决方法</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://slj.me/2010/12/install-memcache-on-centos/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>PHP 5.3 后被禁止使用的函数</title>
		<link>http://slj.me/2010/07/deprecated-features-for-php5-3/</link>
		<comments>http://slj.me/2010/07/deprecated-features-for-php5-3/#comments</comments>
		<pubDate>Sat, 17 Jul 2010 03:25:32 +0000</pubDate>
		<dc:creator>SLJ</dc:creator>
				<category><![CDATA[Life]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://slj.me/?p=1915</guid>
		<description><![CDATA[很久没写博客。最近还是在做Meeplace的Custom works以及2.9版的工作。同时着手准备我们的新项目Meesocial。目前不能透露内容，大家敬请期待吧。。。 今天在MacOS上安装了5.3版的PHP，结果是：对于Meeplace 2.8（调试环境）在一些页面下会警告错误。（产品级不会有警告）。查询后得知PHP5.3已经禁止了一些函数的使用，或者将其更名。在Meeplace 2.9中将兼容PHP 5.3。 官网上的说明：http://cn2.php.net/manual/en/migration53.deprecated.php 下面摘抄PHP5.3被禁止的函数 Deprecated functions: call_user_method() (use call_user_func() instead) call_user_method_array() (use call_user_func_array()instead) define_syslog_variables() dl() ereg() (use preg_match() instead) ereg_replace() (use preg_replace() instead) eregi() (use preg_match() with the &#8216;i&#8217; modifier instead) eregi_replace() (use preg_replace() with the &#8216;i&#8217; modifier instead) set_magic_quotes_runtime() and its alias,magic_quotes_runtime() session_register() (use the $_SESSION superglobal instead) session_unregister() (use the $_SESSION superglobal instead) session_is_registered() (use the $_SESSION superglobal instead) set_socket_blocking() [...]]]></description>
			<content:encoded><![CDATA[<p>很久没写博客。最近还是在做Meeplace的Custom works以及2.9版的工作。同时着手准备我们的新项目Meesocial。目前不能透露内容，大家敬请期待吧。。。</p>
<p>今天在MacOS上安装了5.3版的PHP，结果是：对于Meeplace 2.8（调试环境）在一些页面下会警告错误。（产品级不会有警告）。查询后得知PHP5.3已经禁止了一些函数的使用，或者将其更名。在Meeplace 2.9中将兼容PHP 5.3。</p>
<p>官网上的说明：http://cn2.php.net/manual/en/migration53.deprecated.php</p>
<p>下面摘抄PHP5.3被禁止的函数</p>
<p><span id="more-1915"></span>Deprecated functions:</p>
<ul>
<li><a rel="external nofollow" href="http://cn2.php.net/manual/en/function.call-user-method.php">call_user_method()</a> (use <a rel="external nofollow" href="http://cn2.php.net/manual/en/function.call-user-func.php">call_user_func()</a> instead)</li>
<li><a rel="external nofollow" href="http://cn2.php.net/manual/en/function.call-user-method-array.php">call_user_method_array()</a> (use <a rel="external nofollow" href="http://cn2.php.net/manual/en/function.call-user-func-array.php">call_user_func_array()</a>instead)</li>
<li><a rel="external nofollow" href="http://cn2.php.net/manual/en/function.define-syslog-variables.php">define_syslog_variables()</a></li>
<li><a rel="external nofollow" href="http://cn2.php.net/manual/en/function.dl.php">dl()</a></li>
<li><a rel="external nofollow" href="http://cn2.php.net/manual/en/function.ereg.php">ereg()</a> (use <a rel="external nofollow" href="http://cn2.php.net/manual/en/function.preg-match.php">preg_match()</a> instead)</li>
<li><a rel="external nofollow" href="http://cn2.php.net/manual/en/function.ereg-replace.php">ereg_replace()</a> (use <a rel="external nofollow" href="http://cn2.php.net/manual/en/function.preg-replace.php">preg_replace()</a> instead)</li>
<li><a rel="external nofollow" href="http://cn2.php.net/manual/en/function.eregi.php">eregi()</a> (use <a rel="external nofollow" href="http://cn2.php.net/manual/en/function.preg-match.php">preg_match()</a> with the <em>&#8216;i&#8217;</em> modifier instead)</li>
<li><a rel="external nofollow" href="http://cn2.php.net/manual/en/function.eregi-replace.php">eregi_replace()</a> (use <a rel="external nofollow" href="http://cn2.php.net/manual/en/function.preg-replace.php">preg_replace()</a> with the <em>&#8216;i&#8217;</em> modifier instead)</li>
<li><a rel="external nofollow" href="http://cn2.php.net/manual/en/function.set-magic-quotes-runtime.php">set_magic_quotes_runtime()</a> and its alias,<a rel="external nofollow" href="http://cn2.php.net/manual/en/function.magic-quotes-runtime.php">magic_quotes_runtime()</a></li>
<li><a rel="external nofollow" href="http://cn2.php.net/manual/en/function.session-register.php">session_register()</a> (use the <var></var><var><a rel="external nofollow" href="http://cn2.php.net/manual/en/reserved.variables.session.php">$_SESSION</a></var> superglobal instead)</li>
<li><a rel="external nofollow" href="http://cn2.php.net/manual/en/function.session-unregister.php">session_unregister()</a> (use the <var></var><var><a rel="external nofollow" href="http://cn2.php.net/manual/en/reserved.variables.session.php">$_SESSION</a></var> superglobal instead)</li>
<li><a rel="external nofollow" href="http://cn2.php.net/manual/en/function.session-is-registered.php">session_is_registered()</a> (use the <var></var><var><a rel="external nofollow" href="http://cn2.php.net/manual/en/reserved.variables.session.php">$_SESSION</a></var> superglobal instead)</li>
<li><a rel="external nofollow" href="http://cn2.php.net/manual/en/function.set-socket-blocking.php">set_socket_blocking()</a> (use <a rel="external nofollow" href="http://cn2.php.net/manual/en/function.stream-set-blocking.php">stream_set_blocking()</a> instead)</li>
<li><a rel="external nofollow" href="http://cn2.php.net/manual/en/function.split.php">split()</a> (use <a rel="external nofollow" href="http://cn2.php.net/manual/en/function.preg-split.php">preg_split()</a> instead)</li>
<li><a rel="external nofollow" href="http://cn2.php.net/manual/en/function.spliti.php">spliti()</a> (use <a rel="external nofollow" href="http://cn2.php.net/manual/en/function.preg-split.php">preg_split()</a> with the <em>&#8216;i&#8217;</em> modifier instead)</li>
<li><a rel="external nofollow" href="http://cn2.php.net/manual/en/function.sql-regcase.php">sql_regcase()</a></li>
<li><a rel="external nofollow" href="http://cn2.php.net/manual/en/function.mysql-db-query.php">mysql_db_query()</a> (use <a rel="external nofollow" href="http://cn2.php.net/manual/en/function.mysql-select-db.php">mysql_select_db()</a> and<a rel="external nofollow" href="http://cn2.php.net/manual/en/function.mysql-query.php">mysql_query()</a> instead)</li>
<li><a rel="external nofollow" href="http://cn2.php.net/manual/en/function.mysql-escape-string.php">mysql_escape_string()</a> (use <a rel="external nofollow" href="http://cn2.php.net/manual/en/function.mysql-real-escape-string.php">mysql_real_escape_string()</a>instead)</li>
<li>Passing locale category names as strings is now deprecated. Use the LC_* family of constants instead.</li>
<li>The <em><tt>is_dst</tt></em> parameter to <a rel="external nofollow" href="http://cn2.php.net/manual/en/function.mktime.php">mktime()</a>. Use the new timezone handling functions instead.</li>
</ul>
<h2  class="related_post_title">Related Posts / 相关文章</h2><ul class="related_post"><li><a href="http://slj.me/2011/08/web-open-source-project/" title="疯狂的 Web 应用开源项目">疯狂的 Web 应用开源项目</a></li><li><a href="http://slj.me/2011/06/php-daemon-notice/" title="[转] 代替bash，书写 PHP daemon 后台程序">[转] 代替bash，书写 PHP daemon 后台程序</a></li><li><a href="http://slj.me/2011/04/xdebug-for-php/" title="Xdebug for php 一个实用的PHP调试扩展">Xdebug for php 一个实用的PHP调试扩展</a></li><li><a href="http://slj.me/2011/02/php-share-session-between-servers/" title="PHP 实现多服务器共享 SESSION 数据">PHP 实现多服务器共享 SESSION 数据</a></li><li><a href="http://slj.me/2010/12/php-ini_set-fail-reason/" title="PHP ini_set() 无效的原因">PHP ini_set() 无效的原因</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://slj.me/2010/07/deprecated-features-for-php5-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Twitter Connect 转载自 Twitter 官方 Wiki</title>
		<link>http://slj.me/2010/04/twitter-connect-sign-in-with-twitter/</link>
		<comments>http://slj.me/2010/04/twitter-connect-sign-in-with-twitter/#comments</comments>
		<pubDate>Thu, 22 Apr 2010 05:22:30 +0000</pubDate>
		<dc:creator>SLJ</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://slj.me/?p=1710</guid>
		<description><![CDATA[Sign in with Twitter is the pattern of authentication that allows users to connect their Twitter account with third-party services in as little is one click. It utilizes OAuth and although the flow is very similar, the authorization URL and workflow differs slightly as described below. The normal flow dictates that applications send request tokens [...]]]></description>
			<content:encoded><![CDATA[<p><img height="260" width="595" class="thumb" alt="Twitter Connect" src="http://slj.me/wp-content/uploads/2010/04/twitter_connect_post_thumb.png"/></p>
<p><strong>Sign in with Twitter</strong> is the pattern of authentication that  allows users to connect their Twitter account with third-party services in as  little is one click. It utilizes OAuth and although the flow is very similar,  the authorization URL and workflow differs slightly as described below.</p>
<p>The normal flow dictates that applications send request tokens to oauth/authorize in Twitter&#8217;s  implementation of the OAuth Specification. To take advantage of <strong>Sign in  with Twitter</strong>, applications should send request tokens in the oauth_token parameter to oauth/authenticate instead.</p>
<p><span id="more-1710"></span><br />
The oauth/authenticate method  will perform the following:</p>
<ol>
<li>If the user is logged into Twitter.com and has already approved the calling  application, the user will be immediately authenticated and returned to the  callback URL.</li>
<li>If the user is not logged into Twitter.com and has already approved the  calling application, the user will be prompted to login to Twitter.com then will  be immediately authenticated and returned to the callback URL.</li>
<li>If the user is logged into Twitter.com and has not already approved the  calling application, the OAuth authorization prompt will be presented.  Authorizing users will then be redirected to the callback URL.</li>
<li>If the user is not logged into Twitter.com and has not already approved the  calling application, the user will be prompted to login to Twitter.com then will  be presented the authorization prompt before redirecting back to the callback  URL.</li>
</ol>
<p>This behavior is explained in the following flowchart:</p>
<p><img src="http://slj.me/wp-content/uploads/2010/04/oauth_sign_in_with_twitter_flow.png" alt="" /></p>
<h3><strong>Sign in with Twitter</strong> Buttons</h3>
<p>Twitter would prefer your application to use the following buttons. While it  is easy roll your own buttons or create text links, using these standard buttons  will instill user confidence and standardize the experience.</p>
<h4>Darker</h4>
<p><img src="http://slj.me/wp-content/uploads/2010/04/Sign-in-with-Twitter-darker.png" alt="" /></p>
<p><img src="http://slj.me/wp-content/uploads/2010/04/Sign-in-with-Twitter-darker-small.png" alt="" /></p>
<h4>Lighter</h4>
<p><img src="http://slj.me/wp-content/uploads/2010/04/Sign-in-with-Twitter-lighter.png" alt="" /></p>
<p><img src="http://slj.me/wp-content/uploads/2010/04/Sign-in-with-Twitter-lighter-small.png" alt="" /></p>
<p>Peter Denton has also created a <a href="http://twibs.com/oAuthButtons.php" target="_blank">number of buttons</a> to make this experience easy and  beautiful.</p>
<h2  class="related_post_title">Related Posts / 相关文章</h2><ul class="related_post"><li><a href="http://slj.me/2009/07/twitter-ops/" title="从 Twitter 运维技术经验可以学到什么">从 Twitter 运维技术经验可以学到什么</a></li><li><a href="http://slj.me/2009/06/louzui/" title="注册漏嘴网">注册漏嘴网</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://slj.me/2010/04/twitter-connect-sign-in-with-twitter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>php格式化数字：位数不足前面加0补足</title>
		<link>http://slj.me/2010/03/php%e6%a0%bc%e5%bc%8f%e5%8c%96%e6%95%b0%e5%ad%97%ef%bc%9a%e4%bd%8d%e6%95%b0%e4%b8%8d%e8%b6%b3%e5%89%8d%e9%9d%a2%e5%8a%a00%e8%a1%a5%e8%b6%b3/</link>
		<comments>http://slj.me/2010/03/php%e6%a0%bc%e5%bc%8f%e5%8c%96%e6%95%b0%e5%ad%97%ef%bc%9a%e4%bd%8d%e6%95%b0%e4%b8%8d%e8%b6%b3%e5%89%8d%e9%9d%a2%e5%8a%a00%e8%a1%a5%e8%b6%b3/#comments</comments>
		<pubDate>Sat, 06 Mar 2010 14:43:11 +0000</pubDate>
		<dc:creator>SLJ</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://slj.me/?p=1518</guid>
		<description><![CDATA[比如我要显示一个三位的数字，当位数不足时在前面加0占位： &#60;?php $var = sprintf(&#8220;%03d&#8221;, 12); echo $var; ?&#62; Other Posts / 其他文章[转]如何做好一份前端工程师的简历？23个iPhone App Store中的开源App及其源码空间总算是弄好了关于WordPress高亮代码插件的比较30个Wordpress统计插件]]></description>
			<content:encoded><![CDATA[<p>比如我要显示一个三位的数字，当位数不足时在前面加0占位：</p>
<p>&lt;?php<br />
$var = sprintf(&#8220;%03d&#8221;, 12);<br />
echo $var;<br />
?&gt;</p>
<h2  class="related_post_title">Other Posts / 其他文章</h2><ul class="related_post"><li><a href="http://slj.me/2009/03/cvs-svn-compare/" title="关于CVS和SVN">关于CVS和SVN</a></li><li><a href="http://slj.me/2010/03/ie-debug-tool/" title="几款IE的调试工具">几款IE的调试工具</a></li><li><a href="http://slj.me/2009/10/method-to-uncover-google-gmail-google-reader-for-iphone/" title="揭开iPhone版Google，Gmail，Google Reader神秘面纱的方法">揭开iPhone版Google，Gmail，Google Reader神秘面纱的方法</a></li><li><a href="http://slj.me/2010/04/%e7%94%a8css%e4%bf%ae%e6%ad%a3%e4%b8%80%e5%88%87%ef%bc%9a20%e5%a4%9a%e4%b8%aa%e5%b8%b8%e8%a7%81bug%e5%8f%8a%e5%85%b6%e4%bf%ae%e6%ad%a3%e6%96%b9%e6%b3%95/" title="用CSS修正一切：20多个常见Bug及其修正方法">用CSS修正一切：20多个常见Bug及其修正方法</a></li><li><a href="http://slj.me/2009/10/css-differences-in-internet-explorer-6-7-and-8/" title="CSS在Internet Explorer 6, 7 和8中的差别">CSS在Internet Explorer 6, 7 和8中的差别</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://slj.me/2010/03/php%e6%a0%bc%e5%bc%8f%e5%8c%96%e6%95%b0%e5%ad%97%ef%bc%9a%e4%bd%8d%e6%95%b0%e4%b8%8d%e8%b6%b3%e5%89%8d%e9%9d%a2%e5%8a%a00%e8%a1%a5%e8%b6%b3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[原创]多选/全选checkbox，AJAX提交。另附IE的onchange BUG</title>
		<link>http://slj.me/2010/03/multiple-selectable-checkbox-ajax-submit/</link>
		<comments>http://slj.me/2010/03/multiple-selectable-checkbox-ajax-submit/#comments</comments>
		<pubDate>Sat, 06 Mar 2010 06:50:17 +0000</pubDate>
		<dc:creator>SLJ</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[HTML/CSS]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[checkbox]]></category>
		<category><![CDATA[MeePlace]]></category>
		<category><![CDATA[onchange]]></category>

		<guid isPermaLink="false">http://slj.me/?p=1501</guid>
		<description><![CDATA[最近在为MeePlace 2.7的后台编写多选功能。在一个接一个的版本中，MeePlace的后台是越来越强大了（不够谦虚，hoho），后台采用纯ajax异步（有的时候觉得编程会有点麻烦，但是从1.0开始就是这样的后台，现在要改的话也麻烦，况且AJAX能给用户带来更好的体验，就继续开发吧：D） 这次后台增加的功能中，有一个是能够多选/全选项目，这个已经是历史遗留问题了，在我所有开发的项目中都是用这套自己开发的后台系统，改一改就成。这次布莱恩吧multi-selectable列在了Milestone里，所以就写了。以前有做过多选，不过由于是原始form的post，所以比较简单。这次用AJAX的后台多选操作，我还是想了一下才开始动手的。 我的想法是，通过遍历checkbox，来得到有被选定了的checkbox的value，然后再传给后端进行多选处理。 下面公开MeePlace的这部分代码。 全选按钮。用户点击全选的那个checkbox后，checkbox的onclick=&#8221;select_item_all(this,&#8221;allitem&#8221;,&#8221;childitem&#8221;)&#8221; 其中&#8221;allitem&#8221;是全选的checkbox的classname，因为也许这个全选会出现两个，或者更多，比如表头和表尾各一。 &#8220;childitem&#8221;是所有的条目前的checkbox的classname。 JS代码： //全选按钮 function select_item_all(whochecked,allitem,childitem) { if(whochecked==true) { $('.'+allitem).attr('checked',true); $('.'+childitem).attr('checked',true); $('.itemtr').addClass('trselected'); } else { $('.'+allitem).attr('checked',false); $('.'+childitem).attr('checked',false); $('.itemtr').removeClass('trselected'); } } 这样通过判断提交全选的checkbox是否被勾选，来达到全选目的。 下面的代码是点击&#8221;Delete selected&#8221;（“删除所选”）之后，扫描所选中的checkbox的value以及发出警告和异步提交的代码 JS代码： function delselected(sheet,where,childitem) { //通过扫描制定childitem（项目前的checkbox的classname），来获取选中了的项目IDs var selected_ids=''; var obj=$("input:checked[class='"+childitem+"']"); $.each(obj, function(i,item){ selected_ids+= $(item).val() +','; }); if(selected_ids) { var a=confirm("CAUTION! You are going to delete a quantity [...]]]></description>
			<content:encoded><![CDATA[<p>    最近在为MeePlace 2.7的后台编写多选功能。在一个接一个的版本中，MeePlace的后台是越来越强大了（不够谦虚，hoho），后台采用纯ajax异步（有的时候觉得编程会有点麻烦，但是从1.0开始就是这样的后台，现在要改的话也麻烦，况且AJAX能给用户带来更好的体验，就继续开发吧：D）</p>
<p>这次后台增加的功能中，有一个是能够多选/全选项目，这个已经是历史遗留问题了，在我所有开发的项目中都是用这套自己开发的后台系统，改一改就成。这次布莱恩吧multi-selectable列在了Milestone里，所以就写了。以前有做过多选，不过由于是原始form的post，所以比较简单。这次用AJAX的后台多选操作，我还是想了一下才开始动手的。</p>
<p>我的想法是，通过遍历checkbox，来得到有被选定了的checkbox的value，然后再传给后端进行多选处理。</p>
<p>下面公开MeePlace的这部分代码。</p>
<p><img src="http://slj.me/wp-content/uploads/2010/03/meeplace-multi-check.png" alt="" title="meeplace-multi-check" width="430" height="270" class="alignnone size-full wp-image-1503" /></p>
<p>全选按钮。用户点击全选的那个checkbox后，checkbox的onclick=&#8221;select_item_all(this,&#8221;allitem&#8221;,&#8221;childitem&#8221;)&#8221;<br />
其中&#8221;allitem&#8221;是全选的checkbox的classname，因为也许这个全选会出现两个，或者更多，比如表头和表尾各一。<br />
&#8220;childitem&#8221;是所有的条目前的checkbox的classname。<br />
JS代码：<br />
<span id="more-1501"></span></p>
<pre name="code" class="js">
//全选按钮
function select_item_all(whochecked,allitem,childitem)
{
 if(whochecked==true)
 {
  $('.'+allitem).attr('checked',true);
  $('.'+childitem).attr('checked',true);
  $('.itemtr').addClass('trselected');
 }
 else
 {
  $('.'+allitem).attr('checked',false);
  $('.'+childitem).attr('checked',false);
  $('.itemtr').removeClass('trselected');
 }
}
</pre>
<p>这样通过判断提交全选的checkbox是否被勾选，来达到全选目的。</p>
<p>下面的代码是点击&#8221;Delete selected&#8221;（“删除所选”）之后，扫描所选中的checkbox的value以及发出警告和异步提交的代码<br />
JS代码：</p>
<pre name="code" class="js">
function delselected(sheet,where,childitem)
{
//通过扫描制定childitem（项目前的checkbox的classname），来获取选中了的项目IDs
   var selected_ids='';
   var obj=$("input:checked[class='"+childitem+"']");
    $.each(obj, function(i,item){
       selected_ids+= $(item).val() +',';
     });  

if(selected_ids)
{
 var a=confirm("CAUTION! You are going to delete a quantity of items.\n\rThese items will never be restored after deleted.\n\rSure to delete these items?");
if(a==0) return ;
}
else   //没有发现选中的checkbox
{
 alert('You have not selected any item.');
 return;
}

 //通过jQuery的$.post来异步提交数据
$.post("/mgt/func/delete.php?"+Math.random(), {
sheet:sheet,
where:where,
equal:selected_ids
},function(data){tips('Items deleted.');nav();});

}
</pre>
<p>对应 delete.php的代码，虽然代码不安全，能够直接注入的样子，直接操作数据库。但是出于是后台的代码，而且MeePlace对SESSION的检验非常严格，所以就这么用了，我想没有一个Admin想用自己的Admin权限黑自己的网站的。LOL<br />
PHP代码：</p>
<blockquote><p>//检查_SESSION</p>
<p>//自己的数据库连接，或者是框架的数据库接口</p>
<p>///传递过来的值，equals是所选ID经过explode()函数之后得出的数组<br />
$sheet=$_REQUEST[sheet]; //<br />
 $where=$_REQUEST[where]; //<br />
 $equal=$_REQUEST[equal]; // </p>
<p> $equals = explode(&#8220;,&#8221;, $equal);<br />
/// 循环删除数据库中的制定条目<br />
$i=0;<br />
while($i<count ($equals)) {<br />
	if($equals[$i]){<br />
		$query="delete from `$sheet` where `$where`= '$equals[$i]'  limit 1";<br />
		$rc=mysql_query("$query") or die("ERROR: $query");<br />
		$output.=$query."\n\r";<br />
	}<br />
	 $i++;<br />
}</p></blockquote>
<h3 style="color:red">另外如果你想通过checkbox的onchange来调用全选函数的话，结果是：IE不支持！最后只好使用onclick来实现了。这个也是历史遗留问题。算是IE的一个不愿解决的BUG</h3>
<p></count></p></blockquote>
<h2  class="related_post_title">Related Posts / 相关文章</h2><ul class="related_post"><li><a href="http://slj.me/2010/05/whats-new-for-meeplace-2-8/" title="What&#8217;s new for Meeplace 2.8">What&#8217;s new for Meeplace 2.8</a></li><li><a href="http://slj.me/2010/02/meeplace-2-6-release-feb-13-2010/" title="Meeplace 2.6 Release [Feb 13, 2010]">Meeplace 2.6 Release [Feb 13, 2010]</a></li><li><a href="http://slj.me/2010/01/%e4%bb%8a%e6%97%a5%e6%96%b0%e9%97%bb%ef%bc%9ameeplace-llc%e5%9c%a8%e5%8c%97%e7%be%8e%e6%b3%a8%e5%86%8c/" title="今日新闻：MeePlace LLC在北美注册">今日新闻：MeePlace LLC在北美注册</a></li><li><a href="http://slj.me/2010/01/%e5%85%b3%e4%ba%8emeeplace-2-4%e7%9a%84%e4%b8%ad%e6%96%87%e7%89%88%e8%af%b4%e6%98%8e/" title="我的近况与MeePlace 2.4说明">我的近况与MeePlace 2.4说明</a></li><li><a href="http://slj.me/2010/01/theme-upgrade-advice-for-meeplace-2-4/" title="Theme Upgrade Advice For MeePlace 2.4">Theme Upgrade Advice For MeePlace 2.4</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://slj.me/2010/03/multiple-selectable-checkbox-ajax-submit/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Godaddy上启用 Zend Optimizer</title>
		<link>http://slj.me/2010/03/godaddy%e4%b8%8a%e5%90%af%e7%94%a8-zend-optimizer/</link>
		<comments>http://slj.me/2010/03/godaddy%e4%b8%8a%e5%90%af%e7%94%a8-zend-optimizer/#comments</comments>
		<pubDate>Mon, 01 Mar 2010 14:36:55 +0000</pubDate>
		<dc:creator>SLJ</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[godaddy]]></category>
		<category><![CDATA[zend]]></category>

		<guid isPermaLink="false">http://slj.me/?p=1499</guid>
		<description><![CDATA[ Godaddy上启用 Zend Optimizer 的方法是： 在站点根目录中修改php5.ini，没有则建立，添加如下： [Zend] zend_optimizer.optimization_level=15 zend_extension_manager.optimizer=/usr/local/Zend/lib/Optimizer-3.3.3 zend_extension_manager.optimizer_ts=/usr/local/Zend/lib/Optimizer_TS-3.3.3 zend_extension=/usr/local/Zend/lib/Optimizer-3.3.3/ZendExtensionManager.so zend_extension_ts=/usr/local/Zend/lib/Optimizer_TS-3.3.3/ZendExtensionManager_TS.so Related Posts / 相关文章Godaddy的No input file specified错误（php+fastcgi）]]></description>
			<content:encoded><![CDATA[<p> Godaddy上启用 Zend Optimizer 的方法是：</p>
<p>在站点根目录中修改php5.ini，没有则建立，添加如下：</p>
<p>[Zend]<br />
zend_optimizer.optimization_level=15<br />
zend_extension_manager.optimizer=/usr/local/Zend/lib/Optimizer-3.3.3<br />
zend_extension_manager.optimizer_ts=/usr/local/Zend/lib/Optimizer_TS-3.3.3<br />
zend_extension=/usr/local/Zend/lib/Optimizer-3.3.3/ZendExtensionManager.so<br />
zend_extension_ts=/usr/local/Zend/lib/Optimizer_TS-3.3.3/ZendExtensionManager_TS.so</p>
<h2  class="related_post_title">Related Posts / 相关文章</h2><ul class="related_post"><li><a href="http://slj.me/2010/03/godaddy-no-input-file-specified-solution/" title="Godaddy的No input file specified错误（php+fastcgi）">Godaddy的No input file specified错误（php+fastcgi）</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://slj.me/2010/03/godaddy%e4%b8%8a%e5%90%af%e7%94%a8-zend-optimizer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>syntax error, unexpected T_CONCAT_EQUAL</title>
		<link>http://slj.me/2010/01/syntax-error-unexpected-t_concat_equal/</link>
		<comments>http://slj.me/2010/01/syntax-error-unexpected-t_concat_equal/#comments</comments>
		<pubDate>Sun, 24 Jan 2010 15:31:04 +0000</pubDate>
		<dc:creator>SLJ</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[error]]></category>

		<guid isPermaLink="false">http://slj.me/?p=1454</guid>
		<description><![CDATA[Parse error: syntax error, unexpected T_CONCAT_EQUAL,这个问题是我今天在写php程序时出现的一个简单的问题，其实这算不上什么问题， 下面我们来看看这段代码。 sql =&#8221;Select * from * where user_myid= &#8216;$uid&#8217; and user_type=0&#8243;;   $result = mysql_query( $sql ) ;   if( mysql_num_rows( $result ) )   {    while( $rs = mysql_fetch_array( $result ) )    {     temp.= &#8220;&#60;friend fid=&#8221;".$rs[0].&#8221;" fname=&#8221;".$rs[1].&#8221;" /&#62; n&#8221;;    }   } 哈哈，看到蓝色的temp栏目了没？ 是前面少了一个$号，是不是不算问题呢，但是如何不仔细的话就是大问题哦。 Related Posts / 相关文章疯狂的 Web 应用开源项目[转] 代替bash，书写 PHP [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Parse error</strong>: syntax error, unexpected T_CONCAT_EQUAL,这个问题是我今天在写php程序时出现的一个简单的问题，其实这算不上什么问题，</p>
<p>下面我们来看看这段代码。</p>
<p>sql =&#8221;Select * from * where user_myid= &#8216;$uid&#8217; and user_type=0&#8243;;<br />
  $result = mysql_query( $sql ) ;<br />
  if( mysql_num_rows( $result ) )<br />
  {<br />
   while( $rs = mysql_fetch_array( $result ) )<br />
   {<br />
    <span style="color: #0000ff;">temp</span>.= &#8220;&lt;friend fid=&#8221;".$rs[0].&#8221;" fname=&#8221;".$rs[1].&#8221;" /&gt; n&#8221;;<br />
   }<br />
  }</p>
<p>哈哈，看到蓝色的temp栏目了没？</p>
<p>是前面少了一个$号，是不是不算问题呢，但是如何不仔细的话就是大问题哦。</p>
<h2  class="related_post_title">Related Posts / 相关文章</h2><ul class="related_post"><li><a href="http://slj.me/2011/08/web-open-source-project/" title="疯狂的 Web 应用开源项目">疯狂的 Web 应用开源项目</a></li><li><a href="http://slj.me/2011/06/php-daemon-notice/" title="[转] 代替bash，书写 PHP daemon 后台程序">[转] 代替bash，书写 PHP daemon 后台程序</a></li><li><a href="http://slj.me/2011/04/xdebug-for-php/" title="Xdebug for php 一个实用的PHP调试扩展">Xdebug for php 一个实用的PHP调试扩展</a></li><li><a href="http://slj.me/2011/02/php-share-session-between-servers/" title="PHP 实现多服务器共享 SESSION 数据">PHP 实现多服务器共享 SESSION 数据</a></li><li><a href="http://slj.me/2010/12/php-ini_set-fail-reason/" title="PHP ini_set() 无效的原因">PHP ini_set() 无效的原因</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://slj.me/2010/01/syntax-error-unexpected-t_concat_equal/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP 变量的强制类型转换</title>
		<link>http://slj.me/2010/01/php-%e5%8f%98%e9%87%8f%e7%9a%84%e5%bc%ba%e5%88%b6%e7%b1%bb%e5%9e%8b%e8%bd%ac%e6%8d%a2/</link>
		<comments>http://slj.me/2010/01/php-%e5%8f%98%e9%87%8f%e7%9a%84%e5%bc%ba%e5%88%b6%e7%b1%bb%e5%9e%8b%e8%bd%ac%e6%8d%a2/#comments</comments>
		<pubDate>Sun, 24 Jan 2010 12:12:34 +0000</pubDate>
		<dc:creator>SLJ</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[变量]]></category>
		<category><![CDATA[强制]]></category>
		<category><![CDATA[类型转换]]></category>

		<guid isPermaLink="false">http://slj.me/?p=1452</guid>
		<description><![CDATA[PHP 在变量定义中不需要（或不支持）明示的类型定义；变量类型是根据使用该变量的上下文所决定的。 也就是说，如果把一个字符串值赋给变量 var，var 就成了一个字符串。如果又把一个整型值赋给 var，那它就成了一个整数。 PHP 中的类型强制转换和 C 中的非常像：在要转换的变量之前加上用括号括起来的目标类型。 复制代码 代码如下: &#60;?php $foo = 10; echo "转换前：\$foo=".$foo; //输出一个整数 echo "&#60;br/&#62;" //输出：$foo=10 echo "&#60;br/&#62;"; $foo = (boolean) $foo; //强制转换为布尔型 echo "转换后：\$foo=".$foo; //输出：$foo=1 ?&#62; 允许的强制转换有： (int)，(integer) &#8211; 转换成整型 (bool)，(boolean) &#8211; 转换成布尔型 (float)，(double)，(real) &#8211; 转换成浮点型 (string) &#8211; 转换成字符串 (array) &#8211; 转换成数组 (object) &#8211; 转换成对象 Related Posts / [...]]]></description>
			<content:encoded><![CDATA[<p>PHP 在变量定义中不需要（或不支持）明示的类型定义；变量类型是根据使用该变量的上下文所决定的。<br />
也就是说，如果把一个字符串值赋给变量 var，var 就成了一个字符串。如果又把一个整型值赋给 var，那它就成了一个整数。<br />
PHP 中的类型强制转换和 C 中的非常像：在要转换的变量之前加上用括号括起来的目标类型。<br />
复制代码 代码如下:</p>
<pre name="code" class="php">
&lt;?php
$foo = 10;
echo "转换前：\$foo=".$foo; //输出一个整数
echo "&lt;br/&gt;" //输出：$foo=10
echo "&lt;br/&gt;";
$foo = (boolean) $foo; //强制转换为布尔型
echo "转换后：\$foo=".$foo; //输出：$foo=1
?&gt;
</pre>
<p>允许的强制转换有：<br />
(int)，(integer) &#8211; 转换成整型<br />
(bool)，(boolean) &#8211; 转换成布尔型<br />
(float)，(double)，(real) &#8211; 转换成浮点型<br />
(string) &#8211; 转换成字符串<br />
(array) &#8211; 转换成数组<br />
(object) &#8211; 转换成对象</p>
<h2  class="related_post_title">Related Posts / 相关文章</h2><ul class="related_post"><li><a href="http://slj.me/2011/08/web-open-source-project/" title="疯狂的 Web 应用开源项目">疯狂的 Web 应用开源项目</a></li><li><a href="http://slj.me/2011/06/php-daemon-notice/" title="[转] 代替bash，书写 PHP daemon 后台程序">[转] 代替bash，书写 PHP daemon 后台程序</a></li><li><a href="http://slj.me/2011/04/xdebug-for-php/" title="Xdebug for php 一个实用的PHP调试扩展">Xdebug for php 一个实用的PHP调试扩展</a></li><li><a href="http://slj.me/2011/02/php-share-session-between-servers/" title="PHP 实现多服务器共享 SESSION 数据">PHP 实现多服务器共享 SESSION 数据</a></li><li><a href="http://slj.me/2010/12/php-ini_set-fail-reason/" title="PHP ini_set() 无效的原因">PHP ini_set() 无效的原因</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://slj.me/2010/01/php-%e5%8f%98%e9%87%8f%e7%9a%84%e5%bc%ba%e5%88%b6%e7%b1%bb%e5%9e%8b%e8%bd%ac%e6%8d%a2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP 中 magic_quotes_gpc 和 magic_quotes_runtime 的区别，作用和用法</title>
		<link>http://slj.me/2010/01/php-magic_quotes_gpc-magic_quotes_runtime/</link>
		<comments>http://slj.me/2010/01/php-magic_quotes_gpc-magic_quotes_runtime/#comments</comments>
		<pubDate>Sat, 23 Jan 2010 06:43:58 +0000</pubDate>
		<dc:creator>SLJ</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[magic_quotes_gpc]]></category>
		<category><![CDATA[magic_quotes_runtime]]></category>

		<guid isPermaLink="false">http://slj.me/?p=1445</guid>
		<description><![CDATA[魔术引用发生作用是在传递$_GET,$_POST,$_COOKIE时 1. 条件： magic_quotes_gpc=off 写入数据库的字符串未经过任何过滤处理。从数据库读出的字符串也未作任何处理。 数据：  $data=”snow”’’sun” ; (snow和sun之间是四个连续的单引号). 操作： 将字符串:”snow”’’sun” 写入数据库， 结果： 出现sql语句错误，mysql不能顺利完成sql语句，写入数据库失败。 数据库保存格式：无数据。 输出数据格式：无数据。 说明： 对于未经处理的单引号在写入数据库时会使sql语句发生错误。 2. 条件： magic_quotes_gpc=off 写入数据库的字符串经过函数addlashes()处理。从数据库读出的字符串未作任何处理。 数据：  $data=”snow”’’sun” ; (snow和sun之间是四个连续的单引号). 操作： 将字符串:”snow”’’sun” 写入数据库， 结果： sql语句顺利执行，数据成功写入数据库 数据库保存格式：snow”’’sun (和输入一样) 输出数据格式：snow”’’sun (和输入一样) 说明： addslashes()函数将单引号转换为\’的转义字符使sql语句成功执行， 但\’并未作为数据存入数据库，数据库保存的是snow”’’sun 而并不是我们想象的snow\’\’\’\’sun 3. 条件： magic_quotes_gpc=on 写入数据库的字符串未经过任何处理。从数据库读出的字符串未作任何处理。 数据：  $data=”snow”’’sun” ; (snow和sun之间是四个连续的单引号). 操作： 将字符串:”snow”’’sun” 写入数据库， 结果： sql语句顺利执行，数据成功写入数据库 数据库保存格式：snow”’’sun (和输入一样) 输出数据格式：snow”’’sun [...]]]></description>
			<content:encoded><![CDATA[<p>魔术引用发生作用是在传递$_GET,$_POST,$_COOKIE时</p>
<p>1.<br />
条件： magic_quotes_gpc=off<br />
写入数据库的字符串未经过任何过滤处理。从数据库读出的字符串也未作任何处理。</p>
<p>数据：  $data=”snow”’’sun” ; (snow和sun之间是四个连续的单引号).</p>
<p>操作： 将字符串:”snow”’’sun” 写入数据库，</p>
<p>结果： 出现sql语句错误，mysql不能顺利完成sql语句，写入数据库失败。</p>
<p>数据库保存格式：无数据。</p>
<p>输出数据格式：无数据。</p>
<p>说明： 对于未经处理的单引号在写入数据库时会使sql语句发生错误。</p>
<p>2.<br />
条件： magic_quotes_gpc=off<br />
写入数据库的字符串经过函数addlashes()处理。从数据库读出的字符串未作任何处理。</p>
<p>数据：  $data=”snow”’’sun” ; (snow和sun之间是四个连续的单引号).</p>
<p>操作： 将字符串:”snow”’’sun” 写入数据库，</p>
<p>结果： sql语句顺利执行，数据成功写入数据库</p>
<p>数据库保存格式：snow”’’sun (和输入一样)</p>
<p>输出数据格式：snow”’’sun (和输入一样)</p>
<p>说明： addslashes()函数将单引号转换为\’的转义字符使sql语句成功执行，<br />
但\’并未作为数据存入数据库，数据库保存的是snow”’’sun 而并不是我们想象的snow\’\’\’\’sun</p>
<p><span id="more-1445"></span>3.<br />
条件： magic_quotes_gpc=on<br />
写入数据库的字符串未经过任何处理。从数据库读出的字符串未作任何处理。</p>
<p>数据：  $data=”snow”’’sun” ; (snow和sun之间是四个连续的单引号).</p>
<p>操作： 将字符串:”snow”’’sun” 写入数据库，</p>
<p>结果： sql语句顺利执行，数据成功写入数据库</p>
<p>数据库保存格式：snow”’’sun (和输入一样)</p>
<p>输出数据格式：snow”’’sun (和输入一样)</p>
<p>说明： magic_quotes_gpc=on 将单引号转换为\’的转义字符使sql语句成功执行，<br />
但\’并未作为数据入数据库，数据库保存的是snow”’’sun而并不是我们想象的snow\’\’\’\’sun。</p>
<p>4.<br />
条件： magic_quotes_gpc=on<br />
写入数据库的字符串经过函数addlashes()处理。从数据库读出的字符串未作任何处理。</p>
<p>数据：  $data=”snow”’’sun” ; (snow和sun之间是四个连续的单引号).</p>
<p>操作： 将字符串:”snow”’’sun” 写入数据库，</p>
<p>结果： sql语句顺利执行，数据成功写入数据库</p>
<p>数据库保存格式：snow\’\’\’\’sun (添加了转义字符)</p>
<p>输出数据格式：snow\’\’\’\’sun (添加了转义字符)</p>
<p>说明： magic_quotes_gpc=on 将单引号转换为\’的转义字符使sql语句成功执行，<br />
addslashes又将即将写入数据库的单引号转换为\’,后者的转换被作为数据写入<br />
数据库，数据库保存的是snow\’\’\’\’sun</p>
<p>总结如下：<br />
1. 对于magic_quotes_gpc=on的情况，</p>
<p>我们可以不对输入和输出数据库的字符串数据作<br />
addslashes()和stripslashes()的操作,数据也会正常显示。</p>
<p>如果此时你对输入的数据作了addslashes()处理，<br />
那么在输出的时候就必须使用stripslashes()去掉多余的反斜杠。</p>
<p>2. 对于magic_quotes_gpc=off 的情况</p>
<p>必须使用addslashes()对输入数据进行处理，但并不需要使用stripslashes()格式化输出<br />
因为addslashes()并未将反斜杠一起写入数据库，只是帮助mysql完成了sql语句的执行。</p>
<p>补充：</p>
<p>magic_quotes_gpc 作用范围是：ＷＥＢ客户服务端；作用时间：请求开始时，例如当脚本运行时．<br />
magic_quotes_runtime 作用范围：从文件中读取的数据或执行exec()的结果或是从ＳＱＬ查询中得到的；作用时间：每次当脚本访问运行状态中产生的数据</p>
<p>============ magic_quotes_gpc和magic_quotes_runtime的区别和用法 =============</p>
<p>PHP提供两个方便我们引用数据的魔法引用函数magic_quotes_gpc和magic_quotes_runtime，这两个函数如果在php.ini设置为ON的时候，就会为我们引用的数据碰到单引号&#8217;和双引号&#8221;以及反斜线 \ 是自动加上反斜线，帮我们自动转译符号，确保数据操作的正确运行，可是我们在php不同的版本或者不同的服务器配置下，有的magic_quotes_gpc和magic_quotes_runtime设置为on，有的又是off，所以我们写的程序必须符合on和off两种情况。那么magic_quotes_gpc和magic_quotes_runtime两个函数有什么区别呢？看下面的说明：</p>
<p><strong>magic_quotes_gpc</strong> <br />
作用范围是：ＷＥＢ客户服务端；<br />
作用时间：请求开始是，例如当脚本运行时．</p>
<p><strong>magic_quotes_runtime</strong><br />
作用范围：从文件中读取的数据或执行exec()的结果或是从ＳＱＬ查询中得到的；<br />
作用时间：每次当脚本访问运行状态中产生的数据．</p>
<p>所以</p>
<p>magic_quotes_gpc的设定值将会影响通过Get/Post/Cookies获得的数据<br />
magic_quotes_runtime的设定值将会影响从文件中读取的数据或从数据库查询得到的数据</p>
<p>例子说明：<br />
复制内容到剪贴板<br />
代码:</p>
<pre name="code" class="html">
&lt;form action="" method="post" &gt;
STR:&lt;input type="text" name="str"&gt;
&lt;input type="submit"&gt;
&lt;/form&gt;
</pre>
<pre name="code" class="php">
&lt;?php
/* 我们在表单里填写:    '"\    这些符号,如果magic_quotes_gpc没有开启，那么他们不会被反斜杠转义 */
echo '现在通过POST传递过来的值是：' ,$_POST['str'], '&lt;br /&gt;';

if (get_magic_quotes_gpc()) {      // 检查magic_quotes_gpc是否打开,如果没有打开，用addslashes进行转义
      $str = $_POST['str'];
} else {
      $str = addslashes($_POST['str']);
}

echo '这里是转义过后的:' ,$str, '&lt;hr /&gt;';
$sql = "INSERT INTO lastnames (lastname) VALUES ('$str')";

//=====================================================================================
//-----magic_quotes_gpc只会转义：     通过Get/Post/Cookies获得的数据
//-----magic_quotes_runtime会转义：从文件中读取的数据或执行exec()的结果或是从ＳＱＬ查询中得到的
//=====================================================================================
$data = implode(file('try.php'));      // 我们在里面依然写'"\这几个字符，用来测试
echo '这里是try.php的数据,';
if (get_magic_quotes_runtime()) {
      $data = $data;
      echo '被系统自带转义的' .$data;
} else {
      echo '被addslashes转义了的' .$data = addslashes($data);
}

$sql = "INSERT INTO lastnames (lastname) VALUES ('$data')";
echo '&lt;br /&gt;SQL语句为：&lt;br /&gt;' ,$sql;
//---入库都转义了，但是多余了反斜杠，我们要读出来是原来的数据时候使用stripslashes()去掉反斜杠
//---stripslashes()和addslashes()作用相反
?&gt;
</pre>
<p>最关键的区别是就是上面提到的2点:他们针对的处理对象不同<br />
magic_quotes_gpc的设定值将会影响通过Get/Post/Cookies获得的数据<br />
magic_quotes_runtime的设定值将会影响从文件中读取的数据或从数据库查询得到的数据</p>
<p>在这里顺便在提几个想关联的函数：</p>
<p><strong>set_magic_quotes_runtime():</strong><br />
设置magic_quotes_runtime值. 0=关闭.1=打开.默认状态是关闭的.可以通过 echo phpinfo(); 查看magic_quotes_runtime</p>
<p><strong>get_magic_quotes_gpc():</strong><br />
查看magic_quotes_gpc值.0=关闭.1=打开.</p>
<p><strong>get_magic_quotes_runtime():</strong><br />
查看magic_quotes_runtime值。0=关闭.1=打开.</p>
<p>注意的是没有 set_magic_quotes_gpc()这个函数,就是不能在程序里面设置magic_quotes_gpc的值。</p>
<h2  class="related_post_title">Related Posts / 相关文章</h2><ul class="related_post"><li><a href="http://slj.me/2011/08/web-open-source-project/" title="疯狂的 Web 应用开源项目">疯狂的 Web 应用开源项目</a></li><li><a href="http://slj.me/2011/06/php-daemon-notice/" title="[转] 代替bash，书写 PHP daemon 后台程序">[转] 代替bash，书写 PHP daemon 后台程序</a></li><li><a href="http://slj.me/2011/04/xdebug-for-php/" title="Xdebug for php 一个实用的PHP调试扩展">Xdebug for php 一个实用的PHP调试扩展</a></li><li><a href="http://slj.me/2011/02/php-share-session-between-servers/" title="PHP 实现多服务器共享 SESSION 数据">PHP 实现多服务器共享 SESSION 数据</a></li><li><a href="http://slj.me/2010/12/php-ini_set-fail-reason/" title="PHP ini_set() 无效的原因">PHP ini_set() 无效的原因</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://slj.me/2010/01/php-magic_quotes_gpc-magic_quotes_runtime/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>PHP列出目录树</title>
		<link>http://slj.me/2010/01/php%e5%88%97%e5%87%ba%e7%9b%ae%e5%bd%95%e6%a0%91/</link>
		<comments>http://slj.me/2010/01/php%e5%88%97%e5%87%ba%e7%9b%ae%e5%bd%95%e6%a0%91/#comments</comments>
		<pubDate>Wed, 13 Jan 2010 04:56:17 +0000</pubDate>
		<dc:creator>SLJ</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[PHP列出目录树]]></category>

		<guid isPermaLink="false">http://slj.me/?p=1425</guid>
		<description><![CDATA[最近要发展module，需要让程序扫描module文件夹并自动引入插件，就像WP那样。收集一些方法。下面是：PHP列出目录树  &#60;?php /*一个简单的目录递归函数*/ function tree($directory) { $mydir=dir($directory); echo "&#60;ul&#62;"; while($file=$mydir-&#62;read()){ if((is_dir("$directory/$file")) AND ($file!=".") AND ($file!="..")){ echo "&#60;li&#62;&#60;font color='#ff00cc'&#62;&#60;b&#62;$file&#60;/b&#62;&#60;/font&#62;&#60;/li&#62;"; tree("$directory/$file"); }else{ echo "&#60;li&#62;$file&#60;/li&#62;"; } } echo "&#60;/ul&#62;"; $mydir-&#62;close(); } //start the program echo "&#60;h2&#62;目录为粉红色&#60;/h2&#62;"; tree("."); ?&#62; Other Posts / 其他文章关于CVS和SVN使用回车键提交网页表单的条件PHP 5.2 之前的版本中使用 JSONZend Framework 入门4月编程语言排行榜：脚本语言占据半壁江山]]></description>
			<content:encoded><![CDATA[<p>最近要发展module，需要让程序扫描module文件夹并自动引入插件，就像WP那样。收集一些方法。下面是：PHP列出目录树 </p>
<pre name="code" class="php">
&lt;?php
/*一个简单的目录递归函数*/
function tree($directory)
{
$mydir=dir($directory);
echo "&lt;ul&gt;";
while($file=$mydir-&gt;read()){
if((is_dir("$directory/$file")) AND ($file!=".") AND ($file!="..")){
echo "&lt;li&gt;&lt;font color='#ff00cc'&gt;&lt;b&gt;$file&lt;/b&gt;&lt;/font&gt;&lt;/li&gt;";
tree("$directory/$file");
}else{
echo "&lt;li&gt;$file&lt;/li&gt;";
}
}
echo "&lt;/ul&gt;";
$mydir-&gt;close();
}
//start the program
echo "&lt;h2&gt;目录为粉红色&lt;/h2&gt;";
tree(".");
?&gt;
</pre>
<h2  class="related_post_title">Other Posts / 其他文章</h2><ul class="related_post"><li><a href="http://slj.me/2010/01/theme-upgrade-advice-for-meeplace-2-4/" title="Theme Upgrade Advice For MeePlace 2.4">Theme Upgrade Advice For MeePlace 2.4</a></li><li><a href="http://slj.me/2009/12/d2forum/" title="第4届D2前端技术论坛开始报名">第4届D2前端技术论坛开始报名</a></li><li><a href="http://slj.me/2009/12/pushing-your-buttons-with-practical-css3/" title="来用实用的CSS3来制作你的酷炫按钮吧">来用实用的CSS3来制作你的酷炫按钮吧</a></li><li><a href="http://slj.me/2010/07/deprecated-features-for-php5-3/" title="PHP 5.3 后被禁止使用的函数">PHP 5.3 后被禁止使用的函数</a></li><li><a href="http://slj.me/2009/03/php5-__autoload/" title="PHP5: __autoload 自动加载对象">PHP5: __autoload 自动加载对象</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://slj.me/2010/01/php%e5%88%97%e5%87%ba%e7%9b%ae%e5%bd%95%e6%a0%91/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP 5.2 之前的版本中使用 JSON</title>
		<link>http://slj.me/2009/12/json-on-php-5-2/</link>
		<comments>http://slj.me/2009/12/json-on-php-5-2/#comments</comments>
		<pubDate>Mon, 28 Dec 2009 02:17:52 +0000</pubDate>
		<dc:creator>SLJ</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[json]]></category>

		<guid isPermaLink="false">http://kiya.cn/?p=1409</guid>
		<description><![CDATA[PHP 从 5.2 开始才内置了 JSON 的支持，很多人都是通过在服务器上安装 JSON 扩展来解决低版本PHP的JSON问题。 但如果只有服务器的FTP权限，可以尝试这个独立的PHP类：Services_JSON （通过PHP手册找到）。 下面介绍一下使用方法： 1. 首先，下载 Services_JSON 包。点击下载 2. 解压缩。这个包里面包括了一个 JSON.php 、一些说明文件以及文档，我们只需要用到 JSON.php ，下面是一个简单用法： 1 2 3 4 5 6 require('JSON.php');   ......   $json = new Services_JSON(); echo $json-&#62;encode(array('status'=&#62;0, 'data'=&#62;'test data')); 上面的代码就相当于在 PHP v5.2 以上版本中直接这样写： 1 json_encode(array('status'=&#62;0, 'data'=&#62;'test data')); 更多关于 Services_JSON 的用法请参考 官方文档 Related Posts / 相关文章疯狂的 [...]]]></description>
			<content:encoded><![CDATA[<p>PHP 从 5.2 开始才内置了 JSON 的支持，很多人都是通过在服务器上安装 JSON 扩展来解决低版本PHP的JSON问题。</p>
<p>但如果只有服务器的FTP权限，可以尝试这个独立的PHP类：<a href="http://pear.php.net/pepr/pepr-proposal-show.php?id=198" target="_blank">Services_JSON</a> （<a href="http://my.php.net/manual/en/function.json-decode.php#80606" target="_blank">通过PHP手册找到</a>）。</p>
<p>下面介绍一下使用方法：</p>
<p>1. 首先，下载 Services_JSON 包。<a href="http://mike.teczno.com/JSON.tar.gz" target="_blank">点击下载</a></p>
<p>2. 解压缩。这个包里面包括了一个 JSON.php 、一些说明文件以及文档，我们只需要用到 JSON.php ，下面是一个简单用法：</p>
<div>
<table border="0">
<tbody>
<tr>
<td>
<pre>1
2
3
4
5
6</pre>
</td>
<td>
<pre style="FONT-FAMILY: monospace"><span style="COLOR: #b1b100">require</span><span style="COLOR: #009900">(</span><span>'JSON.php'</span><span style="COLOR: #009900">)</span>;
 
<span style="COLOR: #339933">......</span>
 
<span style="COLOR: #000088">$json</span> <span style="COLOR: #339933">=</span> <span style="COLOR: #000000; FONT-WEIGHT: bold">new</span> Services_JSON<span style="COLOR: #009900">(</span><span style="COLOR: #009900">)</span>;
<span style="COLOR: #990000">echo</span> <span style="COLOR: #000088">$json</span><span style="COLOR: #339933">-&gt;</span><span style="COLOR: #004000">encode</span><span style="COLOR: #009900">(</span><span style="COLOR: #990000">array</span><span style="COLOR: #009900">(</span><span>'status'</span><span style="COLOR: #339933">=&gt;</span><span style="COLOR: #800080">0</span><span style="COLOR: #339933">,</span> <span>'data'</span><span style="COLOR: #339933">=&gt;</span><span>'test data'</span><span style="COLOR: #009900">)</span><span style="COLOR: #009900">)</span>;</pre>
</td>
</tr>
</tbody>
</table>
</div>
<p>上面的代码就相当于在 PHP v5.2 以上版本中直接这样写：</p>
<div>
<table border="0">
<tbody>
<tr>
<td>
<pre>1</pre>
</td>
<td>
<pre style="FONT-FAMILY: monospace">json_encode<span style="COLOR: #009900">(</span><span style="COLOR: #990000">array</span><span style="COLOR: #009900">(</span><span>'status'</span><span style="COLOR: #339933">=&gt;</span><span style="COLOR: #800080">0</span><span style="COLOR: #339933">,</span> <span>'data'</span><span style="COLOR: #339933">=&gt;</span><span>'test data'</span><span style="COLOR: #009900">)</span><span style="COLOR: #009900">)</span>;</pre>
</td>
</tr>
</tbody>
</table>
</div>
<p>更多关于 Services_JSON 的用法请参考 <a href="http://mike.teczno.com/JSON/doc/" target="_blank">官方文档</a></p>
<h2  class="related_post_title">Related Posts / 相关文章</h2><ul class="related_post"><li><a href="http://slj.me/2011/08/web-open-source-project/" title="疯狂的 Web 应用开源项目">疯狂的 Web 应用开源项目</a></li><li><a href="http://slj.me/2011/06/php-daemon-notice/" title="[转] 代替bash，书写 PHP daemon 后台程序">[转] 代替bash，书写 PHP daemon 后台程序</a></li><li><a href="http://slj.me/2011/04/xdebug-for-php/" title="Xdebug for php 一个实用的PHP调试扩展">Xdebug for php 一个实用的PHP调试扩展</a></li><li><a href="http://slj.me/2011/02/php-share-session-between-servers/" title="PHP 实现多服务器共享 SESSION 数据">PHP 实现多服务器共享 SESSION 数据</a></li><li><a href="http://slj.me/2010/12/php-ini_set-fail-reason/" title="PHP ini_set() 无效的原因">PHP ini_set() 无效的原因</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://slj.me/2009/12/json-on-php-5-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>从安装GEV.com中学到的</title>
		<link>http://slj.me/2009/12/%e4%bb%8e%e5%ae%89%e8%a3%85gev-com%e4%b8%ad%e5%ad%a6%e5%88%b0%e7%9a%84/</link>
		<comments>http://slj.me/2009/12/%e4%bb%8e%e5%ae%89%e8%a3%85gev-com%e4%b8%ad%e5%ad%a6%e5%88%b0%e7%9a%84/#comments</comments>
		<pubDate>Mon, 21 Dec 2009 15:26:02 +0000</pubDate>
		<dc:creator>SLJ</dc:creator>
				<category><![CDATA[Apache/Nginx]]></category>
		<category><![CDATA[Life]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://kiya.cn/?p=1361</guid>
		<description><![CDATA[忙了好几天，终于是吧Gev.com装上了我们的YelpClone. 可谓是波折。 //故事如下。。。 一个全新安装的CentOS，一个裸Apache。 当我把全站程序传上去的时候，页面返回空白，开始以为是Zend Optimizer的问题，就反馈，无果，自己上传，链接module，依然还是空白。 索性做了一个phpinfo()页面，经过Zend Guard加密后上传，可以正常显示，于是确定不是Zend Optimizer的问题。 一个很重要的转折点，我看了 Apache 的  error_log，发现Fatal Error,是mysql_connect为未知函数。查看了 phpinfo() 没有发现mysql的信息，发ticket让他们装了mysql。终于我的安装程序出的来了。 安装出错，无法读写config。震惊，因为从未遇到，于是想起linux的权限，所以去FTP查看那个文件的属性，果然是只读，就改成775. 恢复正常。 安装成功，但是首页还是空白，继续查看 error_log，无法写Smarty compile directory。哎，看来还是权限的问题，Smarty的编译目录没有开放写权限，于是又把compile目录改成775，依然出错，愤怒之下直接改成了777！ 可以了。。汗！ 但是最后rewrite功能失效，返回404，应该不是.htaccess的问题了，于是想起了httpd.conf中的设置问题，查看mod_rewrite.so，已经是启用的，又想起对目录Overwrite的设置，果然，从 none 改成 All 重启 httpd 一切正常。大功告成 //故事结束 从这几天的工作中学到的东西还是挺多的。 对Linux系统下的Web服务有了更深入的理解，命令又更加熟练了一些。 学到了解决方法的方法：error_log。 强调了模板编译目录的读写权限。 解决问题的逻辑更清晰了。 重温了httpd.conf的设置。 这个项目还在继续呢，我们要开发更多的模块和主题，因为他要开 Module Shop 和 Theme Shop。 Other Posts / 其他文章2010中国首届微博开发者大会演讲稿PPT极简主义网站设计:寓丰富于简单GOOGLE PR更新了转：使用 Dojo 开发离线应用MeeClones is now MeePlace]]></description>
			<content:encoded><![CDATA[<p>忙了好几天，终于是吧<a href="http://gev.com" target="_blank">Gev.com</a>装上了我们的<a href="http://www.yelpclone.com" target="_blank">YelpClone</a>. 可谓是波折。</p>
<p><span style="color: #333399;">//故事如下。。。</span></p>
<p>一个全新安装的CentOS，一个裸Apache。</p>
<p>当我把全站程序传上去的时候，页面返回空白，开始以为是Zend Optimizer的问题，就反馈，无果，自己上传，链接module，依然还是空白。</p>
<p>索性做了一个phpinfo()页面，经过Zend Guard加密后上传，可以正常显示，于是确定不是Zend Optimizer的问题。</p>
<p>一个很重要的转折点，我看了 Apache 的  error_log，发现Fatal Error,是mysql_connect为未知函数。查看了 phpinfo() 没有发现mysql的信息，发ticket让他们装了mysql。终于我的安装程序出的来了。</p>
<p><span id="more-1361"></span>安装出错，无法读写config。震惊，因为从未遇到，于是想起linux的权限，所以去FTP查看那个文件的属性，果然是只读，就改成775. 恢复正常。</p>
<p>安装成功，但是首页还是空白，继续查看 error_log，无法写Smarty compile directory。哎，看来还是权限的问题，Smarty的编译目录没有开放写权限，于是又把compile目录改成775，依然出错，愤怒之下直接改成了777！ 可以了。。汗！</p>
<p>但是最后rewrite功能失效，返回404，应该不是.htaccess的问题了，于是想起了httpd.conf中的设置问题，查看mod_rewrite.so，已经是启用的，又想起对目录Overwrite的设置，果然，从 none 改成 All 重启 httpd 一切正常。大功告成</p>
<p><span style="color: #333399;">//故事结束</span></p>
<p><span style="color: #000000;">从这几天的工作中学到的东西还是挺多的。</span></p>
<ol>
<li><span style="color: #000000;">对Linux系统下的Web服务有了更深入的理解，命令又更加熟练了一些。</span></li>
<li><span style="color: #000000;">学到了解决方法的方法：error_log。</span></li>
<li><span style="color: #000000;">强调了模板编译目录的读写权限。</span></li>
<li><span style="color: #000000;">解决问题的逻辑更清晰了。</span></li>
<li><span style="color: #000000;">重温了httpd.conf的设置。</span></li>
</ol>
<p><span style="color: #000000;">这个项目还在继续呢，我们要开发更多的模块和主题，因为他要开 Module Shop 和 Theme Shop。</span></p>
<h2  class="related_post_title">Other Posts / 其他文章</h2><ul class="related_post"><li><a href="http://slj.me/2009/06/louzui/" title="注册漏嘴网">注册漏嘴网</a></li><li><a href="http://slj.me/2010/05/my-footprint/" title="我的电脑情缘（流水帐）">我的电脑情缘（流水帐）</a></li><li><a href="http://slj.me/2009/07/semantic-html/" title="语义化的HTML结构到底有何好处? ">语义化的HTML结构到底有何好处? </a></li><li><a href="http://slj.me/2009/11/top-20-essential-firefox-add-ons-for-web-designers/" title="20个Web设计师必要的Firefox插件">20个Web设计师必要的Firefox插件</a></li><li><a href="http://slj.me/2011/06/php-daemon-notice/" title="[转] 代替bash，书写 PHP daemon 后台程序">[转] 代替bash，书写 PHP daemon 后台程序</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://slj.me/2009/12/%e4%bb%8e%e5%ae%89%e8%a3%85gev-com%e4%b8%ad%e5%ad%a6%e5%88%b0%e7%9a%84/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

