mysql>Create DATABASE “your_db_name” default charset utf8 COLLATE utf8_general_ci;
#my_db:要创建的数据库
#“COLLATE utf8_general_ci“,使用utf编码存储数据
mysql>Create DATABASE “your_db_name” default charset utf8 COLLATE utf8_general_ci;
#my_db:要创建的数据库
#“COLLATE utf8_general_ci“,使用utf编码存储数据
rt
顺便转一篇参考资料:http://www.ooso.net/index.php/archives/397
在优化php代码执行效率过程中,有个好办法是利用xdebug生成profile文件,然后查看整个程序的瓶颈在哪里。现在xdebug profile的查看程序有好几个,在这里罗列一下.
Wincachegrind是windows下的profile查看程序,使用起来感觉还不错,profile文件太大的话偶尔会崩溃。
今天在高春辉的博客上看到这些:
最近又开始拿 Xdebug 和 wincachegrind 对项目的 PHP 代码进行分析和优化,但是发现和自己输出的执行时间总是相差十倍,差的不是零头,而是十倍。
上网搜索了一下,原来在 Xdebug 2.0.0RC4 版本开始,对 profiler 日志中的时间单位进行了修改。
(“Use µ seconds instead of a tenths of µ seconds to avoid confusion in profile information. ”)
而 wincachegrind 又不再升级维护了,所以凡是用 2.0.0RC4 以及之后版本的 Xdebug 输出的 profiler 日志用 wincachegrind 来分析的话,都会有十倍的时间差距。
他已经提供了hack后的版本,可以解决时间差距的问题,有兴趣的同学可以试试。
CachegrindVisualizer是一个xdebug的profile文件查看客户端,采用Adobe的AIR制作。
更详细的介绍可以看以前写的关于CachegrindVisualizer的介绍。
Kcachegrind是linux下的一个图形化profile查看工具,功能很强劲。
Callgrind uses runtime instrumentation via the Valgrind framework for its cache simulation and call-graph generation. This way, even shared libraries and dynamically opened plugins can be profiled. The data files generated by Callgrind can be loaded into KCachegrind for browsing the performance results.
webgrind和wincachegrind的功能差不多,但是webgrind是基于web的,采用php写的查看工具。看了一下代码,跑在linux的服务器比较好。
Webgrind is an Xdebug profiling web frontend in PHP5. It implements only a minimal subset of the features of kcachegrind, but installs in seconds and works on all platforms. For quick’n’dirty optimizations it does the job.
Memcache函数库是在PECL(PHP Extension Community Library)中,主要作用是搭建大容量的内存数据的临时存放区域,在分布式的时候作用体现的非常明显,否则不建议使用。
在《phper》电子杂志的第一期中,有黑夜路人写的关于Memcache的详细安装教程,本人在ubuntu上安装完运行的时候报错:
/usr/local/memcached/bin/memcached: error while loading shared libraries: libevent-1.4.so.2: cannot open shared object file: No such file or directory
按照:《libeven、memcached、libmemcache安装》中的方法,使用:
可以修正这个BUG
通过新得立安装php的memcached模块,注销/etc/php5/conf.d/memcached.ini里面的“;”,重启apache,调用phpinfo()出现memcached的信息
执行:
memcached的服务正式启动
Memcache::add — 添加一个值,如果已经存在,则返回false
Memcache::addServer — 添加一个可供使用的服务器地址
Memcache::close — 关闭一个Memcache对象
Memcache::connect — 创建一个Memcache对象
memcache_debug — 控制调试功能
Memcache::decrement — 对保存的某个key中的值进行减法操作
Memcache::delete — 删除一个key值
Memcache::flush — 清除所有缓存的数据
Memcache::get — 获取一个key值
Memcache::getExtendedStats — 获取进程池中所有进程的运行系统统计
Memcache::getServerStatus — 获取运行服务器的参数
Memcache::getStats — 返回服务器的一些运行统计信息
Memcache::getVersion — 返回运行的Memcache的版本信息
Memcache::increment — 对保存的某个key中的值进行加法操作
Memcache::pconnect — 创建一个Memcache的持久连接对象
Memcache::replace — R对一个已有的key进行覆写操作
Memcache::set — 添加一个值,如果已经存在,则覆写
Memcache::setCompressThreshold — 对大于某一大小的数据进行压缩
Memcache::setServerParams — 在运行时修改服务器的参数
建议用面向对象的方式来测试这个库:
Memcache::getVersion方法的作用是返回运行的Memcache的版本信息。
Memcache::getStats方法的作用是返回服务器的一些运行统计信息。Memcache::getStats方法有三个参数,第一个参数表示要求返回的类型:reset, malloc, maps, cachedump, slabs, items, sizes;第二个参数和第三个参数是在第一个参数设置为“cachedump”时使用的。Memcache::getExtendedStats方法的作用是获取进程池中所有进程的运行系统统计。
Memcache::connect方法的作用是创建一个Memcache对象。Memcache::pconnect方法的作用是创建一个Memcache的持久连接对象。Memcache::close方法的作用是关闭一个Memcache对象。
Memcache::set方法的作用是添加一个值,Memcache::set方法有四个参数,第一个参数是key,第二个参数是value,第三个参数可选,表示是否压缩保存,第四个参数可选,用来设置一个过期自动销毁的时间。Memcache::add方法的作用和Memcache::set方法类似,区别是如果Memcache::add方法的返回值为false,表示这个key已经存在,而Memcache::set方法则会直接覆写。Memcache::get方法的作用是获取一个key值,Memcache::get方法有一个参数,表示key。Memcache::replace方法的作用是对一个已有的key进行覆写操作,Memcache::replace方法有四个参数,作用和Memcache::set方法的相同。Memcache::delete方法的作用是删除一个key值,Memcache::delete方法有两个参数,第一个参数表示key,第二个参数可选,表示删除延迟的时间。
memcache_debug()函数的作用是控制调试功能,前提是php在编译的时候使用了–enable-debug选项,否则这个函数不会有作用。
Memcache::addServer方法的作用是添加一个可供使用的服务器地址,Memcache::addServer方法有8个参数,除了第一个参数意外,其他都是可选的,第一个参数表示服务器的地址,第二个参数表示端口,第三个参数表示是否是一个持久连接,第四个参数表示这台服务器在所有服务器中所占的权重,第五个参数表示连接的持续时间,第六个参数表示连接重试的间隔时间,默认为15,设置为-1表示不进行重试,第七个参数用来控制服务器的在线状态,第8个参数允许设置一个回掉函数来处理错误信息。
Memcache::setServerParams方法的作用是在运行时修改服务器的参数,Memcache::setServerParams方法有六个参数,Memcache::addServer方法少了第三和第四个参数。Memcache::getServerStatus方法的作用是获取运行服务器的参数,两个参数分别表示的地址和端口。
Memcache::flush方法的作用是清除所有缓存的数据,但是不会削去使用的内存空间。
Memcache::increment方法的作用是对保存的某个key中的值进行加法操作,Memcache::decremen方法的作用是对保存的某个key中的值进行减法操作。
setCompressThreshold方法的作用是对大于某一大小的数据进行压缩。setCompressThreshold方法有两个参数,第一个参数表示处理数据大小的临界点,第二个参数表示压缩的比例,默认为0.2。
肖理达 (KrazyNio AT hotmail.com), 2006.04. 06, 转载请注明出处
一、memcached 简介
在很多场合,我们都会听到 memcached 这个名字,但很多同学只是听过,并没有用过或实际了解过,只知道它是一个很不错的东东。这里简单介绍一下,memcached 是高效、快速的分布式内存对象缓存系统,主要用于加速 WEB 动态应用程序。
二、memcached 安装
首先是下载 memcached 了,目前最新版本是 1.1.12,直接从官方网站即可下载到 memcached-1.1.12.tar.gz。除此之外,memcached 用到了 libevent,我下载的是 libevent-1.1a.tar.gz。
接下来是分别将 libevent-1.1a.tar.gz 和 memcached-1.1.12.tar.gz 解开包、编译、安装:
# tar -xzf libevent-1.1a.tar.gz # cd libevent-1.1a # ./configure --prefix=/usr # make # make install # cd .. # tar -xzf memcached-1.1.12.tar.gz # cd memcached-1.1.12 # ./configure --prefix=/usr # make # make install
安装完成之后,memcached 应该在 /usr/bin/memcached。
三、运行 memcached 守护程序
运行 memcached 守护程序很简单,只需一个命令行即可,不需要修改任何配置文件(也没有配置文件给你修改
):
/usr/bin/memcached -d -m 128 -l 192.168.1.1 -p 11211 -u httpd
参数解释:
-d 以守护程序(daemon)方式运行 memcached; -m 设置 memcached 可以使用的内存大小,单位为 M; -l 设置监听的 IP 地址,如果是本机的话,通常可以不设置此参数; -p 设置监听的端口,默认为 11211,所以也可以不设置此参数; -u 指定用户,如果当前为 root 的话,需要使用此参数指定用户。
当然,还有其它参数可以用,man memcached 一下就可以看到了。
四、memcached 的工作原理
首先 memcached 是以守护程序方式运行于一个或多个服务器中,随时接受客户端的连接操作,客户端可以由各种语言编写,目前已知的客户端 API 包括 Perl/PHP/Python/Ruby/Java/C#/C 等等。PHP 等客户端在与 memcached 服务建立连接之后,接下来的事情就是存取对象了,每个被存取的对象都有一个唯一的标识符 key,存取操作均通过这个 key 进行,保存到 memcached 中的对象实际上是放置内存中的,并不是保存在 cache 文件中的,这也是为什么 memcached 能够如此高效快速的原因。注意,这些对象并不是持久的,服务停止之后,里边的数据就会丢失。

