2个小问题
1. 重新编译PHP,不使用mysqlnd,使用传统的mysql库,无法链接数据库, 错误:
Lost connection to MySQL server at ‘reading authorization packet’
原因: Mysql server默认链接超时是5秒 , 超过了则会报上述错误. 修改/etc/my.cnf将connect_timeout设置为60(和php
mysqli的值一样)
UPDATE: 不要修改,修改后产生了太多的链接!
MysqlND没有这个问题,从侧面说明,其连接池做的还不错.
2.编译DBD::mysql测试无法通过, 报错误无法载入mysqlclient.15.dylib
原因:
默认编译是动态编译,而其引用的mysql动态库的地址是错误的,默认是(/usr/local/mysql/lib/mysql)
在我的osx上,应该是/usr/local/mysql/lib
解决方案1: cp *dylib /usr/local/mysql/lib/mysql/
解决方案2:使用static link:
perl Makefile.PL –libs=”-L/usr/local/mysql/lib/mysql -lmysqlclient” –testuser=root
make
make test
sudo make install
考虑如何解决日志等并发数据的写入方案
很久没有用perl了,最近重新用起来, 用于解决并发数据读写问题,主要是日志问题. 实时写入mysql是不现实的, 所以需要使用
一个服务器作为缓冲. Perl是解决这个问题的最快速有效的方案,因为CPAN上的东西太好用了.
服务器称之为statsd,如何实现,可选的还是很多的:
首先是前端的实现:
方案1是PHP脚本打开一个socket,通过UDP来将要写入的数据传送到statsd. UDP的开销要比TCP小.不过仍需要PHP.
方案2是perl实现一个FastCGI, 设置nginx,将特定url转发到这个FastCGI处理, 它则将数据转发到statsd.
方案3是实现perlbal的plugin,nginx也是直接将url转发到后端的perlbal上的plugin.
后端的statsd实现:
方案1:使用Danga::Socket,Net::Server这些来实现一个单进程的server,简单,快速.
方案2:使用POE来实现,POE值得投入.
方案3:用Perlbal插件来实现,复用价值高.
方案4:直接用Nginx的perl接口实现,也许是最高效的.
我也考虑过gearman不过,感觉在这个场合不是太合适,但是后面可有大用场.
Perlbal是非常不错的,今后还有很多用途.
Nginx的perl接口目前还有一些小问题,其中主要是kill -HUP的时候可能无法重新加载perl脚本.
这个方案在bloom中还是比较重要的,否则大量的数据无法及时处理,这几天抽时间再仔细看看.