<?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>寂静的深海 &#187; PHP</title>
	<atom:link href="http://www.deepseath.com/?feed=rss2&#038;tag=php" rel="self" type="application/rss+xml" />
	<link>http://www.deepseath.com</link>
	<description></description>
	<lastBuildDate>Mon, 29 Jan 2024 09:55:11 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>[PHP]数组移除某个值的两种方式</title>
		<link>http://www.deepseath.com/?p=1071</link>
		<comments>http://www.deepseath.com/?p=1071#comments</comments>
		<pubDate>Sat, 17 Mar 2012 09:57:50 +0000</pubDate>
		<dc:creator>Deepseath</dc:creator>
				<category><![CDATA[日积月累]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[函数]]></category>

		<guid isPermaLink="false">http://www.deepseath.com/?p=1071</guid>
		<description><![CDATA[php中从数组中移除某个值，可以有两种方式，一种是常规的遍历比值然后移除，另一种是利用array_diff函数。 先利用是利用遍历数组的方式写了个函数： function array_delete_value($array,$delete_value){ foreach ( $array AS $k=&#62;$v ) { if ( $v === $delete_value ) { unset($array[$k]); } } return $array; } 用法：array_delete_value(原数组,待移除的值); 两种方式的使用： 1.利用自定义函数： &#60;?php $del = ''; $t = 0; function array_delete_value($array,$delete_value){ foreach ( $array AS $k=&#62;$v ) { if ( $v === $delete_value ) { unset($array[$k]); } } return $array; [...]]]></description>
		<wfw:commentRss>http://www.deepseath.com/?feed=rss2&#038;p=1071</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP在Windows下的安装</title>
		<link>http://www.deepseath.com/?p=1059</link>
		<comments>http://www.deepseath.com/?p=1059#comments</comments>
		<pubDate>Wed, 08 Feb 2012 16:03:45 +0000</pubDate>
		<dc:creator>Deepseath</dc:creator>
				<category><![CDATA[日积月累]]></category>
		<category><![CDATA[IIS]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[服务器]]></category>

		<guid isPermaLink="false">http://www.deepseath.com/?p=1059</guid>
		<description><![CDATA[很久没在IIS6配置PHP了。因为服务器重装系统，今天配置了PHP。 我不习惯将PHP文件copy到系统目录内（system32），会导致日后升级比较麻烦。 PHP在IIS6下安装很简单，主要是读取指定的php.ini文件路径的设置问题。 我是通过注册表的IniFilePath来定义的，可以将下面的代码另存一个.reg文件，然后导入到注册表内。记得将C:\\PHP5改为实际的PHP存放目录。 Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\php] "IniFilePath"="C:\\php5" 另外，一定要将PHP存放路径加入到系统环境变量Path里面去。否则会导致无法加载dll扩展的情况发生。这一步我就给忘了，结果启动iis的时候总会弹出一个类似如下的警告： 弹出应用程序: Warning: PHP Startup: Unable to load dynamic library '*****\php_curl.dll' - 找不到指定的模块。 &#160;]]></description>
		<wfw:commentRss>http://www.deepseath.com/?feed=rss2&#038;p=1059</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP发送header头404信息</title>
		<link>http://www.deepseath.com/?p=1018</link>
		<comments>http://www.deepseath.com/?p=1018#comments</comments>
		<pubDate>Sat, 12 Nov 2011 12:53:02 +0000</pubDate>
		<dc:creator>Deepseath</dc:creator>
				<category><![CDATA[实验室]]></category>
		<category><![CDATA[header]]></category>
		<category><![CDATA[HTTP]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.deepseath.com/?p=1018</guid>
		<description><![CDATA[其实很简单，直接上代码再解释。 if ( stripos(php_sapi_name(),'cgi') === 0 ) { @header('Status: 404 Not Found',true); } else { @header( (isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.1').' 404 Not Found'); } echo &#60;&#60;&#60;EOD &#60;!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"&#62; &#60;html&#62;&#60;head&#62; &#60;title&#62;404 Not Found&#60;/title&#62; &#60;/head&#62;&#60;body&#62; &#60;h1&#62;Not Found&#60;/h1&#62; &#60;p&#62;The requested URL was not found on this server.&#60;/p&#62; &#60;/body&#62;&#60;/html&#62; EOD; exit; 其实正常情况下只需要header(&#8216;HTTP/1.1 404 Not [...]]]></description>
		<wfw:commentRss>http://www.deepseath.com/?feed=rss2&#038;p=1018</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP的json数据编译和解译，字符编码无关。</title>
		<link>http://www.deepseath.com/?p=1016</link>
		<comments>http://www.deepseath.com/?p=1016#comments</comments>
		<pubDate>Fri, 11 Nov 2011 03:23:48 +0000</pubDate>
		<dc:creator>Deepseath</dc:creator>
				<category><![CDATA[实验室]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[中文]]></category>
		<category><![CDATA[代码]]></category>
		<category><![CDATA[开发]]></category>
		<category><![CDATA[技术]]></category>

		<guid isPermaLink="false">http://www.deepseath.com/?p=1016</guid>
		<description><![CDATA[这里只就PHP5.2.0+以上版本而言，因为JSON扩展是自PHP5.2.0才开始引入的。早期版本没有默认引入。 json现在应用比较广泛，主要是由于ajax技术的原因。json可以很方便的传输具有属性的数据格式，方便前端进行解析处理，更好的将数据流量传输降低并且也能使前后端尽可能的分离。 貌似自06年开始我在做的项目如果客户不强烈要求的情况下，我都会使用UTF-8进行编码开发，UTF-8开发会有很多好处，比如前、后端数据传输很方便无须额外的编码开销，另外储存的字符也比较直观，虽然有数据容量的浪费，但在目前储存如白菜价的环境下，容量问题应该不大。 在使用UTF-8编码的时候，json_encode/json_decode可以很方便的处理（虽然编译后的数据中的中文看起来很怪异，但因为也不需要直接使用数据所以也无所谓），因为PHP自带的json扩展库只支持UTF-8编码。 但有的时候客户强烈选择使用GBK/GB2312进行编码的情况下，自带的json就应付不了了。所有涉及到中文的经过编译后会变成null。 在不考虑使用第三方的扩展或者其他类库处理的情况，可以自己写一个变形函数来处理。 原理其实就是将数据的字符进行编码，比如使用rawurlencode()、urlencode()或者base64_encode()等函数进行编码，然后输出的时候再进行解码。 当然了，也可以用另一种途径，就是直接将数据字符进行编码转换，统一转换为UTF-8，然后使用json扩展函数进行处理，不过，这样处理可能会有一些意外发生（比如字符编码错误），另外，程序内的几个字符编码间来回转换看起来也不太好。 我处理的时候，利用urlencode进行编码（其实也可以使用rawurlencode()或base64_encode()，不过base64编码容量会比较大一些）。一般就是重写几个函数：json_encode()、json_decode()、ulrencode()、urldecode()。 首先要重写一下urlencode()和urldecode()，因为php自带的这两个函数只能对字符串进行处理，对于数组无法处理。而我们大多情况下其实就是处理数组。 其次要重写json_encode()和json_decode()，主要是将字符串编码进行还原，其实如果是js需要的话，可以不用重写。 主要代码： function djson_encode($data){ //重写json_encode，将数据使用urlencode进行编码 return json_encode(durlencode($data)); } function djson_decode($data){ $data = json_decode($data,true); $out = array(); foreach ( $data AS $key=&#62;$value ) { $out[durldecode($key)] = durldecode($value); } return $out; } function durldecode($string){ if ( is_array($string) ) { $array = array(); foreach ( $string AS $key=&#62;$value [...]]]></description>
		<wfw:commentRss>http://www.deepseath.com/?feed=rss2&#038;p=1016</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Windows2003计划任务实现服务器自动重启</title>
		<link>http://www.deepseath.com/?p=989</link>
		<comments>http://www.deepseath.com/?p=989#comments</comments>
		<pubDate>Thu, 29 Sep 2011 02:36:28 +0000</pubDate>
		<dc:creator>Deepseath</dc:creator>
				<category><![CDATA[日积月累]]></category>
		<category><![CDATA[HTTP]]></category>
		<category><![CDATA[IIS]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Win2003]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[服务器]]></category>
		<category><![CDATA[计划任务]]></category>

		<guid isPermaLink="false">http://www.deepseath.com/?p=989</guid>
		<description><![CDATA[最近服务器刚刚更换了一块新硬盘，同时也将PHP升级了一下，然后不知道什么原因（因为这两个维护导致的或是其他的）IIS运行PHP的站点每隔一阵就会无法访问，而静态页面的站点是可以访问的，最为奇怪的是，貌似每次发生这样的故障的间隔期间基本是差不多的，尝试检查了一下，没发现什么意外情况，连系统的日志以及IIS自身的日志都没有什么异常记录。同时也是比较懒得详细检查，所以干脆直接搞了定时重启服务器。 这绝对是一个非常非常非常懒惰的行为，可确实是没什么更好的办法了，如果有朋友能知道这是怎么个原因的话不妨告诉一下，千恩万谢！！！ 先搞定个Windows计划任务自动定时重启机器吧。关于设置Windows计划任务的操作本没什么技术含量本不想弄的，但刚巧前一阵还真有几个朋友问过这方面的操作的，看来有必要普及一下，呵呵。如果你比较熟悉Windows计划任务了，可以不用往下看了^_^ 首先，得确定一个访问量相对比较低的时段进行重启操作，根据若干的站点流量日志分析，基本上访问量比较低的时段几乎平均在每日的凌晨4点左右，估计大多数人这个时候都在睡觉吧^^，正是重启的好时间。 确定好重启的时间后，开始设置计划任务，打开Windows控制面板，找到“计划任务”，打开。点击“添加新计划任务”，会弹出一个“计划任务向导”对话窗，点击“下一步”，会选择程序，点击浏览，找到“c:\windows\system32\shutdown.exe”确定，然后下一步，设置计划任务的名称和执行时间。“下一步”后，设置具体的时间。再下一步设置Windows登录用户名和密码，点击确认完成。然后再次打开这个计划任务的高级属性。将运行内的执行程序后面加入两个参数。“/r /f”，变成“c:\windows\system32\shutdown.exe /r /f”这样执行的就是强制重启计算机命令了。 如下图：]]></description>
		<wfw:commentRss>http://www.deepseath.com/?feed=rss2&#038;p=989</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>关于SQL注入的监测</title>
		<link>http://www.deepseath.com/?p=977</link>
		<comments>http://www.deepseath.com/?p=977#comments</comments>
		<pubDate>Mon, 26 Sep 2011 15:55:50 +0000</pubDate>
		<dc:creator>Deepseath</dc:creator>
				<category><![CDATA[程序人生]]></category>
		<category><![CDATA[Discuz]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[代码]]></category>
		<category><![CDATA[思路]]></category>

		<guid isPermaLink="false">http://www.deepseath.com/?p=977</guid>
		<description><![CDATA[网站被挂马，有一个方式就是对某个帐号进行提权操作，比如针对非管理用户提权至最高管理员的权限。 事后可以发现被提权的用户帐号，但检查经由哪个文件注入的是个麻烦的事情，特别是针对开源的文件结构比较复杂的程序来说。 以前有个思路，一直未实现，今天处理了一个，是针对Discuz!5.5（很老的一个版本了^^）的，处理思路就是事后诸葛亮。 对于此类的提权操作，其根本原因就是通过SQL去变更待提权的帐号的管理标识，如果程序对于涉及变更帐号权限的SQL查询都能有一个记录的话，这样日后一旦发现有未知的提权操作的时候便会相对容易的发现注入口是什么，大体也能进行应对处理，总比盲目的去查找注入文件要容易一些，当然，这个其实只是“事后诸葛亮”的做法，并不是根本的防御措施，真正想要防御其实还是程序开发的时候多考虑一些，比如，外部的输入要验证数据类型、进行字符转义等等，这不在本文讨论范围。 就Discuz!而言，所有的SQL操作都是经由数据类层进行操作的，这样就提供了一个比较方便的方式，我们可以在数据查询方法中加入一个判断，判断当前进行的操作是否是在更新用户表的权限字段，如果是，则记录下来相关的信息并保存到日志文件内，方便日后查询处理，针对Discuz!5.5我是按照如下的方式处理的，其实其他版本的Discuz!或者Discuz!X乃至其他类似的程序都可以利用这样的方式进行。 针对Discuz!5.5代码如下： &#60;?php /* @ By Deepseath 2011-09-26 @ 记录用户管理权限发生变动时的相关信息 */ if ( preg_match('/UPDATE\s+[`]*'.$GLOBALS['tablepre'].'members[`]*\s+SET(.+)/is',$sql,$match) &#38;amp;&#38;amp; preg_match('/[`]*\s*adminid[`]*\s*=\s*/is',$match[1],$m) ) { //判断当前执行语句是否为members表包含adminid的更新 $sql_md5 = md5($sql);//唯一查询md5值 $logfile = DISCUZ_ROOT.'./forumdata/log_adminid/'.$sql_md5.'.log';//日志储存的文件 if ( !file_exists($logfile) &#124;&#124; time() - filemtime($logfile) &#38;gt; 1800 ) { //如果查询日志文件不存在或者日志文件距离当前时间超过1800秒，则记录查询日志 if ( !is_dir(DISCUZ_ROOT.'./forumdata/log_adminid/') ) { //日志目录不存在则创建 @mkdir(DISCUZ_ROOT.'./forumdata/log_adminid/',0777,true); } if ( $fp = @fopen($logfile,'ab') ) [...]]]></description>
		<wfw:commentRss>http://www.deepseath.com/?feed=rss2&#038;p=977</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>PHP的命令行执行方式</title>
		<link>http://www.deepseath.com/?p=969</link>
		<comments>http://www.deepseath.com/?p=969#comments</comments>
		<pubDate>Thu, 22 Sep 2011 13:05:37 +0000</pubDate>
		<dc:creator>Deepseath</dc:creator>
				<category><![CDATA[程序人生]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[经验]]></category>

		<guid isPermaLink="false">http://www.deepseath.com/?p=969</guid>
		<description><![CDATA[最近喜欢上了用PHP的命令行方式执行一些操作。 PHP的命令行方式详情可以看一下手册内容，写得很详细的。这里只说说自己在应用时的一些情况。 我主要是使用PHP5.2/5.3.x的Windows版本，默认情况下的php.exe就是CLI执行模式。php-win.exe是静默状态下的CLI，php-cgi.exe是CGI模式的执行，会有输出头信息。下面说的基本都是CLI模式进行执行的。 首先，相比而言，PHP的命令行方式执行PHP程序的效率要比以web方式执行要高一些，毕竟不经过web服务。而且对于持久执行时间的程序不需要加入时间限制函数set_time_limit()。另外，对于某些php.ini的配置选项也会强制被覆盖，比如： register_argc_argv始终为true，这样你可以为要执行的php程序传入一些参数，然后使用$arge[x]进行调用，其中x为参数的顺序号，第一个参数为1，第二个为2…… implicit_flush也为true，这样只要PHP输出了内容就会立即显示在命令行窗口内，对于某些需要做监视的操作，比如做一些邪恶的采集操作，你可以随时观看进度（当然前提是你得把程序内的调试输出写好，方便浏览） 需要注意的是，如果要写使用命令行方式执行的php程序，如果要调用其他php文件需要以绝对路径进行引用，其实，在web中执行的话也最好这样写，这是一个好习惯，可以避免一些意外的目录权限问题。 还有就是，一些预定义变量也是不存在的，比如$_SERVER['HTTP']、$_SERVER['REMOTE_ADDR']等一些依赖web服务的变量。将程序的错误报告完全打开，你会发现哪些变量是未定义的，便于调整。 以上就是在使用过程中总结的一些零零散散的经验。]]></description>
		<wfw:commentRss>http://www.deepseath.com/?feed=rss2&#038;p=969</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>将wordpress升级到了3.2.1</title>
		<link>http://www.deepseath.com/?p=908</link>
		<comments>http://www.deepseath.com/?p=908#comments</comments>
		<pubDate>Sat, 03 Sep 2011 16:54:05 +0000</pubDate>
		<dc:creator>Deepseath</dc:creator>
				<category><![CDATA[心情日记]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[wordpress]]></category>
		<category><![CDATA[升级]]></category>

		<guid isPermaLink="false">http://www.deepseath.com/?p=908</guid>
		<description><![CDATA[之前以为wordpress 3.2.1需要PHP最低版本为5.3所以一直没敢升级，今天了解到原来没有这个要求，呵呵。 晚上无聊的时候就升级了一下，没发现什么特别好玩的功能。原来的风格一来不太兼容，二来实在改得太乱了，懒得再改了，于是直接在wordpress找了一款叫做Sonar 1.2.4的风格安装上对付着用了，不是很好看，唯一喜欢的可能就是这款风格的色调了。安装后发现是英文版的，自己汉化了一下，用着还算可以。 看来看去还是有点怀念之前的那个风格…… PS：刚刚发现貌似这个风格在 IE8 浏览有一些怪异的情况，暂时不理会了…… PS：利用晚上时间把一款 Green Hope Theme 修改成我喜欢的蓝色，并将右侧边栏设置修改为单列，嗯，目前这个效果应该是自己比较喜欢的啦^_^暂时未发现明显的浏览器兼容问题。2011-09-05 22:30]]></description>
		<wfw:commentRss>http://www.deepseath.com/?feed=rss2&#038;p=908</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>PHP的Snoopy.class.php</title>
		<link>http://www.deepseath.com/?p=884</link>
		<comments>http://www.deepseath.com/?p=884#comments</comments>
		<pubDate>Wed, 17 Aug 2011 08:01:11 +0000</pubDate>
		<dc:creator>Deepseath</dc:creator>
				<category><![CDATA[程序人生]]></category>
		<category><![CDATA[header]]></category>
		<category><![CDATA[HTTP]]></category>
		<category><![CDATA[HTTP协议]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Snoopy]]></category>
		<category><![CDATA[代码]]></category>

		<guid isPermaLink="false">http://www.deepseath.com/?p=884</guid>
		<description><![CDATA[使用PHP读取HTTP页面基本使用Snoopy，使用简单方便易用。 最近在使用过程中发现一些问题，读取某些服务器的时候会发现获取不到页面内容。 留意Snoopy的Header请求头的时候发现，对于HOST请求是类似 HOST: hostname:port 看代码，只要端口存在，就使用该方式发送请求。 但观察浏览器请求时发现如果端口为80的时候，会省略掉端口号。 按这个方式改造一下Snoopy的代码，加入判断端口号，如果端口号为80的情况下，则直接使用 HOST: hostname 否则使用 HOST: hostname:port 这样改写代码后上面的问题就解决了。 问题的原因不太清楚，呵呵，对于HTTP协议始终就是模棱两可一知半解，实用至上主义，问题解决就不管了。 另外，还有一个问题就是，自官方下载到的Snoopy.class.php的编码问题，这个文件使用的是“阿拉伯语（Windows）”进行编码的，至少在这个编码下查看没有乱码。 为了方便日后改写代码，我是利用阿拉伯语（Windows）打开，然后Copy无乱码的代码另存为UTF-8编码，方便日后更改处理。]]></description>
		<wfw:commentRss>http://www.deepseath.com/?feed=rss2&#038;p=884</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>分享一下近期在开发过程中用到的一些PHP库类</title>
		<link>http://www.deepseath.com/?p=873</link>
		<comments>http://www.deepseath.com/?p=873#comments</comments>
		<pubDate>Wed, 27 Jul 2011 16:55:30 +0000</pubDate>
		<dc:creator>Deepseath</dc:creator>
				<category><![CDATA[程序人生]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[分享]]></category>
		<category><![CDATA[开发]]></category>

		<guid isPermaLink="false">http://www.deepseath.com/?p=873</guid>
		<description><![CDATA[手里的项目进展还算顺利，即将进入一个新阶段，越来越感觉运营中的那句话“先开枪后瞄准”的确是进行一个商业计划（特别是比较新颖的）时，需要考虑的。技术人员不能眼里只有纯粹的技术，如若想要尽快的实现盈利，一些非关键性的功能和技术方面可以放到后面去考虑，目的是要尽快的确保项目能够稳定的运行且尽快的抢占市场赢得一些商机。 一直以来开发的程序都没有用过现成的框架，由于对面向对象开发还是有一些障碍（心理接受以及性能方面考虑等），但由于一些长期的运营项目涉及未来扩展和开发问题（面向过程开发在这方面还是很弱的），所以自己弄了一个面向过程开发的一个“框架”（只能算是一个雏形吧），虽然不能解决大问题，但最起码可以让新开发中减少很多重复性的操作。 说回到本文标题，其实这些库类一直都在使用着，用着虽然不是很精通，但好在一些文档比较清晰所以用起来还是很方便的。 1.PHP的图表类——pChart，这是一个很棒的使用PHP开发的用来生成图表文件的类库，可以生成包括且不限于柱状、表格、饼图等形式的图表，可控性很强，功能也很强大。对中文支持也很好（需要UTF-8编码且使用中文字体文件）。现在我用到的是2.1.1版本。 2.Excel读写类——PHPExcel，也是巨强悍的PHP读写Excel库类。涉及的操作很多很高级（合并表格、表格样式定义、插入图片等等），比较复杂，开发的时候一般都是有针对性的去看文档，呵呵。 3.Open Flash Chart的PHP库php-ofc-library，这个其实网上介绍挺多的，Flash的图表显示，对于这个库类的使用目前有一点点的犹豫，目前来说，如果对于实时性不是很强的情况下大体还是利用pChart生成图片文件缓存下来进行展示，好处是可以避免Flash显示问题。 4.javascript压缩库JavascriptPacker，由于现在前台利用到jQuery并且使用别人或者自己写的好多插件，为了减少浏览器的HTTP请求并减少下载容量，所以使用这个库类将多个js脚本进行压缩合并，然后利用PHP使用gzip压缩输出给浏览器，实际效果中大概接近340K左右的js经过这样的处理后浏览器下载时只有不到100K的大小。 其他诸如的模版处理、数据库操作等都是自己写的，因为一直在用所以自己觉得比较熟练和方便^_^ 另外，pChart使用过程遇到一个情况，就是对于X轴（X坐标）上的表述文字过长的情况下可能会有被覆盖而看不清楚的时候，可以考虑将文字做一些倾斜处理，可以自定义角度。在$myPicture->drawScale($setting)方法中，配置$setting中的LabelRotation值为一个角度就可以了。 比如： $Settings = array(“Pos”=>SCALE_POS_LEFTRIGHT, “Mode”=>SCALE_MODE_START0, “LabelingMethod”=>LABELING_DIFFERENT, “GridR”=>136, “GridG”=>136, “GridB”=>136, “GridAlpha”=>50, “TickR”=>0, “TickG”=>0, “TickB”=>0, “TickAlpha”=>50, “LabelRotation”=>45, “CycleBackground”=>1, “DrawArrows”=>1, “DrawXLines”=>1, “DrawSubTicks”=>1, “SubTickR”=>0, “SubTickG”=>0, “SubTickB”=>255, “SubTickAlpha”=>50, “DrawYLines”=>ALL); $myPicture->drawScale($Settings);]]></description>
		<wfw:commentRss>http://www.deepseath.com/?feed=rss2&#038;p=873</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HTML中的文本区textarea发送换行的测试</title>
		<link>http://www.deepseath.com/?p=863</link>
		<comments>http://www.deepseath.com/?p=863#comments</comments>
		<pubDate>Fri, 01 Jul 2011 17:55:33 +0000</pubDate>
		<dc:creator>Deepseath</dc:creator>
				<category><![CDATA[日积月累]]></category>
		<category><![CDATA[Function]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[开发]]></category>

		<guid isPermaLink="false">http://www.deepseath.com/?p=863</guid>
		<description><![CDATA[一直都在想在HTML前端页面表单的文本区textarea输入换行的时候，服务器接收到的这个文本区的数据是什么样的。 都知道不同的操作系统对于换行的表达不一样，Windows的换行符号是“\r\n”、类Unix系统换行符号是“\n”、而Mac OS换行符号则是“\r”（Mac OS 9以前是“\r”，以后就是“\n”了） 我其实就是想了解一下： 如果客户端是Win系统，服务端是类Unix系统，那么在客户端提交的表单内的换行符号是什么？ 反之呢？ 我开始想应该是同服务器无关，同客户端有关系的，根据客户端的系统进行显示的。 今天在mac os（安装在虚拟机上的）上测试了一下，发现结果跟想像的是不同的。 貌似与服务和客户端都没关系，通过表单发送的数据换行符号就是“\r\n”（CRLF） 感觉真的很奇怪~~或许是我困了？搞糊涂了？疑惑中…… 话说服务器端容易判断，可以根据操作系统判断，也可以使用PHP自带的一个常量（PHP_EOL，它会根据服务器操作系统输出“\r\n”或“\n”）进行判断。 其实这个没什么大不了的，只是想刨根问底的了解一下而已。 在开发中，我实际经常将“\r\n”做为固定的换行符，而不去考虑服务器操作系统是什么，在所有涉及此类操作的时候都认定换行符为“\r\n”。 对于用户发送过来的数据，也会格式化一下换行符号变成“\r\n”。 自己写了一个函数去处理这个操作，很简单，无非是利用字符替换函数将“\r\n”、“\r”、“\n”，先替换成一个自定义的字符串（需要复杂一些，理由你懂得），然后再将这个自定义字符串替换成“\r\n”， 其实这样还不完善，有可能会导致明明是一个换行符但给格式化成两个（或以上）了，不过，此类情况一般都是非正常的输入，很有可能是非法伪造的数据，因此不用理会。 function format_linebreak($string,$newlb = "\r\n"){ if ( is_array($string) ) { foreach ( $string AS $key=>$val ) { $string[$key] = format_linebreak($val,$newlb); } } else { $sysnbstr = ''; $string = str_replace($sysnbstr,'',$string); if ( strpos($string,"\r\n") !== false ) { [...]]]></description>
		<wfw:commentRss>http://www.deepseath.com/?feed=rss2&#038;p=863</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>关于“找不到附属汇编 Microsoft.VC90.CRT，上一个错误是 参照的汇编没有安装在系统上。”的解决</title>
		<link>http://www.deepseath.com/?p=858</link>
		<comments>http://www.deepseath.com/?p=858#comments</comments>
		<pubDate>Thu, 16 Jun 2011 18:28:52 +0000</pubDate>
		<dc:creator>Deepseath</dc:creator>
				<category><![CDATA[日积月累]]></category>
		<category><![CDATA[bat]]></category>
		<category><![CDATA[microsoft]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[SideBySide]]></category>
		<category><![CDATA[VC9]]></category>
		<category><![CDATA[服务器]]></category>
		<category><![CDATA[计划任务]]></category>

		<guid isPermaLink="false">http://www.deepseath.com/?p=858</guid>
		<description><![CDATA[一个项目需要在Win系统用计划任务执行PHP，写了个批处理bat利用php-cgi.exe进行执行PHP文件，由于在服务器运行为了不影响服务器既有的PHP配置信息，同时也是考虑未来的移植性还有性能问题，自己弄了个精简了的PHP运行环境。 可在Win下死活也是执行不了，运行批处理直接闪一下就啥都木有咧，于是为了看具体的状态，使用cmd命令行模式去运行批处理文件，结果提示“系统无法执行指定的程序。”，悲催了，难道朋友将服务器给阉割导致不能执行.bat文件？ 正咬牙切齿的时候决定再尝试一下确定到底是什么问题。这一次直接在cmd中执行php，运行php.exe -c php.ini -i（指定同php.exe相同目录下的php.ini作为php的配置文件，并且显示phpinfo信息），回车后，竟然还是那句该死的“系统无法执行指定的程序。”，看来不是系统运行不了bat批处理，是干脆不能执行php.exe，咋回事捏？ 再次尝试寻找问题的症结，这次尝试在cmd运行服务器原有的php.exe，奇迹出现了，竟然可以正常执行并且返回了phpinfo信息。这下看来应该是我自己所谓的精简的问题，有点晕~~ 纠结的时候突然想到，服务器运行的是PHP 5.2.x版本，而我自己打包的是PHP 5.3.x，貌似是用VC9编译的，而php 5.2是用VC6编译的，看来应该是服务器没有安装Microsoft Visual C++运行库导致的，这只是一个初步想法，为了保险尝试看看系统日志有没有留下啥鸟东西（一般微软自家的东西出错了都会老实的写日志的）。 在系统日志中发现了来源均为“SideBySide”，事件ID一个：32，两个59。 事件ID为32的描述是这样的：找不到附属汇编 Microsoft.VC90.CRT，上一个错误是 参照的汇编没有安装在系统上。 事件ID为59的描述是这样的：Resolve Partial Assembly 为 Microsoft.VC90.CRT 失败。 参考错误消息: 参照的汇编没有安装在系统上。 另一个事件ID为59的描述是：Generate Activation Context 为 E:\***\php.exe 失败。 参考错误消息: 参照的汇编没有安装在系统上。 哈哈，看来问题原因找到了，就是因为缺少VC9的运行库，老实的去微软找：http://download.microsoft.com/download/9/7/7/977B481A-7BA6-4E30-AC40-ED51EB2028F2/vcredist_x86.exe，下载回来vcredist_x86.exe（Microsoft Visual C++ 2008 Redistributable 9.0.30729.4148）安装，再次执行php.exe成功了^_^ 这就是整个解决问题的过程。估计以后也会有其他人遇到此类问题的，分享一下经验吧:)]]></description>
		<wfw:commentRss>http://www.deepseath.com/?feed=rss2&#038;p=858</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>使用fastcgi_finish_request提高页面响应速度</title>
		<link>http://www.deepseath.com/?p=851</link>
		<comments>http://www.deepseath.com/?p=851#comments</comments>
		<pubDate>Wed, 13 Apr 2011 16:23:27 +0000</pubDate>
		<dc:creator>Deepseath</dc:creator>
				<category><![CDATA[日积月累]]></category>
		<category><![CDATA[HTTP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[代码]]></category>
		<category><![CDATA[服务]]></category>
		<category><![CDATA[转载]]></category>

		<guid isPermaLink="false">http://www.deepseath.com/?p=851</guid>
		<description><![CDATA[当PHP运行在FastCGI模式时,PHP FPM提供了一个名为fastcgi_finish_request的方法.按照文档上的说法,此方法可以提高请求的处理速度,如果有些处理可以在页面生成完后再进行,就可以使用这个方法. 听起来可能有些茫然,我们通过几个例子来说明一下： &#60;?php echo '例子：'; fastcgi_finish_request(); /* 响应完成, 关闭连接 */ /* 记录日志 */ file_put_contents('log.txt', '生存还是毁灭,这是个问题.'); ?&#62; 通过浏览器访问此脚本, 结果发现并没有输出相应的字符串,但却生成了相应的文件.由此说明在调用fastcgi_finish_request后,客户端响应就已经结束,但与此同时服务端脚本却继续运行！ 合理利用这个特性可以大大提升用户体验,趁热打铁再来一个例子： &#60;?php echo '例子：'; file_put_contents('log.txt', date('Y-m-d H:i:s') . &#34; 上传视频\n&#34;, FILE_APPEND); fastcgi_finish_request(); sleep(1); file_put_contents('log.txt', date('Y-m-d H:i:s') . &#34; 转换格式\n&#34;, FILE_APPEND); sleep(1); file_put_contents('log.txt', date('Y-m-d H:i:s') . &#34; 提取图片\n&#34;, FILE_APPEND); ?&#62; 代码里用sleep模拟一些耗时的操作,浏览时没有被堵塞,程序却都执行了,具体看日志. 末了给您提个醒,Yahoo在Best Practices for Speeding Up Your [...]]]></description>
		<wfw:commentRss>http://www.deepseath.com/?feed=rss2&#038;p=851</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>几款比较实用的PHP库</title>
		<link>http://www.deepseath.com/?p=806</link>
		<comments>http://www.deepseath.com/?p=806#comments</comments>
		<pubDate>Thu, 11 Nov 2010 15:46:58 +0000</pubDate>
		<dc:creator>Deepseath</dc:creator>
				<category><![CDATA[程序人生]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.deepseath.com/?p=806</guid>
		<description><![CDATA[整理资料的时候看到的，不知道出处了。放博客上备忘一下^_^都是比较实用的。 1. ReCAPTCHA The reCAPTCHA 库让你可以为网站创建高级的 CAPTCHA 系统，这个系统其实是用来生成验证信息的，甚至包括语音验证。当然还有 reCAPTCHA 服务可以使用，其提供易用的免费 API，值得在你的网站试试。 下载 ReCAPTCHA &#124; 获得 API Key &#124; 文档 2. Akismet Akismet 是个供小站点使用的免费服务，用来修改规范将加入数据库的评论（防止恶意评论）。这个库一直在改善。 详细参考 Akismet 介绍 3. Services_JSON JSON 是人类能容易理解的信息传递格式。不过如果你并未使用 5.2.0 以后版本的 PHP（从那以后 PHP 有了 JSON 官方支持），那么就应该试试这个库。 查看 Services_JSON 4. Smarty Smarty就是鼎鼎大名的官方模版库了。它提供了不少有用的功能。其实使用 PHP 的人都该瞧瞧。 下载 Smarty &#124; 官方文档 5. pChart pChart 是极其有名的数据图形库。它能为数据展示提供各种美丽的图表。其实使用 PHP 的人都一定会碰到使用它的情况。 下载 [...]]]></description>
		<wfw:commentRss>http://www.deepseath.com/?feed=rss2&#038;p=806</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ISBN的校验</title>
		<link>http://www.deepseath.com/?p=791</link>
		<comments>http://www.deepseath.com/?p=791#comments</comments>
		<pubDate>Mon, 27 Sep 2010 16:29:58 +0000</pubDate>
		<dc:creator>Deepseath</dc:creator>
				<category><![CDATA[实验室]]></category>
		<category><![CDATA[Function]]></category>
		<category><![CDATA[ISBN]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[函数]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.deepseath.com/?p=791</guid>
		<description><![CDATA[维基百科提供的ISBN码校验算法： 校验码的计算方法（10码） 假设某国际标准书号号码前9位是：7-309-04547 计算加权和S：S = 7×10＋3×9＋0×8＋9×7＋0×6＋4×5＋5×4＋4×3＋7×2 = 226 计算S÷11的余数M：M = 226 mod 11 = 6 计算11 – M 的差N：N = 11 ? 6 = 5 如果N = 10，校验码是字母”X” 如果N = 11，校验码是数字”0&#8243; 如果N为其他数字，校验码是数字N 所以，本书的校验码是5；如果用户提供的ISBN码是7-309-04547-6，那么校验失败 校验码的计算方法（13码） 假设某国际标准书号号码前12位是：978-986-181-728 计算加权和S：S = (9×1)+(7×3)+(8×1)+(9×3)+(8×1)+(6×3)+(1×1)+(8×3)+(1×1)+(7×3)+(2×1)+(8×3) = 164 计算S÷10的余数M：M = 164 mod 10 = 4 计算10 – M 的差N：N = 10 ? 4 [...]]]></description>
		<wfw:commentRss>http://www.deepseath.com/?feed=rss2&#038;p=791</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>关于用户邮箱验证的一个思路</title>
		<link>http://www.deepseath.com/?p=770</link>
		<comments>http://www.deepseath.com/?p=770#comments</comments>
		<pubDate>Mon, 06 Sep 2010 16:59:47 +0000</pubDate>
		<dc:creator>Deepseath</dc:creator>
				<category><![CDATA[实验室]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[分享]]></category>
		<category><![CDATA[开发]]></category>
		<category><![CDATA[思路]]></category>
		<category><![CDATA[流程]]></category>

		<guid isPermaLink="false">http://www.deepseath.com/?p=770</guid>
		<description><![CDATA[当下很多运营或者应用都会引导用户激活验证注册的Email地址，为了确保获得更可靠的用户（虽然可靠性不是很高），同时也为了避免地址不被滥用，尽力获取更优化的用户资源等等，好处是很多的。 一般在验证流程上都很简单，无非是：根据用户登记的Email发送一个验证邮件，用户收到邮件后，访问一个特定的处理链接，系统接收后，便会确认此人Email通过验证激活。 这个方式简单容易，设计也很方便。 但有一个“问题”，某个用户起初登记了一个A地址，然后通过了验证，过了一阵他又将Email改成了B地址，也通过了验证，可过了一阵又因为某种原因他又将Email改回了A地址，可系统仍旧提示未通过验证，这个挺囧的——当然其实也不是什么大不了的问题，不过个人始终觉得这是一个人性化的考虑。已经通过验证了的邮箱为什么还要再次验证呢？ 近期在一个项目上也有类似的处理，因为基于该异想天开的想法，我特意费时巴拉的用了一个新的机制，虽然没人能够看到，但我相信多多少少会让用户觉得有点人味的^_^ 具体流程其实很简单，无非是增加一个数据表，用来储存经过验证的Email地址，且每个Email对应一个用户id。 当用户通过验证的时候记录下他的id和Email，以及其他信息（比如验证时间等等） 当用户修改Email的时候，先去到这个数据表内查询该记录是否存在（uid和email同时满足），存在了就表面该用户已经通过验证了，不需要再次发送验证邮件。 uid与Email是作为一个唯一性索引键（UNIQUE）存在的。这样可以确保别人冒用这个Email地址的情况也被认为是通过验证的。 也就是说，只有其本人曾经用过的Email地址才会采用跳过验证的机制。 简单说： 用户A曾经验证通过了a、b、c三个Email地址。 那么日后他无论将Email地址修改变换为这三个任意一个的时候，系统都不会提醒他再次去验证。 如果另一个用户B登记了a地址，那么系统还是要提醒他进行验证的，因为数据表记录下验证通过a地址的用户是A而不是B。 以上就是我在项目中关于用户Email地址验证的一个机制（当然实际操作过程中，还要加入一个验证的条件限制等条件，避免用户频繁的请求，关于这部分处理，相信所有的验证机制都会考虑的。），不一定有什么特别重大的作用，不过觉得还是挺有意思的，记录下来分享一下吧。]]></description>
		<wfw:commentRss>http://www.deepseath.com/?feed=rss2&#038;p=770</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>一个有意思的函数传参方法</title>
		<link>http://www.deepseath.com/?p=678</link>
		<comments>http://www.deepseath.com/?p=678#comments</comments>
		<pubDate>Fri, 21 May 2010 14:52:20 +0000</pubDate>
		<dc:creator>Deepseath</dc:creator>
				<category><![CDATA[实验室]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[函数]]></category>

		<guid isPermaLink="false">http://www.deepseath.com/?p=678</guid>
		<description><![CDATA[最近在做的项目，虽然有很多前端的东西，现在不喜欢搞前端，觉得特麻烦，累。不如后台程序部分好玩，直接写代码还是很有意思的。 说实话，这么多年始终对于javascript属于入门汉的状态，主要是觉得javascript相对与服务端的PHP来说，不如PHP直接跟数据库打交道有意思。 不过，最近接触了好多jQuery，突然发现javascript原来不需要了解太多了，哈哈。jQuery真的是个好东西。 在使用和制作jQuery扩展的时候，发现jQuery有一个很有趣的函数传参办法，那就是直接利用数组或者已经格式化了的json字符串，这样做的好处显而易见——不必要记住函数参数的具体顺序，哪个在先哪个在后都无所谓。 现在懒得学习了，PHP手册也仅仅找需要的，加之英语实在不太好，所以在我的印象里，似乎php没有类似的方法（当然PHP类的那个不算在内） 晚上无聊的时候，尝试写了一个乱弹代码，觉得还是挺好玩的。 &#60;?php function call_function_param_arr($func_param_arr){ $var1='val1'; $var2='val2'; $var3='val3'; $var4='val4'; $var5='val5'; $var6='val6'; $var7='val7'; $var8='val8'; $var9='val9'; extract($func_param_arr,EXTR_IF_EXISTS); for ( $i=1;$i&#60;=9;$i++ ) { $tmp = 'var'.$i; echo "var{$i} = {$$tmp}&#60;br /&#62;"; } } function call_function_param_json($func_param_json){ $var1='val1'; $var2='val2'; $var3='val3'; $var4='val4'; $var5='val5'; $var6='val6'; $var7='val7'; $var8='val8'; $var9='val9'; extract(json_decode($func_param_json,true),EXTR_IF_EXISTS); for ( $i=1;$i&#60;=9;$i++ ) { $tmp = 'var'.$i; echo [...]]]></description>
		<wfw:commentRss>http://www.deepseath.com/?feed=rss2&#038;p=678</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>关于验证码实现的另一个思路</title>
		<link>http://www.deepseath.com/?p=654</link>
		<comments>http://www.deepseath.com/?p=654#comments</comments>
		<pubDate>Sat, 01 May 2010 12:56:40 +0000</pubDate>
		<dc:creator>Deepseath</dc:creator>
				<category><![CDATA[程序人生]]></category>
		<category><![CDATA[GD]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[思路]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.deepseath.com/?p=654</guid>
		<description><![CDATA[最近在做一个项目。在涉及到关于忘记密码找回功能时，从用户体验角度去考虑，在申请找回密码表单中只有两个元素——Email输入文本框和一个提交按钮。应该说会很方便。 但在接下来测试的时候，突然发现，虽然方便一些，同时也有关于恶意动作的阻止策略，但某些意外因素仍旧无法避免。 因此考虑加上一个验证码，避免一些纯粹攻击性恶意申请动作（此类动作其实也可以用一个方式进行阻止，不过，因为某些原因在此不方便实现）。 原本验证码打算用一些比较成熟的开源的代码来实现（比如：Discuz!中的验证码类——/include/seccode.class.php就是一个不错的例子），但其实发现类似这些显示出的效果仍旧会出现“人”难识别的情况。 对于机器识别验证码图片字符的机理说实话了解不多，以我的知识，我觉得可能是利用图片色彩加上字库方式去分辨的。既然是这两个因素，那么图片色彩上如果过于复杂显然对于“人”也同样难以识别，这个因素可以大略不去考虑，从字库来说，我觉得如果验证码字符利用非常规字库去显示或许效果会很好——但我不清楚机器将什么字库作为“非常规”，因此，我决定利用图片组合的方式进行构建。 简单说，就是将事先做好的字符图片拼凑起来，字符图片可以使用多套然后随机选取，字符图片上的“字符”利用自己“个性设计”——比如，将常规的字库图形利用图片编辑软件加以变形、缩放等等。考虑到，字符涉及较多，因此设计遵循两个原则：一是要将某些模棱两可的字符排除掉（比如：L、1、i、0、O等），二是根据CSS Sprite的原理，将同类型的字符放到一个图片中——我自己称之为“字符库图片”。 经过设计，得到若干组的 字符库图片，然后再设计多种类型的“背景图片”，作为验证码的背景，略微增加一些识别干扰。设计的原则最重要的就是——易于人类识别。 由于字符是特定个数的（经过我的筛选剩余24个）字母和数字，因此很容易放到一个小的数组里，利用array_rand()函数以及shuffle()函数，很容易生成一个漂亮的随机字符串。利用字符串单元字符的特定“位置(其实与数组的键值是对应的)”可以很方便的在“字符库图片”中找到它的位置。利用imagecopymerge()函数轻松的将它们拼凑在一起。 这样最终就形成了一个验证码的显示。 配合验证码的验证，可以利用私有的加密函数将字符串原形加密后保存在cookie内，对用户提交后进行快速验证。 由于涉及到的数组、图片的数量都不大，因此对于压力负载情况很好。 组合图片不是这个思路的难处，难点在于如何设计“人类”能看懂的字符图形:)另外，对于字符图片的相对位置控制也是一个比较费思量的课题，好在通过一些位置上的计算也可以进行不规则的变化。 思路很简单，写了一个简单的应用类，设计了大概6组“字符库图片”和4组“背景图片”，加上测试也花了整整一个下午的时间，效果自认为还不错。 代码就不上了，其实代码很简单，每个人的算法都可能不一样，主要的难点在于“字符库图片”的设计和排序问题。 谁订阅了我的博客，有兴趣看代码的可以直接朝我要，不贴在这里了^_^ PS：最近做项目用最多的是jQuery，这个框架太爽了。通过这个了解到框架做事的确很轻松，可惜，接触PHP有年头了，某些观念和意识基本已经根深蒂固了，所以到现在还无法使用任何PHP的框架。同时对于面向对象的开发，我个人真的是不入门，我倒觉得面向过程也并非是网上说的一无是处——比如性能、比如理解力等等还是略胜上风的。呵呵，题外话，个人不喜欢（或不上路）并非宣传大家也不要用，事实上，我最近看到开源站最多的比如：ThinkPHP、CakePHP应该都还不错，否则也不会有人去用了（哈哈，我其实对于这两个真的一点都不了解~~）]]></description>
		<wfw:commentRss>http://www.deepseath.com/?feed=rss2&#038;p=654</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>建议所有的程序开发者一起来保护MySQL——《拯救MySQL》</title>
		<link>http://www.deepseath.com/?p=584</link>
		<comments>http://www.deepseath.com/?p=584#comments</comments>
		<pubDate>Wed, 20 Jan 2010 02:45:09 +0000</pubDate>
		<dc:creator>Deepseath</dc:creator>
				<category><![CDATA[程序人生]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[开发]]></category>
		<category><![CDATA[拯救MySQL]]></category>
		<category><![CDATA[数据库]]></category>

		<guid isPermaLink="false">http://www.deepseath.com/?p=584</guid>
		<description><![CDATA[对于其他程序不甚了解，但就PHP开发来说，估计99%的人都选择MySQL作为数据库，因为MySQL给大家的印象是轻巧、易用并且最重要的是它有一个免费的社区版本，这个版本同它收费版本是完全一样的区别仅在于它的商业版本提供技术服务而已。 作为一个PHPer来说，我自2000年接触PHP，因为没有任何程序语言基础，所以学习起来挺费劲，一直使用文本储存数据，但真的觉得既麻烦又不安全，然后2001年年初的时候第一次开始接触MySQL，对于我无任何数据库语言概念的人来说上手的确有一点点困难，但我清晰的记得，看完了几个例子以后，我便轻松的了解了MySQL知道了它的强大、易用，而且最主要的是它不像Orlce和SQL Server，它是免费的！！ 自那个时候起，我慢慢开始了解了这世上还有一些人，在维护着PHP、维护着MySQL、维护着Apache，我知道了一个名词“开源社区”，知道了还有一个免费的操作系统Linux ，知道这世界上还有一群具有创新、共享精神的人…… 到现在，熟练使用并在自己项目上应用部署MySQL已经有接近8年的时间了，从MySQL4.0用到MySQL5.1，这个过程是很奇妙的，我从未担心过什么，因为我知道MySQL精神会继续着 …… 突然有一天，我知道了那个卖得很贵的数据库Orcal的东家甲骨文开始“惦记”着MySQL了 ，就我个人的感觉来说，这不是什么好事，如果这个公司或者其他别有用心的公司去收购MySQL，那么可能会带来的两种情况就是：1.为了维护其自身收费的数据库产品，势必会打压MySQL的开发，致使MySQL慢慢落后于其他数据库，导致它的淘汰；2.将MySQL也变成一个完全收费的产品。我个人可能更容易想到第一种情况，如果是那样，那真的是一个灾难…… 为此，包括MySQL的创始人Michael Widenius在内的一些人组织了一个《拯救MySQL》的活动，请求所有MySQL的支持者支持和保护MySQL。 刚刚也在上面签名了，做为能力有限的支持者来说，我也许只能做到这些了。 希望支持MySQL的朋友们，一起来救救MySQL，点击进入这个链接填写表单就可以了：http://www.helpmysql.org/cn/petition 不要害怕E文，呵呵，是多语言的，我给的连接是中文版的^_^]]></description>
		<wfw:commentRss>http://www.deepseath.com/?feed=rss2&#038;p=584</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>看到一个人的博客想写的……</title>
		<link>http://www.deepseath.com/?p=581</link>
		<comments>http://www.deepseath.com/?p=581#comments</comments>
		<pubDate>Tue, 19 Jan 2010 14:34:25 +0000</pubDate>
		<dc:creator>Deepseath</dc:creator>
				<category><![CDATA[程序人生]]></category>
		<category><![CDATA[Function]]></category>
		<category><![CDATA[opera]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[代码]]></category>

		<guid isPermaLink="false">http://www.deepseath.com/?p=581</guid>
		<description><![CDATA[先说一段引子吧，我特喜欢用Opera，虽然还有一些不尽如人意的地方，但越来越喜欢上这个浏览器了。最爱用的功能就是RSS（Opera叫做网摘订阅功能），我订阅了n多的RSS列表，呵呵，大多数都是技术类的，毕竟现在信息量太大找也不好找，而且有的时候忙着也没空满网络乱翻，订阅这个时不时阅读一下挺好的^_^ 话说，今儿读到一篇来自博客园的某位PHPer看样子应该是新注册博客园的，发了个博文具体名字不写了，反正是关于求3值最大数的函数的，不知道是自己写的还是转载的，反正函数是： function sum_3($a,$b,$c){ $a&#62;$b?$max=$a:$max=$b; return $max&#62;$c?$max:$c; } 虽然是小函数，可这样的写法实在…… 为什么不这样写？ function sum_3($a,$b,$c){ return max($a,$b,$c); } 即便不用内置的max函数，也可以这样： function sum_3($a,$b,$c){ return $c &#62;= ($tmp = ($a &#62;= $b) ? $a : $b) ? $c : $tmp; } 就我自身能力而言，就写代码来说，个人倾向于，尽最大可能使用内置函数避免走弯路也避免出bug。 闲来无事胡诌一番，实在是此人的博客无法评论，不吐不快于是自己发泄到自己的博客上来了，呵呵~~~]]></description>
		<wfw:commentRss>http://www.deepseath.com/?feed=rss2&#038;p=581</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
