October 31, 2010
C语言中指针变量和数组的组合
"\u003cp\u003eint a[10];\u003c/p\u003e\n\u003cp\u003eint * p;\u003c/p\u003e\n\u003cp\u003eC语言规定数组名代表数组中第一个元素(即序号为0的元素)的地址,因此,下面两个语句等价:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ep = \u0026amp;a[0];\u003c/p\u003e\n\u003cp\u003ep = a;\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e摘自:C语言程序设计(第二版)p211\u003c/p\u003e\n\u003cp\u003e(5)指针变量的值是可以改变的,见下例。\u003c/p\u003e\n\u003cp\u003e例10.20 改变指针变量的值。\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e#include \u0026lt;stdio.h\u0026gt;\nvoid main()\n{\nchar *a = \u0026#34;I love China!\u0026#34;:\na = a + 7;\nprintf(\u0026#34;%s\u0026#34;, a);\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e运行结果如下:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eChina!\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e指针变量a的值是可以变化的,输出字符串是地从a当时所指向的单元开始输出各个字符,起码到遇’\\0’为止。而数组名虽然代表地址,但它是常量,它的值是不能改变的。下面的用法是错误的:\u003c/p\u003e\n\u003cp\u003echar str[] = {“I love China!”};\u003c/p\u003e\n\u003cp\u003estr = str + 7;\u003c/p\u003e\n\u003cp\u003eprintf(“%s”, str);\u003c/p\u003e\n\u003cp\u003e需要说明,若定义了一个指针变量, 并使它指向一个字符串,就可以用下标形式引用指针变量所指的字符串中的字符。\u003c/p\u003e\n\u003cp\u003e例10.21 用带下标的字符指针变 …\u003c/p\u003e"
October 30, 2010
又拍网架构中的分库设计
"\u003cp\u003e又拍网是一个照片分享社区,从2005年6月至今积累了260万用户,1.1亿张照片,目前的日访问量为200多万。5年的发展历程里经历过许多起伏,也积累了一些经验,在这篇文章里,我要介绍一些我们在技术上的积累。\u003c/p\u003e\n\u003cp\u003e又拍网和大多数Web2.0站点一样,构建于大量开源软件之上,包括\u003ca href=\"http://www.mysql.com/\"\u003eMySQL\u003c/a\u003e、\u003ca href=\"http://www.php.net/\"\u003ePHP\u003c/a\u003e、\u003ca href=\"http://nginx.org/en/\"\u003enginx\u003c/a\u003e、\u003ca href=\"http://www.python.org/\"\u003ePython\u003c/a\u003e、\u003ca href=\"http://www.danga.com/memcached/\"\u003ememcached\u003c/a\u003e、\u003ca href=\"http://code.google.com/p/redis\"\u003eredis\u003c/a\u003e、\u003ca href=\"http://lucene.apache.org/solr/\"\u003eSolr\u003c/a\u003e、\u003ca href=\"http://hadoop.apache.org/\"\u003eHadoop\u003c/a\u003e和\u003ca href=\"http://www.rabbitmq.com/\"\u003eRabbitMQ\u003c/a\u003e等等。又拍网的服务器端开发语言主要是\u003ca href=\"http://www.php.net/\"\u003ePHP\u003c/a\u003e和\u003ca href=\"http://www.python.org/\"\u003ePython\u003c/a\u003e,其中\u003ca href=\"http://www.php.net/\"\u003ePHP\u003c/a\u003e用于编写Web逻辑(通过HTTP和用户直接打交道), 而\u003ca href=\"http://www.python.org/\"\u003ePython\u003c/a\u003e则主要用于开发内部服务和后台任务。在客户端则使用了大量的Javascript, 这里要感谢一下\u003ca href=\"http://mootools.net/\"\u003eMooTools\u003c/a\u003e这个JS框架,它使得我们很享受前端开发过程。 另外,我们把图片处理过程从\u003ca href=\"http://www.php.net/\"\u003ePHP\u003c/a\u003e进程里独立出来变成一个服务。这个服务基于\u003ca href=\"http://nginx.org/en/\"\u003enginx\u003c/a\u003e,但是是作为\u003ca href=\"http://nginx.org/en/\"\u003enginx\u003c/a\u003e的一个模块而开放REST API。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2010/10/sharding1.png\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/sharding1.png\" alt=\"开发语言\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e**图1:**开发语言\u003c/p\u003e\n\u003cp\u003e由于\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://www.php.net/\"\u003ePHP\u003c/a\u003e的单线程模型,我们把耗时较久的运算和I/O操作从HTTP请求周期中分离出来, 交给由\u003ca href=\"http://www.python.org/\"\u003ePython\u003c/a\u003e实现的任务进程来完成,以保证请求响应速度。这 …\u003c/p\u003e"
October 30, 2010
软件架构设计中的同步与异步问题(修改版)
"\u003cp\u003e内容概要:本文分析了大型程序系统设计中经常需要面对的同步和异步结构问题。列举异步结构模式实现手段,论证异步模式效率远远优越于同步模式,证明在硬件资源理想情况下,对同步模式而言并发量对计算机系统的平均交易处理时间没有影响,对异步模式而言平均交易处理时间会随着并发量的增大而急剧下降,最终也趋向一个恒定值。在实际有限计算机资源情况下,程序设计必须设置最大并发量以控制并发程度,否则过多并发量会形成交易对硬件资源的竞争,造成交易的拥塞。\u003c/p\u003e\n\u003cp\u003e关键词:同步,异步,消息队列,效率,并发\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一.基本概念\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e同步和异步问题是大型程序设计中需要慎重等待的问题,但目前这方面的讨论很少,本文就试图进行有关方面讨论。\u003c/p\u003e\n\u003cp\u003e一个大型的程序系统常常是由很多不能功能模块组成的。程序系统运行时不同功能模块要按一定顺序执行,以协同完成一件任务。功能模块协作运行完成一件任务存在同步和异步两种方式。如果在某一时间段,这个程序系统的所有功能模块都在为完成相同的一件任务而服务,某一个功能模块在完成一件任务的子任务后,需要等待其他功能模块完成子任务,这样只有当全部功能模块按顺序完成一件任务后,程序系统才能接收下一个任务,功能模块是串行运行,这 …\u003c/p\u003e"
October 29, 2010
FreeBSD 单网卡绑定多个IP
"\u003cp\u003e假设网卡lnc0原IP地址为192.168.0.2,现在为它绑定另一个IP:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e# ifconfig lnc0 192.168.0.3 netmask 255.255.255.255 alias\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e解释:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e如果别名IP地址和网卡原IP地址在同一个子网上,就需要设置掩码为255.255.255.255\u003c/p\u003e\n\u003cp\u003e如果位于不同的子网,就直接使用相应子网的正常网络掩码\u003c/p\u003e\n\u003cp\u003e从TCP/IP的角度来看,这样做意味着什么呢?\u003c/p\u003e\n\u003cp\u003e网络掩码的所有位都设置成1,就会保证ICP/IP栈这样来看待包:\u003c/p\u003e\n\u003cp\u003e只要包的目标地址匹配所有位,就把该包看成本地子网上的包;它创建了只有一个地址的“子网”。\u003c/p\u003e\n\u003cp\u003e所有发送给该地址的包以及该地址接受的包都会发送给路由器,而不会发送到LAN上。\u003c/p\u003e\n\u003cp\u003e如果多个别名使用了同一个网络掩码,这些别名的广播地址也应该相同,而这样却导致了TCP/IP栈的混乱。\u003c/p\u003e\n\u003cp\u003e使用全1的网络掩码,才能骗过ifconfig,让该命令允许单个接口卡上有多个IP地址。\u003c/p\u003e\n\u003cp\u003e要在/etc/rc.conf中设置别名,应该使用 ifconfig_xxx#_alias# 关键字,该关键字的使用形式类似于 ifconfig_xxx#: …\u003c/p\u003e"
October 28, 2010
centos下快速同步时间
"\u003cp\u003e安装ntpdate\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eyum -y install ntp\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003evi /etc/crontab\u003c/strong\u003e 添加下面这行\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e30 21 * * * root /usr/sbin/ntpdate cn.pool.ntp.org \u0026amp;\u0026amp; /sbin/hwclock -w\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e:wq (保存退出)\n手动更新时间方法:ntpdate cn.pool.ntp.org\nhwclock -w 这里是更新ROM的时间\u003c/p\u003e\n\u003cp\u003e文件格式为:分钟(0-59) 小时(0-23) 日期(1-31) 月份(1-12) 周(0-7) user command\n意思是:root用户 在每天21:30 分执行ntpdate comamnd 同步到 cn.pool.ntp.org 这个时间池,并且将更新的时间写入到 ROM里保存。\u003c/p\u003e\n\u003cp\u003e备注:不要忘记开启服务啊!\nchkconfig ntpd –list (查看0~6个runlevel 是否按照阁下意愿开启或关闭 ntpd服务)\nchkconfig ntpd –level 35 on (开启runlevel 3和5的ntpd服务)\nchkconfig …\u003c/p\u003e"
October 28, 2010
ipvsadm+keepalived 实现高可用负载均衡
"\u003ch4 id=\"一使用系统red-hat-enterprise-linux-server-release-54\"\u003e一.使用系统Red Hat Enterprise Linux Server release 5.4\u003c/h4\u003e\n\u003ch4 id=\"二安装环境\"\u003e二.安装环境\u003c/h4\u003e\n\u003ch4 id=\"1说明\"\u003e1.说明\u003c/h4\u003e\n\u003cp\u003erealserver:192.168.1.11\u003c/p\u003e\n\u003cp\u003erealserver:192.168.1.12\u003c/p\u003e\n\u003cp\u003elvs控制机 MASTER:192.168.1.100\u003c/p\u003e\n\u003cp\u003eBACKUP:192.168.1.101\u003c/p\u003e\n\u003cp\u003e虚拟VIP:192.168.1.200\u003c/p\u003e\n\u003cp\u003e其中:realserver上只需要简单的安装apache即可\u003c/p\u003e\n\u003cp\u003elvs控制机需要安装:ipvsadm,keepalived\u003c/p\u003e\n\u003ch4 id=\"2lvs控制机安装主备机分别安装ipvsadm\"\u003e2.lvs控制机安装,主备机分别安装ipvsadm\u003c/h4\u003e\n\u003cp\u003e实现LVS/DR最重要的两个东西是ipvs内核模块和ipvsadm工具包,现在的系统已经包含ip_vs模块\u003c/p\u003e\n\u003ch4 id=\"1检查内核模块看一下ip_vs是否被加载\"\u003e1)检查内核模块,看一下ip_vs 是否被加载\u003c/h4\u003e\n\u003cblockquote\u003e\n\u003ch1 id=\"lsmod-grep-ip_vs\"\u003elsmod |grep ip_vs\u003c/h1\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003eip_vs 35009 0\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e如果没有显示,则说明没有加载,执行命令 modprobe ip_vs 就可以把ip_vs模块加载到内核\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#modprobe ip_vs\u003c/p\u003e\u003c/blockquote\u003e\n\u003ch4 id=\"2安装ipvsadm\"\u003e2)安装ipvsadm\u003c/h4\u003e\n\u003cp\u003e先把目 …\u003c/p\u003e"
October 27, 2010
c语言中的scanf语法
"\u003cp\u003escanf函数,与 \u003ca href=\"http://baike.baidu.com/view/410546.htm\"\u003eprintf\u003c/a\u003e 函数一样,都被定义在 \u003ca href=\"http://baike.baidu.com/view/538727.htm\"\u003estdio.h\u003c/a\u003e 里,因此在使用scanf函数时要加上#include。它是格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中,其关键字最末一个字母f即为“格式”(format)之意。\u003c/p\u003e\n\u003ch2 id=\"scanf函数的一般形式\"\u003escanf函数的一般形式\u003c/h2\u003e\n\u003cp\u003escanf(格式控制,地址表列)\u003c/p\u003e\n\u003cp\u003eint scanf(char *format[,argument,…]);\u003c/p\u003e\n\u003cp\u003e“格式控制”的含义同printf函数;“地址表列”是由若干个地址组成的表列,可以是变量的地址,或字符串的首地址。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003escanf()函数返回成功赋值的数据项数,读到文件末尾出错时则返回EOF。\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e例:使用scanf函数输入数据。\u003c/p\u003e\n\u003cp\u003e在visual c++ 6.0上的编写方式。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#include\u003c/p\u003e\n\u003cp\u003evoid main()\u003c/p\u003e\n\u003cp\u003e{\u003c/p\u003e\n\u003cp\u003eint a,b,c;\u003c/p\u003e\n\u003cp\u003eprintf(“please input a,b,c”);\u003c/p\u003e\n\u003cp\u003escanf(“%d,%d,%d”,\u0026amp;a,\u0026amp;b,\u0026amp;c);\u003c/p\u003e\n\u003cp\u003eprintf(“a=%d,b=%d,c=%d”,a,b,c);\u003c/p\u003e\n\u003cp\u003e}\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e在Dev-C++上运行程序为:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#include\u003c/p\u003e\n\u003cp\u003eint …\u003c/p\u003e\u003c/blockquote\u003e"
October 26, 2010
Centos5下配置 lvs DR
"\u003cp\u003e系统环境如下:\u003c/p\u003e\n\u003cp\u003eserver1:192.168.1.206 vip server centos5\nserver2:192.168.1.210 apache centos5\nserver3:192.168.1.211 apache centos5\u003c/p\u003e\n\u003cp\u003evip:192.168.1.208\nport:80\u003c/p\u003e\n\u003cp\u003e============================================\u003c/p\u003e\n\u003cp\u003e下面的安装是在vip server上进行的\u003c/p\u003e\n\u003cp\u003e1、查看自己的操作系统的内核 #uname -a\u003c/p\u003e\n\u003cp\u003e2、这个内核已经包括了ipvs的补丁,进行如下的操作就可以\u003c/p\u003e\n\u003cp\u003e3、下面建立一个指向,为了保证ipvsadm安装\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003emodprobe ip_vs\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ecat /proc/net/ip_vs\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e出现如下的提示\u003c/p\u003e\n\u003cp\u003eIP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags\u003c/p\u003e\n\u003cp\u003e– \u0026gt; RemoteAddress:Port Forward Weight ActiveConn InActConn\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e4、安装ipvsadm …\u003c/strong\u003e\u003c/p\u003e"
October 26, 2010
linux route 命令
"\u003cp\u003e懂得网络配置命令是一般技术人员必备的技术,经过一段时间的研究和学习,总结了一些常用的命令和示例以便日后查阅.\n传统的在1–3点,ip高级路由命令在4–12点,两者部分可以通用,并达到同样的目的,但ip的功能更强大,可以实现更多的配置目的.\n首先,先了解传统的网络配置命令:\n**1. 使用ifconfig命令配置并查看网络接口情况\n** 示例1: 配置eth0的IP,同时激活设备:\n# ifconfig eth0 192.168.4.1 netmask 255.255.255.0 up\n示例2: 配置eth0别名设备 eth0:1 的IP,并添加路由\u003c/p\u003e\n\u003cp\u003e# ifconfig eth0:1 192.168.4.2\n# route add –host 192.168.4.2 dev eth0:1\n示例3:激活(禁用)设备\n# ifconfig eth0:1 up(down)\n示例4:查看所有(指定)网络接口配置\n# ifconfig (eth0)\n\u003cstrong\u003e2. 使用route 命令配置路由表\u003c/strong\u003e\n示例1:添加到主机路由\n# route add –host 192.168.4.2 dev eth0:1\n# …\u003c/p\u003e"
October 26, 2010
CentOS升级内核及KVM安装
"\u003cp\u003e由于CentOS 默认内核为2.6.18,故需要升级内核\u003c/p\u003e\n\u003cp\u003e升级内核到2.6.27,很容易,但升级到2.6.28后的版本折腾了我很久\u003c/p\u003e\n\u003cp\u003e升级到2.6.27\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ewget\ntar zxvf linux-2.6.27.tar.gz -C /usr/src\ncd /usr/src/linux-2.6.27\nmake menuconfig\nmake\nmake modules_install\ncp arch/i386/boot/bzImage /boot/vmlinuz-2.6.27-root (注意:目录i386是根据你的系统类型, 如果是64位系统, 那就很可能是x86_64)\ncp System.map /boot/System.map-2.6.27-root\nmkinitrd /boot/initrd-2.6.27-root.img 2.6.27\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003evi /etc/grub.conf\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003etitle CentOS (2.6.27)\nroot (hd0,6)\nkernel /vmlinuz-2.6.27-root ro root=/dev/VolGroup00/LogVol00 rhgb quiet …\u003c/p\u003e\u003c/blockquote\u003e"
October 25, 2010
Windows 下为PHP添加扩展模块初探
"\u003cp\u003e说明:\u003c/p\u003e\n\u003cp\u003e本人新手,虽然用过很长时间的php,也写过一些简单php程序,但是一直没有对php的扩展模块有过研究。最近因为开发需要,要给一些php应用扩展功能,虽然手边有以前开发好的C程序,用popen等运行之也可以使用,但是从效率、调用便捷性、代码完整性等方面考虑总是觉得popen方式有些不妥,因此萌生了写个扩展模块的念头。于是乎上网找资料,并且初步完成了一个最基本的php扩展模块的框架。在此特别感谢花总的友情支持。\u003c/p\u003e\n\u003cp\u003ebtw: 本文所说的相关技术已经很陈旧了,实在不适合用“初探”这个词,但是于我个人而言,却又的确是初探,现总结出来,分享之。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e0、环境说明\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e框架生成环境:\u003c/p\u003e\n\u003cp\u003eFreeBSD 6.0-STABLE ( 用各版本 Linux 或者 cygwin 也可以,不过我手边只有 bsd,就用它了 )\u003c/p\u003e\n\u003cp\u003ePHP-4.4.4 源码包 (php-4.4.4.tar.bz2 或 php-4.4.4.tar.gz)\u003c/p\u003e\n\u003cp\u003e开发工具:\u003c/p\u003e\n\u003cp\u003eVC++ 6.0 ( 我没有用 VS .Net,因为 VC++6.0 启动比较快些,而且只是写个DLL而已 )\u003c/p\u003e\n\u003cp\u003e运行环境:\u003c/p\u003e\n\u003cp\u003eWindows 2003\u003c/p\u003e\n\u003cp\u003ePHP-4.4.4 …\u003c/p\u003e"
October 25, 2010
[教程]Linux下C语言对PHP扩展
"\u003cp\u003e\u003cstrong\u003e一,搭建php环境\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e下载php 5.2.6 源码 并解压编译安装,搭建php环境\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e二,创建扩展项目\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e进入源码目录\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ecd php5.2.6/ext/\u003c/p\u003e\n\u003cp\u003e./ext_skel –extname=my_ext\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e创建名字为my_ext的项目,最终会生成 my_ext.so\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e三,更改配置和程序\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e$ vi ext/my_ext/config.m4\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e根据你自己的选择将\u003c/p\u003e\n\u003cp\u003ednl PHP_ARG_WITH(my_ext, for my_ext support,\u003c/p\u003e\n\u003cp\u003ednl Make sure that the comment is aligned:\u003c/p\u003e\n\u003cp\u003ednl [ –with-my_ext Include my_ext support])\u003c/p\u003e\n\u003cp\u003e修改成\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ePHP_ARG_WITH(my_ext, for my_ext support,\u003c/p\u003e\n\u003cp\u003eMake sure that the comment is aligned:\u003c/p\u003e\n\u003cp\u003e[ –with-my_ext Include my_ext support])\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e或者将\u003c/p\u003e\n\u003cp\u003ednl PHP_ARG_ENABLE(my_ext, whether to enable my_ext …\u003c/p\u003e"
October 25, 2010
在Windows下写PHP的C扩展
"\u003cp\u003e安装好如下软件:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003eVC++ 6\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ephp二进制环境\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eCygwin.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003eI. 下载php的源码包\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e下载后php源码包解压后有个ext目录,这个目录就是负责开发扩展的目录,目录中有默认你扩展的所有源码。还有两个重要的文件:ext_skel , ext_skel_win32.php.\u003c/p\u003e\n\u003cp\u003eext_skel是创建扩展的shell,在windows上无法运行,所以就必须要有Cygwin。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eII. 建立php扩展骨架目录文件\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e如果你的cygwin没有安装在c:\\cygwin,进入php源码包\\ext目录下,修改ext_skel_win32.php :\u003c/p\u003e\n\u003cp\u003e$cygwin_path = ‘c:\\cygwin\\bin’;\u003c/p\u003e\n\u003cp\u003e修改为你的cygwin目录\u003c/p\u003e\n\u003cp\u003e$cygwin_path = ‘d:\\cygwin\\bin’;\u003c/p\u003e\n\u003cp\u003e命令行方式进入ext目录然后运行:\u003c/p\u003e\n\u003cp\u003ephp ext_skel_win32.php –extname=myhello\u003c/p\u003e\n\u003cp\u003e(当然,为了保证上面的命令行能正常运行,首先你得确保你的php目录在系统的环境变量里)\u003c/p\u003e\n\u003cp\u003e运行该命令后,有人发现下面的错误\u003c/p\u003e\n\u003cp\u003eWarning: …\u003c/p\u003e"
October 25, 2010
指针 数字数组和字符数组首地址的输出
"\u003cblockquote\u003e\n\u003cp\u003e#include\n#include\u003c/p\u003e\n\u003cp\u003eint main()\n{\u003c/p\u003e\n\u003cp\u003echar *p;int *p1;\u003c/p\u003e\n\u003cp\u003eint a[10]={1,2,3,4,5,6,7,8,9,0};\nchar str[]=”haohtmlcom”;\np=str;\np1=a;\u003c/p\u003e\n\u003cp\u003eprintf( “%x” , p); /*输出的是地址*/\nprintf(“%s”,p); /*输出的是字符串haohtmlcom*/\u003c/p\u003e\n\u003cp\u003eprintf(“%x”,p1); /*输出的是地址*/\u003c/p\u003e\n\u003cp\u003eprintf(“%s”,p1); /*输出的是字符串,乱码*/\u003c/p\u003e\n\u003cp\u003esystem(“pause”);\u003c/p\u003e\n\u003cp\u003e}\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003ep,p1中存放的应为字符串,但在输出时还要兼顾前面的输出格式符的控制,如果是%s,则会将p的地址内的数据输出,而不再输出p本身的内容地址.\u003c/p\u003e\n\u003cp\u003eprintf(“%c”, *p);//会输出字符串的第一个字母h\u003c/p\u003e\n\u003cp\u003eprintf(“%d”, *p1);//会输出数组的第一个数字.\u003c/p\u003e\n\u003cp\u003e所以 p,p1存放的都是地址,在用%c,%d时都能作为首地址输出第一个字母或数组元素,但是如果换用,%s,输出字符串,在一个地址空间内是不能存在字符串的,所以编译器会认为是连续空间 …\u003c/p\u003e"
October 22, 2010
nginx与lvs做负载均衡的比较
"\u003cp\u003elvs和nginx都可以用作多机负载的方案,它们各有优缺,在生产环境中需要好好分析实际情况并加以利用。\u003c/p\u003e\n\u003cp\u003e首先提醒,做技术切不可人云亦云,我云即你云;同时也不可太趋向保守,过于相信旧有方式而等别人来帮你做垫被测试。把所有即时听说到的好东西加以钻研,从而提高自己对技术的认知和水平,乃是一个好习惯。\u003c/p\u003e\n\u003cp\u003e下面来分析一下两者:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一、lvs的优势:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e1、抗负载能力强,因为lvs工作方式的逻辑是非常之简单,而且工作在网络4层仅做请求分发之用,没有流量,所以在效率上基本不需要太过考虑。在我手里的lvs,仅仅出过一次问题:在并发最高的一小段时间内均衡器出现丢包现象,据分析为网络问题,即网卡或linux2.4内核的承载能力已到上限,内存和cpu方面基本无消耗。\u003c/p\u003e\n\u003cp\u003e2、配置性低,这通常是一大劣势,但同时也是一大优势,因为没有太多可配置的选项,所以除了增减服务器,并不需要经常去触碰它,大大减少了人为出错的几率。\u003c/p\u003e\n\u003cp\u003e3、工作稳定,因为其本身抗负载能力很强,所以稳定性高也是顺理成章,另外各种lvs都有完整的双机热备方案,所以一点不用担心均衡器本身会出什么问题,节点出现故障的话,lvs会自动判别,所以系统整体是非常稳定 …\u003c/p\u003e"