jobs := make(chan int, 100) result := make(chan int, 100) // use five workers for w:=0; w<5; w++ { go func(w int, jobs <-chan int, result chan<- int) { for j:= range jobs { fmt.Println("worker", w, "processing on", j) time.Sleep(time.Millisecond * time.Duration(rand.Intn(600))) // sleep a random time result <- j * 2 } }(w, jobs, result) }
// insert jobs for j:=0; j<10; j++ { jobs <- j }
close(jobs)
// can do some others here
// sync here, may wait for works done for a :=0; a<10; a++ { <- result } fmt.Println("all work done here")
Rate limiting is an important mechanism for controlling resource utilization and maintaining quality of service
go使用goroutine,channel, ticker合作实现该特性。
使用rate-limiting的模型,可以应对突然的大量请求进行缓存,有序处理。
rateControlChan := make(chan time.Time, 3) // 用于控制速率的channel for i:=0; i<3; i++ { rateControlChan <- time.Now() } // send value per 200 millisecond go func() { for t := range time.Tick(time.Millisecond * 200) { rateControlChan <- t } }()
reqChannel := make(chan int, 5) // 缓存请求的channel for i:=0; i< 5; i++ { reqChannel <- i } close(reqChannel) for r:= range reqChannel { ht := <- rateControlChan // wait for rate-control condition // handle request here fmt.Println("req", r, "handle at", ht) }
// 在第一行后追加一行 sed "1 a This is your mou, you mou's name is miaomiao" cats.txt // 在第一行插入一行,即原来的第一行成为第二行 sed "1 i this is ****" cats.txt //在文件结尾追加一行 sed "$ a this is ****" cats.txt // 在所有匹配行后追加一行 sed "/my/a this is my ***" cats.txt
c命令替换匹配行
//替换第二行 sed "c 2 this is my****" cats.txt // 替换匹配行 sed /my/c this is your****" cats.txt
d命令删除匹配行
// 删除第二行 sed '2s' cats.txt // 删除从第3行到结尾 sed '3,$d' cats.txt
运行上面的ext_skel命令,就会在ext文件夹下创建一个mfs的文件夹,并声称一些代码文件和配置文件。 php扩展在Linux下的配置文件是 ext/mfs/config.m4;m4有自己的语法,不过我们并不需要熟悉它,只需要简单去掉一些注释就可以了。打开配置文件config.m4;大概在16行和18行,找到PHP_ARG_ENABLE(mfs, whether to enable mfs support 相关的内容,这一行是用来重新生成configure文件时起作用的,取消这一行及 它后面的第二行[ --enable-myfunctions Include myfunctions support]),中间有一行不要取消注释。这样就可以重新生成configure文件可以使用enable-mfs来静态编译扩展。
完成上面的工作后,重新生成configure文件并编译安装php。
cd /path/to/php-5.6.12 ./buildconf --force ./configure --enable-fms --prefix=/home/wuxu/data/php5.6 --with-config-file-path=/home/wuxu/data/etc/php.ini make make install
PHP_FUNCTION(self_concat) { char *str = NULL; int argc = ZEND_NUM_ARGS(); int str_len; long n; char *result; /* Points to resulting string */ char *ptr; /* Points at the next location we want to copy to */ int result_length; /* Length of resulting string */ if (zend_parse_parameters(argc TSRMLS_CC, "sl", &str, &str_len, &n) == FAILURE) { return; }
// Example which loads classes for the Doctrine Common package in the // Doctrine\Common namespace. $classLoader = new SplClassLoader('Doctrine\Common', '/path/to/doctrine'); $classLoader->register();
//在Zend/zend_types.h里定义的: typedef unsigned int zend_uint; typedef unsigned char zend_uchar;
其中保存变量的值的value则是zvalue_value类型,它是一个union:
typedef union _zvalue_value { long lval; /* long value */ double dval; /* double value */ struct { char *val; int len; } str; HashTable *ht; /* hash table value */ zend_object_value obj; } zvalue_value;