新版本从底层到界面完全重写,优化了用户体验,颠覆了传统的dns管理平台,很多功能还在开发中,欢迎大家测试
目前新增加的功能有
1.大量采用了ajax,大量减少用户提交数据时刷新页面的等待时间
2.采用tag方式来展示用户的域名,根据域名的记录条数对域名进行加粗、改变颜色等醒目标记
3.输入一个域名自动判断是新域名需要添加还是旧域名直接进入管理
4.域名输入框采用ajax下拉菜单,用户只需要输入域名某几个字母即可自动填充整个域名。如输入pod自动显示dnspod.com/dnspod.net等带有pod的域名让用户选择
5.支持中文域名
6.支持NS记录
7.支持TXT记录
8.支持域名转出到别的帐号
9.支持域名记录的导出导入,方便批量添加和备份记录(开发中)
10.支持批量修改。如1.1.1.1这台服务器挂了,通过批量修改可以把域名下所有1.1.1.1的记录修改为2.2.2.2
11.支持单条记录的禁用
12.支持域名的自诊断(开发中)
13.还有很多很多新功能等你去发现
有关如何在64bit Mac OS X Leopard下面重新编译PHP并添加自己需要模块的文章请参考Leopard 编译 universal php5
重新编译后会出现一个问题:iconv无法编译进去。按照上文的方法,有些机器可以编译,但我的就死活不行。于是只能把iconv单独编译为so,再到php.ini里面添加。
$ cd php-5.2.5/ext/iconv/ $ phpize $ ./configure $ make && make install
然后编辑php.ini,先修改extension_dir为PHP扩展的路径,比如
; Directory in which the loadable extensions (modules) reside. extension_dir = "/usr/local/lib/php/extensions/no-debug-non-zts-20060613/"
再把iconv.so添加进去,如
extension=iconv.so
保存后再看一下php -m,iconv已经加载进去了
Sam@Bogon:~$ php -m [PHP Modules] apc ctype curl date dom filter gd hash http iconv json libxml mbstring mysql pcre PDO pdo_mysql pdo_sqlite posix Reflection session SimpleXML SPL SQLite standard tokenizer xml xmlreader xmlwriter zlib [Zend Modules] Sam@Bogon:~$
Time Capsule的备份速度非常让人诟病,特别是初次备份,如果数据特别大(像我,90G以上),可能花上一个星期也备份不完。虽然可以通过连接网线来提高速度,但效果非常不明显。
今天在国外的论坛上发现一个方法,可以让Time Capsule的速度接近外置硬盘的速度:
系统偏好设置-网络-当前的连接-高级-TCP/IP-更新DHCP租借时间
完成上面的步骤后,你会发现Time Machine的备份速度有极大的提升。
当然,好东西也有不好的一方面,这个方法是临时有效的。也就是说,过一段时间后必须重新进行上面的步骤。
Mac OS X Leopard下的文件权限改变比较大,经常会出现一些文件权限上的问题,比如使用权限修复时可能会出现下面的问题:
********** 2008-03-17 13:39:37 +0800: “磁盘工具”已启动。 2008-03-17 13:39:47 +0800: 正在修复“Macintosh HD”的权限 2008-03-17 13:44:25 +0800: 已找到 ACL,但它不是按期望的在“private/etc/apache2/extra/httpd-autoindex.conf”上。 2008-03-17 13:44:25 +0800: 已找到 ACL,但它不是按期望的在“private/etc/apache2/extra/httpd-dav.conf”上。 2008-03-17 13:44:25 +0800: 已找到 ACL,但它不是按期望的在“private/etc/apache2/extra/httpd-default.conf”上。 2008-03-17 13:44:25 +0800: 已找到 ACL,但它不是按期望的在“private/etc/apache2/extra/httpd-info.conf”上。 2008-03-17 13:44:25 +0800: 已找到 ACL,但它不是按期望的在“private/etc/apache2/extra/httpd-languages.conf”上。 2008-03-17 13:44:25 +0800: 已找到 ACL,但它不是按期望的在“private/etc/apache2/extra/httpd-manual.conf”上。 2008-03-17 13:44:25 +0800: 已找到 ACL,但它不是按期望的在“private/etc/apache2/extra/httpd-mpm.conf”上。 2008-03-17 13:44:25 +0800: 已找到 ACL,但它不是按期望的在“private/etc/apache2/extra/httpd-multilang-errordoc.conf”上。 2008-03-17 13:44:25 +0800: 已找到 ACL,但它不是按期望的在“private/etc/apache2/extra/httpd-ssl.conf”上。 2008-03-17 13:44:25 +0800: 已找到 ACL,但它不是按期望的在“private/etc/apache2/extra/httpd-userdir.conf”上。 2008-03-17 13:44:25 +0800: 已找到 ACL,但它不是按期望的在“private/etc/apache2/extra/httpd-vhosts.conf”上。 2008-03-17 13:44:25 +0800: 已找到 ACL,但它不是按期望的在“private/etc/apache2/extra”上。 2008-03-17 13:44:25 +0800: 已找到 ACL,但它不是按期望的在“private/etc/apache2/magic”上。 2008-03-17 13:44:25 +0800: 已找到 ACL,但它不是按期望的在“private/etc/apache2/mime.types”上。 2008-03-17 13:44:25 +0800: 已找到 ACL,但它不是按期望的在“private/etc/apache2/original/extra/httpd-autoindex.conf”上。 2008-03-17 13:44:25 +0800: 已找到 ACL,但它不是按期望的在“private/etc/apache2/original/extra/httpd-dav.conf”上。 2008-03-17 13:44:25 +0800: 已找到 ACL,但它不是按期望的在“private/etc/apache2/original/extra/httpd-default.conf”上。 2008-03-17 13:44:25 +0800: 已找到 ACL,但它不是按期望的在“private/etc/apache2/original/extra/httpd-info.conf”上。 2008-03-17 13:44:25 +0800: 已找到 ACL,但它不是按期望的在“private/etc/apache2/original/extra/httpd-languages.conf”上。 2008-03-17 13:44:25 +0800: 已找到 ACL,但它不是按期望的在“private/etc/apache2/original/extra/httpd-manual.conf”上。 2008-03-17 13:44:25 +0800: 已找到 ACL,但它不是按期望的在“private/etc/apache2/original/extra/httpd-mpm.conf”上。 2008-03-17 13:44:25 +0800: 已找到 ACL,但它不是按期望的在“private/etc/apache2/original/extra/httpd-multilang-errordoc.conf”上。 2008-03-17 13:44:25 +0800: 已找到 ACL,但它不是按期望的在“private/etc/apache2/original/extra/httpd-ssl.conf”上。 2008-03-17 13:44:25 +0800: 已找到 ACL,但它不是按期望的在“private/etc/apache2/original/extra/httpd-userdir.conf”上。 2008-03-17 13:44:25 +0800: 已找到 ACL,但它不是按期望的在“private/etc/apache2/original/extra/httpd-vhosts.conf”上。 2008-03-17 13:44:25 +0800: 已找到 ACL,但它不是按期望的在“private/etc/apache2/original/extra”上。 2008-03-17 13:44:25 +0800: 已找到 ACL,但它不是按期望的在“private/etc/apache2/original/httpd.conf”上。 2008-03-17 13:44:26 +0800: 已找到 ACL,但它不是按期望的在“private/etc/apache2/original”上。 2008-03-17 13:44:26 +0800: 已找到 ACL,但它不是按期望的在“private/etc/apache2/other/bonjour.conf”上。 2008-03-17 13:44:26 +0800: 已找到 ACL,但它不是按期望的在“private/etc/apache2/other/php5.conf”上。 2008-03-17 13:44:26 +0800: 已找到 ACL,但它不是按期望的在“private/etc/apache2/other”上。 2008-03-17 13:44:26 +0800: 已找到 ACL,但它不是按期望的在“private/etc/apache2/users”上。 2008-03-17 13:44:26 +0800: “private/etc/profile”上的权限不一致,应该是 -r--r--r-- ,却为 -rw-r--r-- 。 2008-03-17 13:45:25 +0800: 已找到 ACL,但它不是按期望的在“Applications”上。 2008-03-17 13:45:28 +0800: 已找到 ACL,但它不是按期望的在“Library”上。 2008-03-17 13:45:30 +0800: 2008-03-17 13:45:30 +0800: 完成权限修复 2008-03-17 13:45:30 +0800: 2008-03-17 13:45:30 +0800:
主要是ACL的问题,不管修复几次都会存在,挥之不去,相当噩梦.只要用下面的命令即可解决
chmod -RN /etc/apache2-R是递归,-N是删除所有ACL
另外细心的人都会发现,leopard下面的文件属性后面多了个@(以前最常见的是+),比如
drwxr-xr-x@ 6 Sam staff 204B 1 26 23:53 .subversion
这个符号代表这个目录或者文件带有扩展属性.一般情况下,这个问题要归功于Time Machine.
想要看一下@符号里面藏了什么东西,可以用下面的命令
ls -lh@Sam@Bogon-2:~$ ls -lh@ total 128 drwx------@ 28 Sam wheel 952B 3 17 13:38 . com.apple.metadata:_kTimeMachineNewestSnapshot 50B com.apple.metadata:_kTimeMachineOldestSnapshot 50B drwxr-xr-x 5 root admin 170B 3 15 18:56 .. -rw------- 1 Sam staff 5B 3 15 18:56 .CFUserTextEncoding -rw-r--r--@ 1 Sam staff 12K 3 17 14:15 .DS_Store com.apple.FinderInfo 32B drwx------ 2 Sam wheel 68B 3 17 14:10 .Trash -rw------- 1 Sam staff 6.2K 3 17 14:15 .bash_history drwx------@ 9 Sam wheel 306B 3 17 14:05 .gnupg com.apple.metadata:_kTimeMachineNewestSnapshot 50B com.apple.metadata:_kTimeMachineOldestSnapshot 50B -rw------- 1 Sam staff 35B 3 17 14:14 .lesshst -rwxr-----@ 1 Sam staff 177B 3 16 16:22 .login com.apple.TextEncoding 15B -rw------- 1 Sam wheel 119B 3 17 13:11 .mysql_history -rw-r--r--@ 1 Sam staff 741B 3 16 19:49 .profile com.apple.metadata:_kTimeMachineNewestSnapshot 50B com.apple.metadata:_kTimeMachineOldestSnapshot 50B drwx------@ 6 Sam staff 204B 2 29 13:29 .ssh com.apple.metadata:_kTimeMachineNewestSnapshot 50B com.apple.metadata:_kTimeMachineOldestSnapshot 50B drwxr-xr-x@ 6 Sam staff 204B 1 26 23:53 .subversion com.apple.metadata:_kTimeMachineNewestSnapshot 50B com.apple.metadata:_kTimeMachineOldestSnapshot 50B -rw------- 1 Sam staff 7.5K 3 17 13:33 .viminfo -rw-r--r--@ 1 Sam staff 41B 3 16 14:49 .vimrc com.apple.metadata:_kTimeMachineNewestSnapshot 50B com.apple.metadata:_kTimeMachineOldestSnapshot 50B ...
@符号的存在,没什么大碍.但如果你发现某天某个文件夹里面写不进去东西了,但用户/用户组的权限都正确,那么就要考虑清理ACL了.目前暂时还不知道这个BUG是如何造成的.
在半个月的等待后,新本本终于到货.
配置是定制的,屏幕换成了镜面.果然镜面的效果要好很多,就是会有点反光.
2.5G CPU,4G 内存,250G 硬盘,512M 显卡