三、PHP 如何作为 memcached 客户端
有两种方法可以使 PHP 作为 memcached 客户端,调用 memcached 的服务进行对象存取操作。
第一种,PHP 有一个叫做 memcache 的扩展,Linux 下编译时需要带上 –enable-memcache[=DIR] 选项,Window 下则在 php.ini 中去掉 php_memcache.dll 前边的注释符,使其可用。
除此之外,还有一种方法,可以避开扩展、重新编译所带来的麻烦,那就是直接使用 php-memcached-client。
本文选用第二种方式,虽然效率会比扩展库稍差一些,但问题不大。
四、PHP memcached 应用示例
首先 下载 memcached-client.php,在下载了 memcached-client.php 之后,就可以通过这个文件中的类“memcached”对 memcached 服务进行操作了。其实代码调用非常简单,主要会用到的方法有 add()、get()、replace() 和 delete(),方法说明如下:
add ($key, $val, $exp = 0)
往 memcached 中写入对象,$key 是对象的唯一标识符,$val 是写入的对象数据,$exp 为过期时间,单位为秒,默认为不限时间;
get ($key)
从 memcached 中获取对象数据,通过对象的唯一标识符 $key 获取;
replace ($key, $value, $exp=0)
使用 $value 替换 memcached 中标识符为 $key 的对象内容,参数与 add() 方法一样,只有 $key 对象存在的情况下才会起作用;
delete ($key, $time = 0)
删除 memcached 中标识符为 $key 的对象,$time 为可选参数,表示删除之前需要等待多长时间。
下面是一段简单的测试代码,代码中对标识符为 ‘mykey’ 的对象数据进行存取操作:
<pre>
<?php
// 包含 memcached 类文件
require_once(‘memcached-client.php’);
// 选项设置
$options = array(
’servers’ => array(‘192.168.1.1:11211′), //memcached 服务的地址、端口,可用多个数组元素表示多个 memcached 服务
‘debug’ => true, //是否打开 debug
‘compress_threshold’ => 10240, //超过多少字节的数据时进行压缩
‘persistant’ => false //是否使用持久连接
);
// 创建 memcached 对象实例
$mc = new memcached($options);
// 设置此脚本使用的唯一标识符
$key = ‘mykey’;
// 往 memcached 中写入对象
$mc->add($key, ’some random strings’);
$val = $mc->get($key);
echo “n”.str_pad(‘$mc->add() ’, 60, ‘_’).“n”;
var_dump($val);
// 替换已写入的对象数据值
$mc->replace($key, array(’some’=>‘haha’, ‘array’=>‘xxx’));
$val = $mc->get($key);
echo “n”.str_pad(‘$mc->replace() ’, 60, ‘_’).“n”;
var_dump($val);
// 删除 memcached 中的对象
$mc->delete($key);
$val = $mc->get($key);
echo “n”.str_pad(‘$mc->delete() ’, 60, ‘_’).“n”;
var_dump($val);
?>
</pre>
是不是很简单,在实际应用中,通常会把数据库查询的结果集保存到 memcached 中,下次访问时直接从 memcached 中获取,而不再做数据库查询操作,这样可以在很大程度上减轻数据库的负担。通常会将 SQL 语句 md5() 之后的值作为唯一标识符 key。下边是一个利用 memcached 来缓存数据库查询结果集的示例(此代码片段紧接上边的示例代码):
<?php
$sql = ‘SELECT * FROM users’;
$key = md5($sql); //memcached 对象标识符
if ( !($datas = $mc->get($key)) ) {
// 在 memcached 中未获取到缓存数据,则使用数据库查询获取记录集。
echo “n”.str_pad(‘Read datas from MySQL.’, 60, ‘_’).“n”;
$conn = mysql_connect(‘localhost’, ‘test’, ‘test’);
mysql_select_db(‘test’);
$result = mysql_query($sql);
while ($row = mysql_fetch_object($result))
$datas[] = $row;
// 将数据库中获取到的结果集数据保存到 memcached 中,以供下次访问时使用。
$mc->add($key, $datas);
} else {
echo “n”.str_pad(‘Read datas from memcached.’, 60, ‘_’).“n”;
}
var_dump($datas);
?>
可以看出,使用 memcached 之后,可以减少数据库连接、查询操作,数据库负载下来了,脚本的运行速度也提高了。
之前我曾经写过一篇名为《PHP 实现多服务器共享 SESSION 数据》文章,文中的 SESSION 是使用数据库保存的,在并发访问量大的时候,服务器的负载会很大,经常会超出 MySQL 最大连接数,利用 memcached,我们可以很好地解决这个问题,工作原理如下:
五、相关资源
前端时间玩了一下memcached,由于工作关系得过一段时间在玩它。哎,工作就是这样,老变!
libeven
memcached的使用需要libeven的支持,我们得先装上libeven。
官方网站:http://www.monkey.org/~provos/libevent/
下载地址:http://www.monkey.org/~provos/libevent-1.4.0-beta.tar.gz
libevent安装方式比较简单:
| 以下是代码片段: ./configure && make make install |
这样就好
检查如下:
| 以下是引用片段: [root@localhost memcached-1.2.2]# ls -l /usr/local/lib/ | grep even lrwxrwxrwx 1 root root 21 Nov 26 11:32 libevent-1.4.so.2 -> libevent-1.4.so.2.0.0 -rwxr-xr-x 1 root root 267334 Nov 26 11:32 libevent-1.4.so.2.0.0 -rw-r–r– 1 root root 351694 Nov 26 11:32 libevent.a lrwxrwxrwx 1 root root 26 Nov 26 11:32 libevent_core-1.4.so.2 -> libevent_core-1.4.so.2.0.0 -rwxr-xr-x 1 root root 101485 Nov 26 11:32 libevent_core-1.4.so.2.0.0 -rw-r–r– 1 root root 139080 Nov 26 11:32 libevent_core.a -rwxr-xr-x 1 root root 866 Nov 26 11:32 libevent_core.la lrwxrwxrwx 1 root root 26 Nov 26 11:32 libevent_core.so -> libevent_core-1.4.so.2.0.0 lrwxrwxrwx 1 root root 27 Nov 26 11:32 libevent_extra-1.4.so.2 -> libevent_extra-1.4.so.2.0.0 -rwxr-xr-x 1 root root 214596 Nov 26 11:32 libevent_extra-1.4.so.2.0.0 -rw-r–r– 1 root root 273270 Nov 26 11:32 libevent_extra.a -rwxr-xr-x 1 root root 873 Nov 26 11:32 libevent_extra.la lrwxrwxrwx 1 root root 27 Nov 26 11:32 libevent_extra.so -> libevent_extra-1.4.so.2.0.0 -rwxr-xr-x 1 root root 831 Nov 26 11:32 libevent.la lrwxrwxrwx 1 root root 21 Nov 26 11:32 libevent.so -> libevent-1.4.so.2.0.0 |
看见有很多libevent,就可以放心了。
memcached
官方网站:http://www.danga.com/memcached/download.bml
下载地址:http://www.danga.com/memcached/dist/memcached-1.2.2.tar.gz
memcached安装需要些参数:
| 以下是代码片段: ./configure –prefix=/usr/local/memcached –with-libevent=/usr/local make make install |
我们来运行看看:
运行:
| 以下是代码片段: /usr/local/memcached/bin/memcached -d -m 10 -p 11211 -u root |
结果:
| 以下是引用片段: [root@localhost memcached-1.2.2]# /usr/local/memcached/bin/memcached -d -m 10 -p 11211 -u root /usr/local/memcached/bin/memcached: error while loading shared libraries: libevent-1.4.so.2: cannot open shared object file: No such file or directory |
查找原因,解决方案如下:
| 以下是代码片段: LD_DEBUG=libs /usr/local/memcached/bin/memcached -v |
有如下显示:
| 以下是引用片段: [root@localhost memcached-1.2.2]# LD_DEBUG=libs /usr/local/memcached/bin/memcached -v 18999: find library=libevent-1.4.so.2 [0]; searching 18999: search cache=/etc/ld.so.cache 18999: search path=/lib/tls/i686/sse2:/lib/tls/i686:/lib/tls/sse2:/lib/tls:/lib/i686/sse2:/lib/i686:/lib/sse2:/lib:/usr/lib/tls/i686/sse2:/usr/lib/tls/i686:/usr/lib/tls/sse2:/usr/lib/tls:/usr/lib/i686/sse2:/usr/lib/i686:/usr/lib/sse2:/usr/lib (system search path) 18999: trying file=/lib/tls/i686/sse2/libevent-1.4.so.2 18999: trying file=/lib/tls/i686/libevent-1.4.so.2 18999: trying file=/lib/tls/sse2/libevent-1.4.so.2 18999: trying file=/lib/tls/libevent-1.4.so.2 18999: trying file=/lib/i686/sse2/libevent-1.4.so.2 18999: trying file=/lib/i686/libevent-1.4.so.2 18999: trying file=/lib/sse2/libevent-1.4.so.2 18999: trying file=/lib/libevent-1.4.so.2 18999: trying file=/usr/lib/tls/i686/sse2/libevent-1.4.so.2 18999: trying file=/usr/lib/tls/i686/libevent-1.4.so.2 18999: trying file=/usr/lib/tls/sse2/libevent-1.4.so.2 18999: trying file=/usr/lib/tls/libevent-1.4.so.2 18999: trying file=/usr/lib/i686/sse2/libevent-1.4.so.2 18999: trying file=/usr/lib/i686/libevent-1.4.so.2 18999: trying file=/usr/lib/sse2/libevent-1.4.so.2 18999: trying file=/usr/lib/libevent-1.4.so.2 18999: /usr/local/memcached/bin/memcached: error while loading shared libraries: libevent-1.4.so.2: cannot open shared object file: No such file or directory |
主要是看最后一行提示的错误,那么我们:
| 以下是代码片段: ln -s /usr/local/lib/libevent-1.4.so.2 /usr/lib/libevent-1.4.so.2 |
OK!再次运行:
| 以下是代码片段: /usr/local/memcached/bin/memcached -d -m 10 -p 11211 -u root |
成功!
貌似用“ldconfig”也可以解决这个问题
libmemcache
libmemcache是memcached C的客户端之一。我准备使用这个玩意。
官网:http://people.freebsd.org/~seanc/libmemcache/
下载:http://people.freebsd.org/~seanc/libmemcache/libmemcache-1.4.0.rc2.tar.bz2
编译:
| 以下是代码片段: ./configure make make install |
写一个有libmemcache函数的程序
然后
| 以下是代码片段: gcc a.c -o a.cgi -L/usr/local/include -lmemcache |
运行
| 以下是代码片段: ./a.cgi |
提示类似上面的“error while loading shared libraries”的错误,查了一下可用”ldconfig”解决这个问题,那上面的可否用这个命令解决呢?
上面的gcc编译的时候,带有参数“-lmemcache”。
-l参数后面跟的库名有规则的,库的命名方式有libxxxx.so或libxxxx.a,编译时要用-lxxxx就可以了。
而“-l”的意思就是代表是个“lib”了。
所以在你自己编写动态库或者静态库时,命名还是得按照 libxxxx.so的形式来。
不得不认为libmemcache有点糟糕,编译它自带的一个程序编译竟然有问题,很无语!
| 以下是引用片段: [root@login benchmark]# gcc benchmark.c -L/usr/local/include -lmemcache benchmark.c: In function `main’: benchmark.c:100: warning: passing arg 2 of `mc_set’ discards qualifiers from pointer target type benchmark.c:108: warning: passing arg 2 of `mc_set’ discards qualifiers from pointer target type benchmark.c:121: warning: passing arg 2 of `mc_req_add’ discards qualifiers from pointer target type benchmark.c:145: warning: passing arg 2 of `mc_delete’ discards qualifiers from pointer target type benchmark.c:153: warning: passing arg 2 of `mc_add’ discards qualifiers from pointer target type benchmark.c:167: warning: passing arg 2 of `mc_delete’ discards qualifiers from pointer target type |
解决方法:
找到passing arg 2这个参数的定义:
| 以下是引用片段: const char *key; |
把const去了:
| 以下是引用片段: char *key; |
这样就好了!
然后:
| 以下是代码片段: [root@login memcache-test]# ./a.out |
执行时可能报以下的错误:
| 以下是引用片段: ./a.out: error while loading shared libraries: libmemcache.so.0: cannot open shared object file: No such file or directory |
解决方法:
执行ldconfig命令即可!
附:
http://kapoc.blogdriver.com/kapoc/1200549.html
ldconfig命令 - - 动态链接库管理命令
为了让动态链接库为系统所共享,还需运行动态链接库的管理命令–ldconfig.此执行程序存放在/sbin目录下.
ldconfig命令的用途,主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如前介绍,lib*.so*),进而创建出动态装入程序(ld.so)所需的连接和缓存文件.缓存文件默认为/etc/ld.so.cache,此文件保存已排好序的动态链接库名字列表.
ldconfig通常在系统启动时运行,而当用户安装了一个新的动态链接库时,就需要手工运行这个命令.
注:使用起来很直观的东西,安装起来确实有点比较费劲。涉及到的名词比较多
1.Memcached分为服务器端和客户端,服务器端需要先安装Libevent,然后make install。需要一部额外操作ln -s /usr/local/lib/libevent-1.4.so.2 /usr/lib/libevent-1.4.so.2。 参考文章:http://yayu.org/look.php?id=105
2. 我用的是php5,memcache的客户端有两种,第一种是php的模块方式,第二种是php外部文件库方式。使用第二种相对比较简单,只要memcached的服务器跑起来了就没有问题。但是貌似性能会稍微差点,方法可以参考:http://nio.infor96.com/php-memcached/
3. 我在调通了第二种客户端方式以后,继续调php模块的方式,在这里可以下载http://pecl.php.net/package/memcache,为了省事,直接下载stable版本的memcache-2.2.3.tgz,结果反而都最后的最后,运行php.exe时,提示我说…(那句错误信息找不着了),总之就是加载memcache.so错误,查了半天,发现是一个bug,在最新的memcache-3.0.1.tgz 里已经修复了。注意,这个包也是需要make的,但是没有configure文件,怎么办呢,先之星phpize就可以生成那些编译信息了。然后
#./configure –with-apxs=/usr/local/apache/bin/apxs –enable-memcache 即可。
3. 一些使用技巧,参考Memcache的备忘
顺便把上面的提到的文章备份起来,省得以后失效了。
其他tip,顺便记下:
清空cache: echo ”flush_all” | nc localhost 11211
funy担心这些门户虽然人气搞,但是朋友关系都较弱,不具备开放平台的条件。我觉得,feed不管对于强关系还是弱关系,都多了一条特别便捷的扩展视野的方式。feed不仅是用来保持和好友紧密联系关系的方式,还是一个扩张关系的方式。Feed本身整合多元数据的能力,让了解朋友的成本变得很低。举例,sohu的好友,大部分我也不认识,交流也不多,但我也习惯看它的feed,也总能从feed里点出很多东西看。
另外,应用里更流行的一些just for fun的东西,这些东西,我觉得不管是什么好友关系,是从很信任的同学还是一个很普通的网友里看到的,不是那么重要。:)
本来传闻56打算转型做应用开发了。突然又复活了,还号称被火星人截获了 ,回到地球了。被某人知道这么影射他,又要找机会掐你一顿。
多少也算一件事,记录一下吧。
校内的官方开发者群组基本上都是开发者在支撑。官方只提供了java开发库,php是有钟士杰,ror开发库是有david提供的。现在倒好,霸王条款出来了,囚徒都没有困境了,就是把牢底坐穿了,我也不招。开发者走了,已久没有官方眷顾的开发者群组继续冷清,一些刚来的新手们,在里面嗷嗷待“辅”,也只能嗷嗷待嗷了。
这么放,MYOP很有做生态链的态度。要站长PV给他,开发者提供软硬件资源和创意,嵌个页面10%以内的广告,分给他。兵马未动,粮草先行。uch1.5还没发布,支持uch1.5的站点还没几个。但是无论从开发库,还是文档,getting started,Hello world… 都是很完善的。我把一个现有的app,转到myop,几分钟就搞定了。Myop用的也是和facebook类似的接口形式。(偶曾经说过,facebook的应用转到xn很难,因为要砍掉很多东西,找其他的实现方式,xn的app转到facebook很容易,转到myop也挺容易的。)
康盛真正开源的产品里,还是有不少追随者的,dz的hack版,虽然方式很不好。就算拿到一个人家贡献的很好的hack,要安装到自己的论坛里,都需要一遍重复的调试过程。相比之下,只要站长这边心态摆正了,myop这种方式,是一种复用性很高的方式。
好,经典的show me the money问题。目前按康盛的说法,貌似应用里的广告不超过10%都归开发者,框架外的归站长。康盛有这样的心态,等uch1.5发布以后,就算大牛david不出手,也会有大批虾兵蟹将上去鼓捣的。

