Jun 26 2013

PHP 中的libcurl增加 CURLOPT_MAXFILESIZE 参数

Category: 技术ssmax @ 10:04:39

编辑一下,php 5.5.0 的发布文档里面已经表示新版php已经增加了此参数,所以如果各位的php是最新的5.5或以上,可以忽略下面的文字啦,呵呵。

libcurl有一个很有用的参数

MAXFILESIZE,可以根据content length来判断是否超过文件下载大小,但是php默认的版本没有编译这个参数进去。

根据libcurl 的 源代码所示

https://github.com/bagder/curl/blob/master/docs/libcurl/symbols-in-versions

CURLOPT_MAXFILESIZE             7.10.8
CURLOPT_MAXFILESIZE_LARGE       7.11.0

CURLOPT_MAXFILESIZE 是从 7.10.8版本开始存在的

修改php源代码:
ext/curl/interface.c

寻找关键字 CURLOPT_IPRESOLVE(该功能也是7.10.8版本开始存在,也是long类型变量)
插入CURLOPT_MAXFILESIZE 的判断,由于同样是long类型,所以不需要做什么特殊处理


#if LIBCURL_VERSION_NUM > 0x070a07 /* CURLOPT_IPRESOLVE is available since curl 7.10.8 */
        REGISTER_CURL_CONSTANT(CURLOPT_IPRESOLVE);
        REGISTER_CURL_CONSTANT(CURL_IPRESOLVE_WHATEVER);
        REGISTER_CURL_CONSTANT(CURL_IPRESOLVE_V4);
        REGISTER_CURL_CONSTANT(CURL_IPRESOLVE_V6);
        REGISTER_CURL_CONSTANT(CURLOPT_MAXFILESIZE);
#endif
......

#if LIBCURL_VERSION_NUM > 0x070a07 /* CURLOPT_IPRESOLVE is available since curl 7.10.8 */
                case CURLOPT_IPRESOLVE:
                case CURLOPT_MAXFILESIZE:
#endif

编辑完成后,重新编译PHP,即可在php的curl_setopt中,使用CURLOPT_MAXFILESIZE参数,指定下载文件的限制大小,单位为bytes。


Jun 14 2013

MYSQL 主从同步文档的大坑

Category: 技术ssmax @ 15:15:42

http://dev.mysql.com/doc/refman/5.1/en/replication-rules-db-options.html

mysql 主从同步的参数

replicate-do-db   指定同步某个DB

如果大家有一个需求,只同步某一些DB,就需要用

replicate-do-db=dbA

replicate-do-db=dbB

ok,这里还很明确,但是如果大家又想不同步dbA里面某个表。。文档里面的坑就出现了

按照文档的意思,如果 db level中没有匹配到,就会转入table level的匹配。ok,按照文档,我配置成这样:

replicate-do-db=dbB
replicate-ignore-table=dbA.question
replicate-wild-do-table=dbA.%

结果,dbA就全部不会同步了。。。但是根据文档中的示意图,理论上是可以的啊

其实坑就在这里了,如果存在 replicate-do-db, 最后如果不是excute的结果,是不会进入 table level的判断的。

所以要达到我们的需求,就需要这样配置:

replicate-do-db=dbA

replicate-do-db=dbB
replicate-ignore-table=dbA.question
replicate-wild-do-table=dbA.%

看官看到这里必定会问,为什么要用 replicate-wild-do-table 多此一举呢?如果没有了这一句,一切不是都很清晰吗。。。

问题就是 replicate-do-db 只会同步 USE DB 之后的语句,并不会同步直接DB.table 非指定DB域的语句,所以很多时候,还是要加上 replicate-wild-do-table, 会稳妥一点。

好了,我们都以为 replicate-do-db 和 replicate-wild-do-table 可以一起用,其实。。。这里的坑更变态。

根据刚才的规则,如果存在 replicate-do-db,语句必须在db级是execute的,才会进入 table级别的判断。。。所以,这里的

replicate-wild-do-table 压根就达不到大家预料的效果,比如大家USE dbC之后,再更新dbA中的数据,发现在

replicate-do-db=dbA

replicate-wild-do-table=dbA.%

这样的配置中,根本达不到想要的效果,大家USE dbC之后,再更新dbA中的数据,结果还是没有同步到从,所以最后,MYSQL的文档写了一句:

To make it easier to determine what effect an option set will have, it is recommended that you avoid mixing “do”and “ignore” options, or wildcard and nonwildcard options. An example of the latter that may have unintended effects is the use of --replicate-do-db and --replicate-wild-do-table together, where --replicate-wild-do-table uses a pattern for the database name that matches the name given for --replicate-do-db.

尽量不要混合使用,除非你已经测试过了。。。