“那是春秋时期,鲁国制定了一道法律,如果鲁国人在外国看见同胞被卖为奴婢,只要他们肯出钱把人赎回来,那么回到鲁国后,国家就会给他们以赔偿和奖励。这道法律执行了很多年,很多流落他乡的鲁国人因此得救,因此得以重返故国。”
“后来孔子有一个弟子叫子贡,他是一个很有钱地商人,他从国外赎回来了很多鲁国人,但却拒绝了国家的赔偿,因为他自认为不需要这笔钱,情愿为国分担赎人地负累。”
“但孔子却大骂子贡不止,说子贡此举伤天害理。祸害了无数落难的鲁国同胞。”
孔子说:世上万事,不过义、利二字而已,鲁国原先的法律,所求的不过是人们心中的一个‘义’字,只要大家看见落难的同胞时能生出側隐之心、只要他肯不怕麻烦去赎这个人、去把同胞带回国,那他就可以完成一件善举。事后国家会给他补尝和奖励。让这个行善举的人不会受到损失,而且得到大家的赞扬,长此以往,愿意做善事的人就会越来越多。所以这条法律是善法。”
“孔子还说,子贡的所作所为,固然让他为自己赢得了更高的赞扬,但是同时也拔高了大家对‘义’的要求。往后那些赎人之后去向国家要钱的人,不但可能再也得不到大家的称赞,甚至可能会被国人嘲笑,责问他们为什么不能像子贡一样为国分忧。圣人说,子贡此举是把‘义’和‘利’对立起来了,所以不但不是善事,反倒是最为可恶的恶行。”
自子贡之后,很多人就会对落难的同胞装做看不见了。因为他们不像子贡那么有钱,而且如果他们求国家给一点点补偿的话反而被人唾骂。很多鲁国人因此而不能返回故土。
原文地址:http://reinholdweber.com/?p=3
英文版权归Reinhold Weber所有,中译文作者yangyang(aka davidkoree)。双语版可用于非商业传播,但须注明英文版作者、版权信息,以及中译文作者。翻译水平有限,请广大PHPer指正。
1. If a method can be static, declare it static. Speed improvement is by a factor of 4. 如果一个方法可静态化,就对它做静态声明。速率可提升至4倍。
2. echo is faster than print. echo 比 print 快。
3. Use echo’s multiple parameters instead of string concatenation. 使用echo的多重参数(译注:指用逗号而不是句点)代替字符串连接。
4. Set the maxvalue for your for-loops before and not in the loop. 在执行for循环之前确定最大循环数,不要每循环一次都计算最大值。
5. Unset your variables to free memory, especially large arrays. 注销那些不用的变量尤其是大数组,以便释放内存。
6. Avoid magic like __get, __set, __autoload 尽量避免使用__get,__set,__autoload。
7. require_once() is expensive require_once()代价昂贵。
8. Use full paths in includes and requires, less time spent on resolving the OS paths. 在包含文件时使用完整路径,解析操作系统路径所需的时间会更少。
9. If you need to find out the time when the script started executing, $_SERVER[’REQUEST_TIME’] is preferred to time() 如果你想知道脚本开始执行(译注:即服务器端收到客户端请求)的时刻,使用$_SERVER[‘REQUEST_TIME’]要好于time()。
10. See if you can use strncasecmp, strpbrk and stripos instead of regex. 检查是否能用strncasecmp,strpbrk,stripos函数代替正则表达式完成相同功能。
11. str_replace is faster than preg_replace, but strtr is faster than str_replace by a factor of 4. str_replace函数比preg_replace函数快,但strtr函数的效率是str_replace函数的四倍。
12. If the function, such as string replacement function, accepts both arrays and single characters as arguments, and if your argument list is not too long, consider writing a few redundant replacement statements, passing one character at a time, instead of one line of code that accepts arrays as search and replace arguments. 如果一个字符串替换函数,可接受数组或字符作为参数,并且参数长度不太长,那么可以考虑额外写一段替换代码,使得每次传递参数是一个字符,而不是只写一行代码接受数组作为查询和替换的参数。
13. It’s better to use select statements than multi if, else if, statements. 使用选择分支语句(译注:即switch case)好于使用多个if,else if语句。
14. Error suppression with @ is very slow. 用@屏蔽错误消息的做法非常低效。
15. Turn on apache’s mod_deflate 打开apache的mod_deflate模块。
16. Close your database connections when you’re done with them. 数据库连接当使用完毕时应关掉。
17. $row[’id’] is 7 times faster than $row[id]. $row[‘id’]的效率是$row[id]的7倍。
18. Error messages are expensive. 错误消息代价昂贵。
19. Do not use functions inside of for loop, such as for ($x=0; $x < count($array); $x) The count() function gets called each time. 尽量不要在for循环中使用函数,比如for ($x=0; $x < count($array); $x)每循环一次都会调用count()函数。
20. Incrementing a local variable in a method is the fastest. Nearly the same as calling a local variable in a function. 在方法中递增局部变量,速度是最快的。几乎与在函数中调用局部变量的速度相当。
21. Incrementing a global variable is 2 times slow than a local var. 递增一个全局变量要比递增一个局部变量慢2倍。
22. Incrementing an object property (eg. $this->prop++) is 3 times slower than a local variable. 递增一个对象属性(如:$this->prop++)要比递增一个局部变量慢3倍。
23. Incrementing an undefined local variable is 9-10 times slower than a pre-initialized one. 递增一个未预定义的局部变量要比递增一个预定义的局部变量慢9至10倍。
24. Just declaring a global variable without using it in a function also slows things down (by about the same amount as incrementing a local var). PHP probably does a check to see if the global exists. 在一个函数里如果只声明一个全局变量而没在函数中调用它,同样会减慢速度(其程度相当于递增一个局部变量)。PHP很有可能会检查看是否存在全局变量。
25. Method invocation appears to be independent of the number of methods defined in the class because I added 10 more methods to the test class (before and after the test method) with no change in performance. 方法调用看来与类中定义的方法的数量无关,因为我(在测试方法之前和之后都)添加了10个方法,但性能上没有变化。
26. Methods in derived classes run faster than ones defined in the base class. 派生类中的方法运行起来要快于在基类中定义的同样的方法。
27. A function call with one parameter and an empty function body takes about the same time as doing 7-8 $localvar++ operations. A similar method call is of course about 15 $localvar++ operations. 调用带有一个参数的空函数,其花费的时间相当于执行7至8次的局部变量递增操作。类似的方法调用所花费的时间接近于15次的局部变量递增操作。
28. Surrounding your string by ‘ instead of ” will make things interpret a little faster since php looks for variables inside “…” but not inside ‘…’. Of course you can only do this when you don’t need to have variables in the string. 用单引号代替双引号来包含字符串,这样做会更快一些。因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会。当然,只有当你不需要在字符串中包含变量时才可以这么做。
29. When echoing strings it’s faster to separate them by comma instead of dot. Note: This only works with echo, which is a function that can take several strings as arguments. 输出多个字符串时,用逗号代替句点来分隔字符串,速度更快。注意:只有echo能这么做,它是一种可以把多个字符串当作参数的“函数”(译注:PHP手册中说echo是语言结构,不是真正的函数,故把函数加上了双引号)。
30. A PHP script will be served at least 2-10 times slower than a static HTML page by Apache. Try to use more static HTML pages and fewer scripts. Apache解析一个PHP脚本的时间要比解析一个静态HTML页面慢2至10倍。尽量多用静态HTML页面,少用脚本。
31. Your PHP scripts are recompiled every time unless the scripts are cached. Install a PHP caching product to typically increase performance by 25-100% by removing compile times. 除非脚本可以缓存,否则每次调用时都会重新编译一次。引入一套PHP缓存机制通常可以提升25%至100%的性能,以免除编译开销。
32. Cache as much as possible. Use memcached - memcached is a high-performance memory object caching system intended to speed up dynamic web applications by alleviating database load. OP code caches are useful so that your script does not have to be compiled on every request. 尽量做缓存,可使用memcached。memcached是一款高性能的内存对象缓存系统,可用来加速动态Web应用程序,减轻数据库负载。对运算码(OP code)的缓存很有用,使得脚本不必为每个请求做重新编译。
33. When working with strings and you need to check that the string is either of a certain length you’d understandably would want to use the strlen() function. This function is pretty quick since it’s operation does not perform any calculation but merely return the already known length of a string available in the zval structure (internal C struct used to store variables in PHP). However because strlen() is a function it is still somewhat slow because the function call requires several operations such as lowercase & hashtable lookup followed by the execution of said function. In some instance you can improve the speed of your code by using an isset() trick. 当操作字符串并需要检验其长度是否满足某种要求时,你想当然地会使用strlen()函数。此函数执行起来相当快,因为它不做任何计算,只返回在zval结构(C的内置数据结构,用于存储PHP变量)中存储的已知字符串长度。但是,由于strlen()是函数,多多少少会有些慢,因为函数调用会经过诸多步骤,如字母小写化(译注:指函数名小写化,PHP不区分函数名大小写)、哈希查找,会跟随被调用的函数一起执行。在某些情况下,你可以使用isset()技巧加速执行你的代码。
Ex.(举例如下)
if (strlen($foo) < 5) { echo “Foo is too short”; }
vs.(与下面的技巧做比较)
if (!isset($foo{5})) { echo “Foo is too short”; }
Calling isset() happens to be faster then strlen() because unlike strlen(), isset() is a language construct and not a function meaning that it’s execution does not require function lookups and lowercase. This means you have virtually no overhead on top of the actual code that determines the string’s length. 调用isset()恰巧比strlen()快,因为与后者不同的是,isset()作为一种语言结构,意味着它的执行不需要函数查找和字母小写化。也就是说,实际上在检验字符串长度的顶层代码中你没有花太多开销。
34. When incrementing or decrementing the value of the variable $i++ happens to be a tad slower then ++$i. This is something PHP specific and does not apply to other languages, so don’t go modifying your C or Java code thinking it’ll suddenly become faster, it won’t. ++$i happens to be faster in PHP because instead of 4 opcodes used for $i++ you only need 3. Post incrementation actually causes in the creation of a temporary var that is then incremented. While pre-incrementation increases the original value directly. This is one of the optimization that opcode optimized like Zend’s PHP optimizer. It is still a good idea to keep in mind since not all opcode optimizers perform this optimization and there are plenty of ISPs and servers running without an opcode optimizer. 当执行变量$i的递增或递减时,$i++会比++$i慢一些。这种差异是PHP特有的,并不适用于其他语言,所以请不要修改你的C或Java代码并指望它们能立即变快,没用的。++$i更快是因为它只需要3条指令(opcodes),$i++则需要4条指令。后置递增实际上会产生一个临时变量,这个临时变量随后被递增。而前置递增直接在原值上递增。这是最优化处理的一种,正如Zend的PHP优化器所作的那样。牢记这个优化处理不失为一个好主意,因为并不是所有的指令优化器都会做同样的优化处理,并且存在大量没有装配指令优化器的互联网服务提供商(ISPs)和服务器。
35. Not everything has to be OOP, often it is too much overhead, each method and object call consumes a lot of memory. 并不是事必面向对象(OOP),面向对象往往开销很大,每个方法和对象调用都会消耗很多内存。
36. Do not implement every data structure as a class, arrays are useful, too. 并非要用类实现所有的数据结构,数组也很有用。
37. Don’t split methods too much, think, which code you will really re-use. 不要把方法细分得过多,仔细想想你真正打算重用的是哪些代码?
38. You can always split the code of a method later, when needed. 当你需要时,你总能把代码分解成方法。
39. Make use of the countless predefined functions. 尽量采用大量的PHP内置函数。
40. If you have very time consuming functions in your code, consider writing them as C extensions. 如果在代码中存在大量耗时的函数,你可以考虑用C扩展的方式实现它们。
41. Profile your code. A profiler shows you, which parts of your code consumes how many time. The Xdebug debugger already contains a profiler. Profiling shows you the bottlenecks in overview. 评估检验(profile)你的代码。检验器会告诉你,代码的哪些部分消耗了多少时间。Xdebug调试器包含了检验程序,评估检验总体上可以显示出代码的瓶颈。
42. mod_gzip which is available as an Apache module compresses your data on the fly and can reduce the data to transfer up to 80%. mod_gzip可作为Apache模块,用来即时压缩你的数据,并可让数据传输量降低80%。
43. Excellent Article (http://phplens.com/lens/php-book/optimizing-debugging-php.php)about optimizing php by John Lim 另一篇优化PHP的精彩文章,由John Lim撰写。
整理文章整理出来的,很早时候caoz写的,翻出来备份
这里是一篇技术测试的文章,希望所有那些自称的和被人吹捧的技术高手来看一看,做做我们的几个测试,看看你属于那种层次的高手?
以下测试是针对oltp开发而言的,对于做算法和桌面程序的,不是我这里要讨论的对象。
好了,第一个考题:你能否做一个统计系统,功能上和易数差不多,能够通过页面嵌入方式记录一个网站的显示次数,来访分析,时段分析,日期分析等等。怎么,这就被难住了,那你算哪门子高手?啊哈,这位说了,这些都easy,手到擒来,很好,很好,看来在实现功能上,你具有了高手的基本能力,不过且慢,如果你认为可以实现这些功能就能自称做个易数统计出来,未免也太小瞧了技术这碗饭的分量,实现这些功能,就中国而言,至少有6位数的程序员可以作到,而设计这么一套系统(仅从功能考虑),也至少有5位数的程序员可以作到,明白吗?你不过是这里面平平常常的一个而已了,要高兴还早呢。
第二个考题:呵呵,其实还是做这些功能,不过加个条件,我只给你一台PC Server(单/双PIII 733+512M Ecc内存+18G SCSI硬盘),你要支撑300万/天的请求调用。琢磨琢磨吧。
简简单单的一个cgi+数据库,那是肯定死翘翘了,怎么办?
第一,你要建立三层体系模型,后台数据库必须通过中间应用层和前台CGI分开。
第二,合理分配使用共享内存空间,并合理通过IPC信号量防止内存区的读写冲突和死锁。
第三,必要时改写web server原代码以获得效率最优化,比如改写apache server的http_log.c程序并重新编译。
如果你对建立这么一套系统的整体架构非常清楚,那么恭喜,你可以在一个比较不错的网络公司做一个CTO了,中国能够清晰搭建这样系统的人,不过4位数而已(当然,能够在这样系统里进行编码工作的,肯定还是有5位数以上的,毕竟左右都是c语言而已)。
知道为什么层出不穷那么多统计系统,虽然功能花哨,但是最后都撑不过易数,基本功不扎实,光靠功能花哨,那是没前途的。
在这个领域做的比较好的,好耶,网易,adsunion,腾讯,太极链等几家而已。
那些所谓广告交换没什么技术瓶颈的人,自己做一套大并访系统出来再说话。
第三个考题,还是这些功能,(我够贫的是吧)我要你一天能记录下3000万次浏览日志,不但要统计,还要完整记录,以供随时查验,当然主机环境提升一下,处理数据的主机用集群,但是核心数据库还是用一台电脑的,这次用sun的小型机,比如RS6000什么的;还有这次再加个条件,数据损失不能超过 0.01%。
这个已经不再象建立一个网站了,到象是大型电信的计费中心。你能胜任吗?
这时候要求对整体操作系统,对C语言,对数据库核心都必须有深入骨髓的理解,甚至于,对于数据的导入导出和一些日志的数据库记录,你已经不能再用sql去写了!要利用数据库产品的核心接口按照其数据存储格式直接进行文件或设备块的读写操作!对于一些负载非常大而性能要求又非常高的系统,甚至你需要建立一套独立的数据库体系和数据结构体系。这不是玩笑,因为我领教过这样的系统。
在中国,能搭建这样平台的高手,最多3位数而已。主要集中在电信计费领域,如亚信这样的企业。
第四个考题,这次每天的请求不是3000万了,而是3万万,我没说胡话,3万万!不过你的工作变了,我不要你再做后面的数据处理,我只让你做一个前端报文转发处理,这次我很苛刻,给你一台PII的PC服务器,256M Ecc内存,而数据损失要求则绝对不能超过0.0001%,你的工作很简单,对来往的请求进行简单识别并转发到合适的应用服务器处理。
你用web server转发?别开玩笑了!这时候,你已经别无选择,用汇编自己写一套报文处理程序,作为看守进程驻入内存并挂在接收报文的端口上,你对效率的理解,应当已经超出了对操作系统的认识,对编程语言的认识,而直接达到对CPU指令集的认识程度上,是的,你必须清楚自己的每一条汇编指令是不是已经达到最小的 CPU指令占用。必须能计算出分解和处理一条报文的流程需要多少CPU指令循环,是不是已经针对CPU的指令集达到了最大优化,当然,你还必须很熟悉 TCP/IP协议对每一种报文的格式定义和规范,不过这和汇编指令的效率优化而言,到不显得有多高深了。
我们经常说CISCO是硬件产品服务商,错了!他们的利润主要就来自于这样的算法!!中国联想、华为等等都想强占这块肥肉的市场,但是在高端领域(其实并不是硬件高端,而是算法高端!),我们还是彻底的空白。
庆幸的是,我知道国内有人在做这样的事情了,当宽带不可避免的成为主流的时候,这种算法的强度和要求,会成为攫取利润的最好途径。
中国在这方面能达到标准的,又有几个人呢?
出了这四个考题,没别的意思,我刚大学毕业的时候,也是自视甚高,因为当时的感觉是,和专业课的计算机作业相比(我是力学专业的,动不动要求编程解一个偏微分方程的收敛解,来分析什么旋流场的速度、温度等的分布),做wewebb开发简直毫无算法可言。再加上当时国内做web数据库的也少,动辄以为自己已经是满高手了,结果幸好跑到给电信做计费的企业混了一年,接触了国内最大的电信集中计费中心的解决方案(一直在运营,还不错),才知道敢情OLTP应用里面学问大的很,自己这点皮毛拿出来吹嘘简直是不知天高地厚。现在看看外面一堆和我当初一样的小毛孩子整天做两个烂程序就自诩高手,只好出来说几句。
其实对于OLTP应用而言,功能的实现一般都非常容易,和那些从事力学、数学、物理等行业的数值计算相比简直毫无算法可言,而OLTP的技术难点主要在于性能,也就是你做一个桌面程序或算法程序,都不会面临并访过高的处理问题,但是做一个OLTP应用,无论如何你都必须直视一下子很多访问冲上来的情况,如果这个问题解决不了,无论多好的创意,多好的功能,都不会得到持续和长远的发展。
由于很多创业者和投资者对技术不通或半通,他们往往拿一个性能指标有很大缺陷的东东当个宝贝,因为一般而言,开发出新东东大家都只是忙着测试功能,很少有对性能进行完整测评的,只有持续运营到一定阶段,并访达到一定程度,性能缺陷开始暴露,才临急抱佛脚,这时候造成的损失就很不核算,甚至是压根解决不了,只好放弃某种功能,从而使品牌信誉整体下降。
加强算法基础,加强技术基础,少卖弄一些花里胡哨的东西,是走向技术高手的真正路线,那些今天学会了什么语言,明天又学会了什么语言的主儿,别吹嘘了,从70年代到现在,最值钱的程序员一直是写汇编和写标准C的,不为什么,因为这是真功夫。
—————————————————–
搜出来这个帖子,呵呵,稍微回复一下。
caoz早期也做过asp,中国最早的asp中文教程,是caoz翻译的,那是1998年的事情。但是后来(99年)换了php,不是因为asp不好,而是因为安全性,安全性的问题,根源在microsoft,这个和程序员没关系,但是程序员规避风险的话,还是linux下塌实一些,顺便说一下,caoz 在安全公司混过一年半的程序员。
asp和php相比,在某些应用的效率上,甚至更胜一筹,这个原因也不是语言的问题,而是本身系统的进程模式,Asp是线程模式,线程间的数据通信是非常简单的,写过asp的都知道,可以用application变量做,非常简单。而php在apache下只能是进程模式就麻烦很多,虽然也有共享内存支持,但是调用时候需要做信号量锁定,很麻烦,否则就有内存索引崩溃的危险。就进程间通信而言,asp不是略胜一筹的问题,而是拥有无可比拟的优势。
所以一个统计系统效率还还是不好,语言并不是决定因素,但是阿江有一点说的过了,一台服务器千万次的静态调用就达到极限?
caoz告诉你,在apache 下,caoz所能达到的数字是4000万次,而且是普通的服务器。
阿飞做过极限测试,单服务器最高的一天,统计量达到了3670万次(真实网络流量,不是测试机的模拟流量),单p4的机器,配置很一般的那种。当然这种极限测试不代表真正的应用环境,毕竟单用户和多用户对统计系统负载开销是不同的,但是单服务器在应用环境下每日支撑千万次以上的统计,却并非难事。关键不是看语言,而是看设计。cnzz可以做到,50bang也可以做到。
技术无止境,对比千兆的网络数据包分析工具(如千兆路由器,千兆IDS,千兆黑洞等),那种每秒解析上百万数据包变态应用,的现在的站点统计系统,日千万次处理简直是小儿科的东西。
不过说实话,国内统计系统技术依然有很大的提升空间,阿江的,caoz的,不外如此,处理效率上去只是一方面,分析能力提高也是很考验技术实力的。就这一点,caoz坦承,Google Analytics的数据挖掘能力,无可比拟,完全超越了caoz的技术理解力。当然,这是另一个话题了。
—————————————————
阿江的回帖
看了那个顶上了的贴,接受里面的一些批评,
我自己的观点也在实践中变化,我仔细的看过CNZZ的统计报告并对其统计方式进行了推断。
我的结论是,影响效率差异的主要因素并不在操作系统和WEB服务软件上,
而是在数据结构和程序结构上。
对于一次访问,51LA立即更新统计报告,保存统计报告,
而CNZZ则很傲能是追加访问记录,而在显示统计报告时检索汇总,或者每天还会把前一天的数据汇总后保存。
所以差异出现在这里:向数据库里追加行少数次 VS 更新数据库中指定的行多次
后者的效率明显要低的多。
虽然51LA在统计程序效率上有差距,
但是这种设计思路可以实现统计报告的完整、快速显示、翻页、排序、筛选,
这对很多站长是非常有用的,也是很多人喜欢51LA的原因。
这也正是我迟迟不肯使用承受力更强的新思路重写统计的原因。
另外,MSSQL数据库是一个库一个文件,而MYSQL是一个表一个文件,
这使MSSQL在磁盘操作上稍逊一筹,因为要处理的是大文件。
加上直接更新统计报告的统计方式增加了数据库操作次数,效率大打折扣。
写得很好的一篇文章,转过来保存
=====================
前言、你可以看完前言就把这篇文章扔到一边
《征途》=?假如你刚好没玩过《征途》,那么在本文开始之前,我认为你有必要先回忆一下脑海里对《征途》的印象。就我猜测,你可能想到的关键词大致包括这些:最昂贵的游戏,垃圾游戏,黑心的公司,史玉柱,道德的底限,游戏行业的搅局者……如果这猜测正确的话,那么我要说,大致在一个月前,我跟你的这些想法一样,——可能更甚。
但是,在接触了《征途》一个月后,我却得出了一个令自己都难以相信,难以接受的结论:我18年(今年24岁, 1989年6岁时开始接触FC,1990年7岁时开始接触黄海286电脑以及上面的游戏)来的游戏理念,以及近8年来在游戏行业工作的经验,——所有这一切,统统都被颠覆了。当我向身边一位朋友推荐《征途》时,我是这样说的:“《征途》是一款颠覆了现有游戏理念的东西,堪称‘心理学百科全书’+‘营销百科全书’,我在玩过《征途》之后,最大的感受就是这些年游戏全白玩了。”
——至此,如果你认为这是一篇枪稿,那么可以不看了。否则请继续。
一、不可忽视的《征途》理念
因为工作的关系,我看过许多公司的“《征途》研究报告”,也听过不少业内人士对《征途》的评价。但是这些研究和评价基本都是围绕《征途》的系统展开的,却忽略了《征途》最本质的东西,它的理念,以及它所颠覆的理念。我认为这和我们在制作、运营,乃至玩游戏的时候,很少去思考什么是游戏理念有关。
所谓游戏理念,在本文中的定义主要是指设计一款游戏的思想依据,包括:你认为一款游戏的意义何在?比如,日本某著名游戏制作人说:一款游戏如果不能折磨玩家几百个小时,那它简直不配称为游戏;游戏应该做成什么样?比如,Blizzard认为要让玩家在每一个阶段都能体验到乐趣,发现惊喜,循序渐进;它如何给人带来快乐、或者说你从种获得了什么样的快乐?比如,许多游戏公司都会不停的推出新系统、道具和内容;等等这些……
每家公司、每个人对游戏的理解和认识不同,导致了他们的游戏理念有极大的差距,也幸亏如此,才让游戏的类别和内容不至于千篇一律。但是在《征途》之前,对几乎所有游戏而言,有一点是同样的:所有游戏在设计时,都认为应该让玩家体验到包括收集装备、等级提升、技巧熟练等各方面的辛苦,使之在成长之后获得巨大的成就感。比如说极品装备的掉率通常低于1%,比如说一款网络游戏在没有外挂的前提下升满级需要半年,比如说若是没有高超的技巧就打不过强大的BOSS……诸如此类,不一而足。
但《征途》完全不是这样。
在《征途》中,等级的提升非常迅速,从1级升到10级甚至只需要二十几分钟。而在此后,通过完成住线任务、答题、每天限制参与次数的固定活动,几乎可以保证你在30级以前,等级像飞,——或许比飞还要快的增长。与此同时,当玩家打怪的时候几乎不用去操作,按下快键 Ctrl+Z,人物就会像开了外挂一样自动打怪,而怪物掉落的装备,可以用“一大片”、“半屏”甚至是“满屏”这些词来形容其数量之多,且所掉落的装备中包含大量付费道具,任务赠送的装备属性之好更是夸张,10级的任务赠送武器属性竟强过25级能买到的装备……如此等等,说也说不完。
以上,就是《征途》的理念所在:给予玩家最大的满足感,让你爽,并且向往花钱换来的更爽。但是,你是会不会因此觉得:一款游戏的等级、装备,所有的一切都能如此轻松的拥有,其乐趣何在?那么,让我以问答的形式来给你讲讲一个《征途》玩家,是如何一步一步体验到乐趣并着迷的。
二、看看人家《征途》是怎么研究玩家心理的
问题一,如前所说,但凡是个曾有游戏经验的玩家,在进入《征途》后只需要二十几分钟,就可以轻松升到10级,并且必然在10级前领到一把属性远比15级装备还优秀的武器。——那么假设你是这个玩家,当你在1级时候获得了一把10级可以使用的武器,你愿不愿意练到10级?
问题二,当你练到10级,已经了解了这款游戏的基本系统,并发现手中的武器在属性上远远好过15级武器,那么你愿意不愿意至少练到15级?
问题三,当你决定至少练到15级之后,你却惊讶的发现从10级到15级同样只需要不到一小时的时间,甚至于,你是在自己都还没反应过来的情况下,就莫名其妙的升到了20级。你愿意不愿意继续?
问题四,你觉得《征途》升级太快了,简直没有意思,但是这个时候你忽然发现,通过做主线任务,你竟然获得了几样要付费才能买到的道具。你会不会想,至少把这个付费道具用掉,然后再离开游戏?
问题五,你在做主线任务的时候发现,你完全不需要去官网或百度查资料,不用论坛发帖QQ求人等形式来知道这游戏该怎么玩,更不需要为了找到一个躲在角落的NPC而找上大半天,所有任务中提示你需要找到的NPC和怪物,名字下面都有一行下划线,就像网页的超连接一样,你只要点一下,就会自动找到他并完成任务。在打怪时,只要按一下Ctrl+Z,就可以实现自动打怪。你会不会因为这游戏简直太轻松了,觉得挂在上面让它自动打怪的同时,除了聊聊网页也无所谓?
问题六,不论是什么原因,总之你已经20级了,升级的速度稍微,——注意,是稍微慢了下来。至少不会让你Ctrl +Z打不了十分钟就升一级了,这个时候你应该已经通过任务拿到了比30级装备还好的武器,并完成了五行任务,获得了金、木、水、火、土中的某一种属性。你发现在你自动打怪的时候,身边有许多人在用同样的方法和你一起打怪,自然,像所有网络游戏那样,你们组队了。假设你们属性相合的话,你立刻获得了高达 300点的攻击力提升,杀怪如同切瓜。这个时候,由于你们不需要操作,所以你们的全部时间都在聊天,你们当然成为了朋友。那么,当你们成为了朋友之后,你会离开一款有朋友在玩的游戏么?
问题七,在你20级之前,你会发现NPC将你引导到皇城的公告牌,——确切的说,是一个叫智者的NPC旁边。这个 NPC的作用是,你可以消费一定数量的游戏币,来回答她所提出的20道问题,并获得数倍于打怪的经验,甚至可以一次升2级。这个时候,你会不会发现其实这游戏有点乐趣?
问题八,你终于决定,——好吧,事实上是在你做出决定之前,你已经又一次莫名其妙的就升了10级。当你30级的时候,你发现你可以骑马了,很威风;你发现自己在一分钱没花的情况下,仓库里存了一堆要花钱才能买到的道具,仿佛赚到了;你发现自己已经穿着一身通过打怪就轻松获得的,属性很好的装备;你发现由于之前组队的缘故,你的朋友已经有好几个了;你还发现10级的时候系统曾送给过你一个替身宝宝,你清楚的知道把它变为等待领养状态后,即便你下线了,当你再次登陆的时候也很可能已经到了35级。如果这个时候让你放弃《征途》,你会不会有一点不舍得?
问题九,你还会发现,如果现在你充10元点券,NPC会送你许多珍贵的道具,并且差不多你每升几级,NPC还会再返还给你点券。简单点说,可能你在30级时花了10元钱,但等到50级的时候,你却一共获得了价值200元的道具。那么,假如你在问题八的时候就已经决定再多玩一会,你愿意不愿意尝试性的付出10元钱?——当然不付也没关系,因为后面有的是地方让你心甘情愿的掏钱。
问题十,你就这样,几乎毫不费力的在很短时间内到50级了,假如你已经付过费了,你几乎一定会玩下去。但假如你没付过费,并依旧觉得这游戏很垃圾,想离开,那也没关系,因为这时候你会发现,许多高级别的玩家以低于官方的价格收购某些付费道具,——而这些道具,你几乎一定拥有。那么你很轻松的利用《征途》赚了一小笔钱,这个时候,你是否重新觉得这游戏值得玩下去?
问题先到此为止吧,在那以后,你还会见识到许多类似的诱惑,比如你刚杀完一个玩家,忽然发现屏幕上显示出你的名字:“你杀死了谁谁谁”并且全服务器的人都能看到,这个时候你是否觉得太有成就感了?但我恐怕你在到达那一步之前,已经开始欲罢不能了。
当你在内心深处默默回答完以上全部问题之后,你可能依然觉得:“不就是就快速度让你达到一个离不开游戏的临界点么?很多游戏都这么做啊。”又或者,“我认为大多数玩家对这些不会有兴趣,看到《征途》两个字我就恶心,不想去玩,所以你这些话白说。”——那么,《征途》今天的100万峰值在线怎么来的?——让我来告诉你。
三、看看人家《征途》是如何结合游戏特色来做宣传的
《征途》的宣传上,最大的看点其实不是它长年在各大媒体的首页“新闻推荐栏目”里,把同样一个内容车轱辘话来回说。而是其别出心裁的市场活动。
《征途》曾做过比如“发工资”,“迷宫”等等许多市场活动……但是这些活动不是我要谈的重点。我要谈的重点是:《征途》做过两个让我把下巴惊到了地上的,史无前例的,革命性的,并且与游戏特色紧密结合的活动,——谁也抄不走的活动。
让我们先从时间上离我们比较近的活动一说起,不久前《征途》做了一个让玩家“练到60级,如果说《征途》不好玩就能获得赔款”的活动。这个活动的绝妙之处在于,——假如你认真看了第二节的十个问题就会发现,一个玩家如果练到了60级,他几乎没有可能再离开《征途》,即便他认为这游戏垃圾。并且,即便他离开了也没关系,《征途》只会赔给他15元钱,中国玩家现在还没齐心到能十几万人一起练到60级然后集体不玩的地步,而且未来也不可能齐心到这地步。
而纵观目前国内市场上,还没有哪一款游戏能在初期如此“溺爱”着玩家,任谁把这个活动抄走都没有意义,——因为他们的游戏,玩家绝不可能被牵着鼻子一步一步走到欲罢不能的地步。简而言之,他们在许多地方抄《征途》,但抄都抄不像!
于此,我可以给大家举个实例,我有个在代理型游戏公司做市场的朋友,在游戏公测时邀请了一批《征途》用户来试玩,《征途》的玩家问我的朋友:“你们游戏可以不打怪升级么?”朋友说:“不能。”《征途》的玩家直接扔下“垃圾”两个字就走人了。——这就是说,进一步讲,玩家不但很容易就因为抵挡不了诱惑而留在《征途》里,更会在习惯了《征途》的玩法之后,玩不惯其他任何游戏。《征途》玩家的忠诚度之高,让其他游戏望尘莫及,——当然这是题外话,暂且不谈。
另一个《征途》经典的活动发生在很早以前,活动的名字叫做“乾坤倒转”。活动的内容是:让原本极其强大的BOSS 变的弱小无比,随便你杀,而原本弱小无比的怪物却能力翻了数十倍,让你望而生畏。这个活动的妙处在于,让所有新进入游戏的玩家,都能在最短的时间内了解到游戏的后期内容!
一个玩家能在最短的时间内了解到游戏的后期内容有什么用?当然有用。为什么今天网络游戏市场上这么多网络游戏,在玩家连游戏的影子都还没见到的时候,就开始宣传游戏的60级装备,100级装备?为什么游戏策划,公司老总在接受采访的时候,张口闭口先谈这游戏未来的发展计划?因为这是典型的望梅止渴,让你看到了后期的甜头,你才乐意在在“苦尽”之前期盼“甘来”!
但问题是,几乎所有游戏公司,在展现自己后期内容的时候,都是用说的、用吹的、用看的,只有,——注意,是只有《征途》,是用做的,真真切切的让你在十几级的时候就能跟几十、甚至100级过后才能遇到的怪物交上手!耳听为虚,眼见才为实!好了,当你十几级的时候就体验到了这个游戏的最终内容,知道了如何杀他们,你会不留下来么?你一定会留下来!
这样一个活动,市场上有哪家游戏公司敢做么?没有。为什么没有?因为他们把极品装备看得太重要了,看作几乎是玩家会留在游戏中的唯一理由,他们如果让一个玩家在进入几个小时以后就能打最终的BOSS,玩家拿到了极品装备之后还能干嘛?这游戏没内容可玩了,或者,游戏的经济体系被摧毁了!
但是,《征途》不怕,《征途》的游戏理念就是让玩家爽,它吸引玩家继续下去的动力不在于此,玩家越早拿到这些极品装备,他们就越早上瘾,越早上瘾也就越忠诚,越忠诚也就付越多的钱!那征途靠什么吸引吸引玩家在拿到好装备之后还乐意留下来?
四、看人家《征途》是如何做运营的
不用费时间去猜了,我直接给你揭开谜底,靠的是PK,靠的是万人级别的国战!
这里不得不再次提到《征途》的又一个理念。玩家停留在一款网络游戏里,——注意,是网络游戏里,做得最多的事情是什么?收集装备?——作为一款网络游戏来说,只要它能保证更新速度,那么装备你永远是收集不完的。升级?——不用说《征途》了,从《石器时代》开始,就有转生系统,你能一次练满就让你练两次,你能第二次练满就让你练三次……打怪?——怪物也是打不完的。
好了,谜底是:是人与人的互动!人与人的互动就目前我们所能知道的范围而言,包括哪些?以上提到的收集装备、升级、打怪,——只要你没到把网络游戏当单机玩的份上,其实这些就都算人与人互动的形式。除此以外,就是聊天交友、PK、国战这些系统。
换句话说,只要我把人与人的互动这一环节做好了,我不怕你一进入游戏就拿到了所有顶级装备、杀掉了所有的怪、升满了级,——我版本更新就好了,我是自主研发型的公司,我有代理游戏所无法比拟的更新速度、反应速度!那么《征途》的人与人的互动是怎么做的?交友、装备收集等环节前面说过了,不再多谈。咱们只说,《征途》的PK系统和国战系统有多完美?以至于能让玩家乐此不彼?
——我的回答可能会让你有些失望。以我目前对《征途》的接触来说,还没到能去跟人PK,参加国战,然后跟你滔滔不绝的讲述其平衡性的地步。但是,我想说的是,即便《征途》的PK系统和国战系统做得垃圾无比也没关系,因为《征途》以其对游戏独特的理解,巧妙的通过一些系统外延的设置和运营手法,回避了游戏自身的不足。
比如说PK系统。在所有骂《征途》的文章里,都说《征途》是一款鼓励PK,且PK系统极端不平衡的游戏,——即,不花钱的玩家一定打不过人民币战士,于是玩家会出于报复心理去砸钱报仇。但这绝对是无稽之谈。
因为,每一个玩家在进入游戏之初,《征途》会让玩家选择一个国家,同国家的玩家之间如果出现恶意PK,其对PK的惩罚是非常严重的!也就是说,《征途》虽然鼓励PK,但不鼓励同国家玩家间的PK,这一个巧妙的设置,就使得几乎所有的个人和小团体冲突,都只会发生在两个或多个不同国家之间。而此外《征途》还有一个设置,当两国玩家发生PK行为时,两国其他所有的玩家,都会在屏幕上看到自己国家有人正遭到攻击!
好了,更绝妙的设置来了:由于每个国家的玩家在PK外国外家时,都会为本国增长贡献度,获得荣誉,所以人民币玩家会自觉自愿的保护本国非人民币玩家,以及,因为每个玩家几乎是在10多级的时候,就几乎一定会有几个朋友。所以,最后的结果就是:《征途》中几乎每一次个人间的PK,基本都会在最短时间内演变成小团体之间的对抗。并且,人民币战士自愿的保护非人民币玩家,——他们可以从中获得当老大,罩人的满足感。而非人民币玩家依旧在不花一分钱的情况下报了仇!
——如果你觉得《征途》以上的设置简直稀松平常,那么我们再来看《征途》的国战系统。首先说,史玉柱为什么要做 2D游戏?因为2D游戏竞争没有3D激烈么?不是!正确答案是,就目前国内的普遍机器配置和网络环境而言,你说说看有没有一款3D游戏能开展万人国战? ——我来告诉你一个数字,市场上绝大多数网络游戏,一组服务器别说万人同时打仗了,能承载5000人在线就算不错了!
你是否会说:“《征途》的万人国战也是在吹,未必真有那么多人”?或者说:“即便《征途》国战真能同时有1万人参与吧,但是随着网络环境和硬件水平的进步,3D游戏能容纳这么多人也是迟早的事情。”没错,就是你说的这么一个道理。但还有个问题无法解决:多个国家之间,人民币战士的数量不同,或者势力分布不均匀,等等因素导致某一个势力独大,其他势力混不下去了,怎么办?
没法办,几乎所有网络游戏中的团队在面临这样情况的时候,只有三个选择:其一、离开游戏。其二、继续被蹂躏,—— 最终也还是离开游戏。其三、换个服务器。好,你可以换个服务器,但你重新获得原有的等级、装备,你投入的时间和财富怎么办?再进一步讲,换了服务器就一定能轮到你当老大了?如果不能呢?
我在等着你反问我:“照你这么说,《征途》里不可能存在这样的情况,它的国战系统世界第一是么?”然后我想告诉你,不是,《征途》的国战系统同样无法解决这个问题。但《征途》的运营手法高明!《征途》每天开一组新服,合并两组老服!开服、合服能解决国战造成的玩家流失问题?不是开玩笑吧?——你有这样的想法毫不希奇。在《征途》最早用这种手法的时候,史玉柱可是被业界内外所有人一起嘲笑呢!为啥?让我们先从网络游戏为什么要开新服说起,——别以为这个事情多简单,你真未必懂呢!
早期的国内市场,开新服是一种单纯的供求关系,即,当服务器的承载量不能容纳更多人了,但还有许多新玩家要进入的时候,游戏公司必然要增加服务器来满足市场需求,——当时,增开服务器的标准是,一组服务器的承载量到达70%的时候。随后,2003年盛大率先在服务器承载30%的情况下开新服,为什么?因为当时国内的代理型公司要指望从经销商手里扎钱,经销商判断该付给一家代理公司多少钱的依据,是其在线,而由于经销商无法得知一款游戏的真实在线,所以往往会依据其服务器组数判断人数!明白了吧?服务器开得越多,扎到的钱就越多!
至此,我想你也就明白了史玉柱不停开新服会招到大家鄙视和耻笑的原因,至少是原因之一。鄙视史玉柱,是因为都 2006年了,居然史玉柱还在用这样下三烂的招数!耻笑史玉柱,是因为觉得他连骗钱都不会,你每开一组新服就合两组老服,——服务器总量没增加呀!这不是自己扇自己嘴巴玩么?但是,有谁想过,以史玉柱的身家,他用得着骗经销商那区区几百万、一千万么?有谁料到,人家史玉柱开服合服压根就不是做给外人看的!而是在解决国战造成的玩家流失问题!
开一组新服所能起到的作用是什么?新用户的进入和旧服务器老用户的分流!——新用户当然想在一个公平的环境里开始游戏,老用户在旧服混不下去了,去新服反正用不了多久就又能满级并有好装备,值当是练小号了,我怕啥?那老服务器的人都被分流了,剩下一批人民币战士杀谁去?没关系,我合并服务器啊!有另一个服务器的另一批人民币战士跟你打!绝对不愁你没事干!
看,多高明!一举两得同时解决了开源节流两大难题!你其他游戏还学不来!为什么?因为你的游戏用户换服务器成本太高了!你国战系统只要做得不好,用户就是走,没话说。我就没关系,国战系统不好我可慢慢改进,用户一个都不会少!什么叫“用运营手段来弥补产品的不足”? ——这句话中国的游戏公司喊了几年了,但真正做到史玉柱这份上的,没几个吧?
到此,我相信你如果不是抱着抬杠的心态来看我的文章,应该已经开始佩服史玉柱和他的征途了吧?但我知道你还有一个疑问:“好吧,就算《征途》真的不是像以前我们误解的那样,游戏垃圾,运营手法低劣,消费昂贵。但是你给我解释解释,《征途》的付费道具全都可以打到,《征途》的极品装备泛滥,《征途》的免费用户可以用低于官方的价格把装备卖给人民币战士赚钱,——那他史玉柱怎么赢利?他总不是搞慈善事业的,每天看着一批人赚另一批人的钱就开心吧?”
我正等着你问这句呢,所以接下来我要讲的就是,你看看人家《征途》是怎么搞销售的!
五、看人家《征途》是如何销售的
之所以你会有刚才的疑问,就是因为你的思路还停留在以往游戏的收费模式上:“我付费道具能让你打到了,我赚什么钱?”人家史玉柱可不是这么考虑问题的!咱们还是先来个问答题,——不过这次我会告诉你答案。
问题一,你玩一款道具付费的网络游戏,想花钱了,这时候你不知道买什么更好,你会怎么办?你会说:“很简单啊,我官网查资料啊!”——那你至少是中级用户。“我挨个买了试啊!”——那你是有钱人。但是,对于一个钱数很有限的学生,而它又是初级用户,他怎么办?答案只有一个,我不买了!不买玩不下去怎么办?没办法,您只能离开游戏。
但《征途》怎么做的呢?前面说了,所有付费道具任务里我都给过你,你也打到过,你不用查资料不用问人不用挨个试,就知道他们都有什么用。好了,你会不会留下来?你会不会当你急需一个道具,而又打不到的时候来买我官方的道具?——“你前文不是说了可以从低级玩家那里买么?”
没错,但别忘了那是《征途》吸引他们留下来的手段,一旦他们因此决定留下来,那么他们的付费道具也不够,怎么办?只好大家一起买官方的道具。之前玩家间的买卖行为,直当是我史玉柱让利了!亏的利润怎么补回来?
——嘿嘿,我官方道具可卖的贵啊!你回一次城都得1块钱(随意举例,价钱不是实际数字)呢!但是,这1块钱你觉得花得值!为什么?因为你已经爱上这款游戏了。
问题二,你玩一款网络游戏,你要砸装备,合成石(按不同游戏可能叫精练石、宝石等等……)是要花钱买的,而从武器 1级升2级的时候就有一定几率会失败,这一设置的理念在于:让你为了有好武器,尽可能多的花钱。但这个看上去合理的设置,实际效果如何呢?——当你得知这个设计以后,如果你钱不富裕的话,你会自己砸装备么?不会,你肯定会选择从其他玩家手里买成品,也就是说,厂商设置的初衷是赚更多的钱,但实际上“更多” 的一部分被用户赚走了!
《征途》是怎么做的呢?我的武器保证你的一定级别以前的成功率是100%!——这个其实在许多游戏里都有的设置,却从没有像在《征途》里这样发挥一举两得的作用!具体来说,其他的游戏武器一共只能升10级,每一级都有可能失败,于是玩家不买了。但《征途》虽然在一定级别,——比如武器10级(随意举例的数字,非真实数据)以前合成的成功率是100%,但我武器可能要升30级(随意举例的数字,非真实数据)才升满!好了,现在你是一个玩家,首先,你的武器升到10级这个过程中,我确保你已经把之前积攒的所有合成石都用掉了,而你又知道这武器还能继续升级,你会怎么做?
做法一,我不乐意花钱,我10级武器凑合用了。没问题,你会留下来,因为这武器足够你用了,不会让你因为没花钱而玩不下去,造成用户流失。
做法二,我花钱买合成石总行了吧?但是和你同级别的玩家他们合成石也都用了!你只能从官方这里买。——还是老问题,“那我从低级玩家那里买不行么?”行,两种可能:可能一,他一定是不想玩了,所以才把东西卖给你,我损失了他这样一个本来就不可能属于我的用户,那没关系,因为他本就不属于我,何况我留下了你这个摇摆不定的用户。——甚至有可能,因为这次买卖他也留了下来;可能二,就像前面说的那样,你根本买不到!
你看,什么叫买的没有卖的精?《征途》怎么亏都不是真亏!你怎么赚都不是真赚!
两个例子,我想已经够了。一点细微的改变就足以看出《征途》与其他游戏之间天壤之别的理念差距:以往的网络游戏是让你不花钱就不爽到玩不下去,逼着你花钱。而征途是让你在爽到一定境界的基础上,给你描绘一个爽上加爽的境界,诱惑你心甘情愿的花钱!——这个改变,堪比说把对饭馆偷税漏行为的惩罚,改变成对依法上税的奖励!一奖一罚,层次的高低暴露无疑。
除此以外,《征途》还有许多销售外延的系统,比如说股票系统,房屋系统。在此就不一一列举了。总之,通过游戏设计理念、与游戏设计紧密相连的宣传、高明的运营手法、逆相思维的销售思路,《征途》构建出了一个如他所说那样的,其乐融融的“和谐社会”:新玩家容易进来,老玩家不容易流失,本国间没有恩怨,PK时人民币战士捍卫免费玩家的利益,不花钱可以玩的挺爽,升级、装备收集都很轻松。
但这还不是结束的时候,因为我很想再给你讲讲我接触《征途》后的一些思考,比如:是不是在史玉柱之前,从来没有人想到过这些理念和方法?——肯定不是。那么为什么只有《征途》才能做出这样一套系统来?今后类《征途》的游戏有没有生存空间?……等等这些。
六、史玉柱就算不是骨灰玩家,也顶级的老板
关于我的思考,先要从一款游戏在开发过程中最重要的环节,——策划部分说起。首先我一直有这样一个观点:策划这个职位在国内的企业环境中是非常尴尬的!因为策划是一种带有决策性质的工作,——没有一个既定的决策,就无法策划,策划了方案但不能决策,再好的策划案也是废纸。但策划这一职位却偏偏被放在了执行层里,——在一家研发型的企业,如果策划被归属到执行层是很可怕的。
可怕在哪里?试想一下,一个策划辛苦的想出了某个方案,当他拿着方案与市场进行讨论的时候,市场部的人说这东西用户不会喜欢,——尽管市场部的人可能没有调查就枉下结论,但你没有办法。当他拿给技术部的时候,技术部说这个实现不了,——即便他懂技术也不行,人家跟他平级为什么要听命于他?当他拿给老板看的时候更简单,——老板说我不喜欢这个方案。作为一个策划,怎么办?没办法。
甚至于,在策划部门内部,处于非领导位置的策划人员沟通成本也是很高的。试想一下,在《征途》之前假如我现在是一个研发策划,我跟你说:“咱们这个游戏的收费道具应该能打怪掉落。”你会怎么想?我希望你别在看完这篇文章之后回答我说:“废话,肯定要这样!”而是好好想一想,当初业内多少“精英”在骂《征途》的设计傻X?这才是真正的答案。
这就是说,在中国,一个领先于市场的创意诞生之后,如果想被实现出来,——注意,我还要说一遍,是在中国,老板的好坏很重要。
要么,这个创意是属于老板的,比如史玉柱一拍桌子说我现在就要让付费道具都可以被玩家打到,认为我傻X的滚蛋,——那么尽管当时大家认为史玉柱是傻X,但依然还得说老板英明并照着做,最后事实无情的告诉我们史玉柱其实一点也不傻,比猴子都精。
要么,这个老板懂行,或者不懂行但肯听取策划的意见,并能做出正确的判断,协助他把策划实现。于此我听说过一点关于史玉柱的传闻,据说他在也不是自己哪家企业倒闭的时候,拿个本拿根笔坐在会议室里,虚心接受全公司人的批评,一言不发,就是默默的把大家提出的批评记下来。——中国如果多几个这样的老板,我不信世界上最优秀的游戏公司是美国的暴雪。
好了,《征途》之前,即使有国产游戏做得不错,在线也很高,但为什么这些游戏都没能如《征途》一样,做出颠覆以往游戏、运营和销售理念的产品来?我认为原因主要有几方面:
其一、行业环境。我们知道中国的网络游戏起步相对较晚,中前期整个行业几乎都是有代理型公司和经销商所构成的,这就是说,你也许有想法,但你无法实现。
其二、中国的企业机制很难让员工把才能发挥出来,在中国的大多数企业里,其实不存在真正意义上的策划,往往一个公司的兴衰,一个产品的走向往往是老板个人英雄主义的结果。于此前文说了,不再重复。
其三、中国的企业在很长一段时间内过于轻视专业人才。暴雪为什么做的游戏好?至少有一个原因是,暴雪对所招聘员工的第一条要求是:你必须玩游戏,而且必须游戏玩的不错。反观中国一些游戏公司,还没走向纳斯达克呢,就必须西装革履、没文凭不要了。——我不否认高学历人群的素质和能力,也不认为游戏玩的好就一定游戏做得好,但术也有专攻,一个连扫雷都没接触过,卖草鞋倒主肉发家的土财主跑来投资网络游戏,领导游戏公司的研发和运营,其结果应该是有目共睹的。这就是说,至少专业水准的游戏玩家,在业内应占有一定的分量。所谓的外行人管内行人是对现象的描述,而非事情成功的原因所在,——成功的根本在于,外行人管内行人的过程中,您得慢慢转变成内行。
鉴于以上,我认为《征途》的成功绝非偶然,史玉柱能把游戏玩家的心理把握的如此精确,他如果不是顶级的骨灰玩家,至少是顶级的老板之一。
又说了这么多,仿佛都在谈老板。那么员工呢?真的就对这个行业毫无用处了么?当然也不是。
七、我们把话题说回游戏理念去
这就要有把话说回去。当初为什么大家会认为《征途》垃圾?——好吧,我承认今天,即使我写了这篇文章,并且你一句一字的认真读到这里,你可能依然觉得《征途》垃圾。这又跟我们的游戏理念有关。我说过,在《征途》之前,肯定早有人想到过类似的游戏设计理念。但是第一,这一定是极少数。第二,他无法实现这种想法。第三,他们会被视为小白甚至傻X。
这一切问题的根源就在于,如同开篇所说:对几乎所有游戏而言……都认为应该让玩家体验到包括收集装备、等级提升、技巧熟练等各方面的辛苦,使之在成长之后获得巨大的成就感。这一理念也为当今绝大多数玩家所认可。
但实际上,这个理念是属于谁的?属于你么?不属于。这个理念是欧美、日本游戏的理念。中国,——尤其大陆地区的游戏研发史短的可怜,而且前期、中期,——好吧,包括现在的作品还是效仿成分居多,原创内容较少。大家都是被欧美、日本游戏灌溉着成长起来的,因而很多人理所当然的认为这就是唯一正确的游戏理念,一款游戏不这样设计就不配叫作游戏。
这个“理所当然”是非常可怕的。我不知道有多少人在玩一款游戏的时候,——比如我现在玩《怪物猎人2》(PSP游戏),这游戏非常难,对ACT类游戏新手来说,被某个怪卡上十天半个月那是相当正常的情况,——他们是否想过,为什么游戏一定要这么难,才会在打败怪物之后获得乐趣?没错,高难度带来的是高成就感。但高成就感是否就等于除此以外再无别的乐趣?——这个问题先放在这里,我们稍后再谈。
我现在要说的是,因为我们是在欧美、日韩游戏灌溉下成长起来的,所以我们大多数的游戏制作者在制作游戏的时候往往就会出现了一种比不负责任更可怕的想法:那就是我们都立志成为最好的高端,——注意,是最好的高端游戏的制作人。然后就按照人家欧美、日韩的思路去制作游戏。——基于这一点,于是一切不符合欧美、日韩游戏理念的制作思路就都要被鄙视、被耻笑和被淘汰。
这一个“理所当然”的结果就是所有的创新都在摇篮里就被扼杀,在没体验过之前就被打上了“游戏不能这样设计”的戳。类似的事情我就干过好多回,举两个简单的例子:
第一个是2000年前后我在一家韩资游戏公司工作,老板当时说在韩国有手机付费模式,问我们觉得这个是否可行。我们当时就认为这种事情完全没戏。但实际上,做过SP的哥们,以及今天的玩家应该都知道这个否定的答案是多么可笑。
第二个是我之前也认为一款游戏如果不够复杂不够难,那就很不好玩,用咱们的话说“还有什么游戏性嘛”。但实际上休闲类的网络游戏我玩的很开心。
所以我觉得游戏行业内外的从业者和玩家都应该放弃固有的游戏理念,寻找新的,属于自己的理念,然后坚持它,和任何人拒以力争,当然这是建立在讲理的前提下。在完全忽视游戏理念的前提下,一味简单的照抄别人的系统那是自掘坟墓。——这事儿咱们中国早就有了结论:“学我者生,像我者死”。
新的游戏理念从哪里来?从市场中来,从用户中来,——从每一个被认为“游戏不可以这样设计”的意见中来。世界顶级游戏制作公司,暴雪,我们知道他在设计游戏,调整平衡性的时候,是去听取顶尖选手的意见,而不是听老板的意见。——当然,如前所说在中国目前的市场环境下想不听老板的意见有点难,——至少比《怪物猎人2》难多了。
最后、我的结论和我的提倡
最后,我来谈一下刚才那个问题:高成就感是否就等于除此以外再无别的乐趣?显然不是,比如说,不能因为《怪物猎人2》的难度高,就认为ACT类游戏的乐趣来自于高难度所带来的高成就感,《真”三国无双》系列华丽的打击感和大量吸引人的剧情元素又怎么说?
这就是说,市场需要多元化。什么叫多元化?几年前中国市场上全是MMORPG,现在跳舞的、打球的各种游戏成堆,这叫多元化。但这是以游戏类型为划分依据的纵向多元化,而且这个多元化,多元的很可悲,——你看这些不同类别的网游,又都是欧美、韩国先研发的,他们在研发这些游戏类别时我们在干嘛?——我们在单一的学人家做MMORPG。
现在的游戏类别已经固定在这些类别上很难突破,但以玩家需求为划分依据垂直的多元化还是有很大发展空间的。比如同样是MMORPG,应该有一些是依靠任务系统来升级的,有一些是用人民币来升级的,有一些是坚持打怪升级的;有高端的,有中端的,也有低端的。而不是说现在游戏A出了个副本系统,游戏B出了个代练系统,我就都得照抄过来。——虽然我如此推崇《征途》,但我不认同史玉柱认为未来游戏应走“大而全”路线这一观点。
大而全的MMORPG+大而全的舞蹈游戏+大而全的音乐游戏+大而全的赛车游戏……这样走下去的结果就不能叫“多元化”,而应该叫“多元同质化”。“多元同质化”的结果就是近两年来,我们能看到的,那些被抛弃的韩国网游,“共生即共死”。
所以我的结论是:研发型公司应以玩家需求为圆心,以自己的理念为半径划圆,圆内的含盖到的事物,去原创,去借鉴,力争尽善尽美。圆外的事物再好,都让他随风去而去。谁也不要因为一款游戏休闲向、没难度、低端就去鄙视和看不起它,要想做好低端游戏的精品,我恐怕那并不比做出一款高端游戏的精品要容易多少。
后记、一点小希望
一提起《征途》,就滔滔不绝的一直侃到对中国企业、游戏市场等等的肤浅理解,这是如文中所说的那样,因为接触《征途》的过程颠覆了我对游戏的理解。我想,“《征途》=?”我已经说的很清楚了,——以我现在的水准和文字能力,也就表达到这份上了。
而其实我更关心的,——也就是我的小希望,是搞清楚“?=《征途》”。我希望,“?”≠《巨人》。