都说08年,是开放年。
但是开放平台在中国貌似总走的不太顺利。之前的sohu,myspace就不扯了,说说最近大家比较关注的校内和51吧。
校内最早是王兴借鉴facebook的概念引入国内的,所以,开放平台在facebook这样的SNS上是很成功的,因为他们能提供应用成长的突然,病毒传播机制。其实病毒传播并不是贬义词,和流氓是两回事,是基于信任的好友关系的,有选择的传播。最近大家都在看校内和51,因为他们具备这样的土壤。
现在的态势很微妙,对博弈论不是很熟,但是尝试用它演绎一下,抛砖引玉。关于相关的理论知识,我也搞不清,大家自己去读股市。
开放平台和开发者群体的关系——智猪博弈:
(平台是小猪,开发者是大猪。做还是不做?)
理想的情况下是,开放平台和开发者按照一个公平的游戏规则合作,共赢。但是呢,在某些情况下,只有你一家可以用,那么你做不做。做吧,就按照我定的规则,虽然是不公平嘛,不做的话,你就一点都没得吃;做的话,你至少还有点饭吃。有一点是一点嘛,于是大家开始帮校内测试开始就很不稳定的接口,忍受接口持续变动的痛苦。
补充:即使这个过程中,校内特别不配合,对于开发者提出的很多问题,很少回应甚至不回应。api错了,文档错了,没有回应,最终有开发者自己乱试,试出那个参数应该那么写。这里类比的地方在于,本来这个接口应该双方一起完善的,(两只猪一起去踩踏板吃饭),但是因为环境形式,小猪校内不踩踏板,你们开发者这段时间也没有什么好玩的开放平台,你们要吃饭,就去踩踏板,帮我测试接口)
开发者群体之间的博弈——囚徒困境:
(开发者是囚徒,招还是不招,做还是不做)
囚徒们理想的情况下,都不招,最后都能得到最都的好处,判最少的刑,2年。但是在无法串供的情况下,自利的囚徒都招了,都被判了5年。
开发者们面对对自己极为不理的游戏规则,要是都不做,给平台谈条件,都有好处。但是现实中也不可能。我要是不做,别人要是去做呢,虽然游戏规则对我们很不利,但是,现做的总是有利,有先发优势的,于是。。。(都给我判5年),这里的两个囚徒是开发者中的个体。
瞎扯完毕,表扬一下51的康泰克,多可爱啊:
“放心,只要我在这里做一天事,我就不会容许这种事情发生的。”
“如果事情出了我的控制之外了,我会以死抗争的,呵呵:) ”

相关阅读:
校内开放api平台发布会及校内网开放平台开发者协议讨论(凌乱无整理版)
http://www.hainei.com/blog?r[0]=166724&r[1]=115253
校内为什么不能是百度和腾讯2nd ?李大维同学在国内白忙活
http://www.hainei.com/blog?r[0]=166740&r[1]=126439&fr=nf
签个卖身契至少有主人养,签了”校内网开放平台开发者协议”后呢?