分类目录归档:图片/文字

Mac OS Lion 下编译安装Nginx 1.0.12 + PHP 5.3.10 + Mysql 5.5.18 + Xdebug + PHPUnit [转]

在mac下编译安装了最新版本namp的环境, 记录一下安装过程, 其实总体和linux下没有太多区别,另外port是个好东西。

mysql编译安装:

1. 建立mysql数据存储目录, 权限设置为mac os默认存在的_mysql权限:

mkdir -p /var/mysql/data/
chown -R _mysql:_mysql /var/mysql/

2. 下载mysql, 我下的版本为mysql-5.5.18, 执行以下跨平台编译命令:

cmake -DCMAKE_INSTALL_PREFIX=/usr/local/server/mysql -DMYSQL_DATADIR=/var/mysql/data -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_MEMORY_STORAGE_ENGINE=1 -DWITH_MYISAM_STORAGE_ENGINE=1 -DSYSCONFDIR=/etc/ -DWITH_SSL=yes -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_READLINE=on

3. 编译, 安装:

make
sudo make install

4. 改变mysql目录的权限:

sudo chmod +w /usr/local/server/mysql
sudo chown -R _mysql:_mysql /usr/local/server/mysql

5. 创建库软链接:

sudo ln -s /usr/local/server/mysql/lib/lib* /usr/lib/

6.  copy配置文件到etc目录:

cp /usr/local/server/mysql/support-files/my-large.cnf /etc/my.cnf
[client]
default-character-set = utf8

[mysqld]
character-set-server = utf8
default-storage-engine = MyISAM
basedir = /usr/local/server/mysql
datadir = /var/mysql/data
log-error = /var/mysql/mysql_error.log
pid-file = /var/mysql/mysql.pid

7. 建立初始数据表:

sudo /usr/local/server/mysql/scripts/mysql_install_db --basedir=/usr/local/server/mysql --datadir=/var/mysql/data --user=_mysql

8. 设置root密码:

sudo /usr/local/server/mysql/bin/mysqladmin -u root password 'mysql'

9.启动mysql:

sudo /usr/local/server/mysql/bin/mysqld_safe --user=_mysql &

10. 测试安装是否成功:

/usr/local/server/mysql/bin/mysql -u root -p -S /tmp/mysql.sock

 

php编译安装:

1. 编译安装php:

./configure –prefix=/usr/local/server/php –with-config-file-path=/usr/local/server/php/etc –enable-fpm –with-openssl –with-zlib –enable-mbstring –with-mcrypt –with-mysql=/usr/local/server/mysql –with-mysql-sock=/tmp/mysqld.sock –with-mysqli=/usr/local/server/mysql/bin/mysql_config –enable-sockets –without-iconv –with-curl=/opt/local/bin/curl

2. 复制php.ini-development到编译时指定的php配制目录:

sudo cp php.ini-development /usr/local/server/php/etc/php.ini

3. 复制phpfpm的配置文件到其配制目录:

sudo cp php-fpm.conf.default php-fpm.conf

4. 重命名phpfpm执行文件为正常名称:

sudo mv php-fpm.dSYM php-fpm

5. 启动:

sudo /usr/local/server/php/sbin/php-fpm

6. 安装xdebug

1) 进入http://xdebug.org/find-binary.php网址, 输入phpinfo返回的html源码后其会自动生成安装步骤, 按照其方法编译安装, 最后变更php.ini配制文件指定xdebug.so扩展路径。

7. 安装phpunit

1) 升级pear.

sudo /usr/local/server/php/bin/pear upgrade

2) 安装phpunit.

sudo ./pear config-set auto_discover 1
sudo ./pear install pear.phpunit.de/PHPUnit

3) 测试phpunit是否安装成功.

/usr/local/server/php/bin/phpunit

#有输出帮助信息则为正常。


nginx编译安装:

1. 编译安装:

./configure --user=_www --group=_www --prefix=/usr/local/server/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_sub_module
make
sudo make install

2. 修改nginx配置:

sudo vim /usr/local/server/nginx/conf/nginx.conf

#指定程序运行权限:
user _www _www;
#在http内添加一条server信息:
server {
    listen 80; 
    server_name localhost;
    root /var/www;

    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
        include fastcgi_params;
    } 
}

3.启动:

sudo /usr/local/server/nginx/sbin/nginx

#没有任何返回则说明执行成功。

 

参考文章:

lnap最新方案   http://www.yunwei8.com/nginx/

xcode4.3开启gcc/g++

真的坑爹,今天才开始玩MAC OX,装了个最新版本的10.7.3,只能装XCODE 4.3 这个月刚发行的版本。
安装时发现没有install过程,直接双击就进入开发环境了。而且装完后没有gcc 等各种编译工具,在TERMINAL下各种命令不识别,想装ruby的各种开发工具,都不行了。

查了半天才发现:
Apple announced Xcode 4.3 for OSX Lion and 4.4 for OSX Mountain Lion last week. The major difference is that Xcode no longer provide an installer which is good thing because you now could update Xcode with AppStore in the future, plus it is much easier to carry the development environment with you. However, there is a little problem with this new version of Xcode, is that all command line toolsets and compilers are not visible in terminal.

解决方案一:
A simple fix is to update your PATH env:
export PATH=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:$PATH
Please be noted that clang does not reside in /Developer/usr/bin, it is now in /Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
Now you could access to gcc, g++, git or any toolsets bundled with Xcode. For your convenience, it is recommended to include it in your .bash_profile.
解决方案二:
You can install these additional tools directly in Xcode :
Preferences > Downloads > Command Line Tools > Install

beanstalkd 消息队列的第一手资料

beanstalk 消息队列 小结
协议说明和各状态转换情况

基本知识点:
1. 对于beanstalk 消息队列中每条数据都为 job
2. beanstalk service端 ,会维护 tubes[多个管道]
3. client端可以监听,使用多 tube
4. client端可以指定 use 管道[ client生成一个新的job时会把此job提交到 指定管道]
5. client端可以指定 watch 管道 [ client接收处理job时会到 指定管道得到待处理的job]

官方示意图:
put reserve delete
—–> [READY] ———> [RESERVED] ——–> *poof*

一般情况:
1. 任务提交到service端,job 管理放入内存空间并为其标记状态 [READY]
2. client通过轮训竞争得到次状态, job 改为 [RESERVED]
2.1 当在默认时间 120 秒内没处理完 , job.stats.timeouts 就会大于 0
同时其他 轮训竞争client会拿到这个job【 注意了 每次timeouts时,在轮训的客户端就会得到次job,状态都为 ready,timeouts>0 】
3. 随便其中一台client处理完 job.delete , 其他 client 中的此job 都会 *poof*

deom – python beanstalkc 中 job.stats 参考:
使用 easy_install beanstalkc
API 参考 : http://github.com/earl/beanstalkc/blob/master/TUTORIAL
刚生成的 beanstalk
{‘buries’: 0, ‘releases’: 0, ‘tube’: ‘default’, ‘timeouts’: 0, ‘ttr’: 120,
‘age’: 6, ‘pri’: 2147483648L, ‘delay’: 0, ‘state’: ‘reserved’, ‘time-left’: 114,
‘kicks’: 0, ‘id’: 2}

以timeout了的 beanstalk,并且在其他client轮训到 job
{‘buries’: 0, ‘releases’: 0, ‘tube’: ‘default’, ‘timeouts’: 1, ‘ttr’: 120,
‘age’: 417, ‘pri’: 2147483648L, ‘delay’: 0, ‘state’: ‘reserved’, ‘time-left’: 110,
‘kicks’: 0, ‘id’: 2}
{‘buries’: 0, ‘releases’: 0, ‘tube’: ‘default’, ‘timeouts’: 1, ‘ttr’: 120, ‘age’: 415,
‘pri’: 2147483648L, ‘delay’: 0, ‘state’: ‘reserved’, ‘time-left’: 4294967163L,
‘kicks’: 0, ‘id’: 2}

当没所有client 的 job 都到期 了 状态
{‘buries’: 0, ‘releases’: 0, ‘tube’: ‘default’, ‘timeouts’: 2, ‘ttr’: 120,
‘age’: 417, ‘pri’: 2147483648L, ‘delay’: 0, ‘state’: ‘ready’, ‘time-left’: 4294967161L,
‘kicks’: 0, ‘id’: 2}
{‘buries’: 0, ‘releases’: 0, ‘tube’: ‘default’, ‘timeouts’: 2, ‘ttr’: 120, ‘age’: 415,
‘pri’: 2147483648L, ‘delay’: 0, ‘state’: ‘ready’, ‘time-left’: 4294967163L,
‘kicks’: 0, ‘id’: 2}

其中 client1 job.delete
client1 job.stats *poof*
client2 job.stats *poof*

比较全的状态说明 – [官方文档]
http://github.com/kr/beanstalkd/blob/v1.1/doc/protocol.txt?raw=true

官方示意图:

先简单说明下(完全自己理解的,欢迎拍砖。本人E人太差~看官档费劲,谅解下):
job.stats状态 = [READY] 待处理, [RESERVED] 正处理, [DELAYED]延迟状态 , [BURIED] 隐藏状态

1. 延迟提交
py.client1.put>>> beanstalk.put(‘yes!’, delay=10)
py.client3.reserve>>> job = beanstalk.reserve()
# 等待 10 秒

2. 管道测试
put-job到service端 可以指定 put的tube管道
如:

py.client1.put>>> beanstalk.use(‘foo’)
py.client1.put>>> beanstalk.put(‘hey!’)

py.client2.reserve>>> job = beanstalk.reserve()
# 一直拥塞,应为 他 watch 管道 ‘default’

py.client3.reserve>>> beanstalk.watch(‘foo’)
# beanstalk.ignore(‘bar’) 放弃监听 bar
py.client3.reserve>>> job = beanstalk.reserve()
py.client3.reserve>>> job.body #输出 ‘hey!’

3. 隐藏状态 现在吧 client 1/2/3 的 use watch 的管道都调回 default
py.client2.reserve>>> job = beanstalk.reserve()
py.client3.reserve>>> job = beanstalk.reserve()
py.client1.put>>> beanstalk.put(‘隐藏状态!’)
py.client2.reserve>>> job.bury() #2 轮训得到 并且 修改 job 为隐藏状态
# 120 秒后 client3 没有轮训得到 此job
py.client2.reserve>>> job.stats()
{‘buries’: 1, ‘releases’: 0, ‘tube’: ‘default’, ‘timeouts’: 0, ‘ttr’: 120,
‘age’: 188, ‘pri’: 2147483648L, ‘delay’: 0, ‘state’: ‘buried’,
‘time-left’: 4294967228L, ‘kicks’: 0, ‘id’: 11}
py.client2.reserve>>> beanstalk.kick( job.stats()[‘id’] ) #修改状态为 reserved
# 立刻 client3 得到 job
py.client3.reserve>>> job.stats()
{‘buries’: 1, ‘releases’: 0, ‘tube’: ‘default’, ‘timeouts’: 0, ‘ttr’: 120, ‘age’: 313,
‘pri’: 2147483648L, ‘delay’: 0, ‘state’: ‘reserved’,
‘time-left’: 110, ‘kicks’: 1, ‘id’: 11}
# 这时候 client2 / 3 同时 有 job 11 状态 ‘buries’: 1,’timeouts’: 0,’state’: ‘reserved’

4. peek 窥见
可以得到 一个 stats – read 的 job ,其他 client 可以 job = beanstalk.reserve()
后马上 job.stats 会变成 [RESERVED]
py.client2.reserve>>> job = beanstalk.peek_ready()
取得 job 并看 本 client 能 处理能
>>> job = beanstalk.peek(3)
>>> job.body
‘yes!’
>>> job.stats()[‘state’]
‘ready’
这种形式西 job 不能 bury 等修改状态,但 可以 delete

peek 系类
peek_buried
peek_ready

linux tar分卷压缩方法

linux下备份网站数据,由于文件很多,打包成一个文件会比较大,所以想分卷压缩成每个900M的文件,方便下载与上传到网盘备份。

1.分卷压缩,使用tar+split组合
进入网站目录,执行:
tar cvzf – web| split -b 900m

2.合并
cat x* > web.tar.gz

3.解压
tar xvzf web.tar.gz

一年一度的回家过大年的行动就要开始了

元旦加班,第二天也就是2号,起个大早,打开电脑准备秒杀回家火车票!
12306不给力,登了十多分钟才登上去,十点杭州放票,快十点半了票都没刷出来,等不了了,直接电话95105105,一打就通。然后屁颠屁颠得跑到城站火车站取票。

随便在火车站附近找了个小店吃饭。小店的水煮鱼非常给力!

13号的票,也就是这周五了。开始想念妈妈做的菜了····

首位国人PHP开发组成员以及他的Yaf

PHP开发组终于有了国人参与,  最近, Laruence(http://www.laruence.com),真名惠新宸,加入了PHP语言官方开发组.  做PHP的同学一定很熟悉他了, 他的博客风雪之隅发表了很多PHP源代码分析和扩展开发相关的文章.

 

他使用PHP扩展开发的PHP框架Yaf, 也进入了PHP官方扩展库(http://pecl.php.net/package/yaf),  这个框架借鉴目前最流行的PHP开发框架Zend Framework的设计, 迁移成本很低. 不过目前Yaf的英文文档还很不完善:http://www.php.net/manual/en/book.yaf.php, 中文文档稍微完善一些:http://yaf.laruence.com/manual/

Yaf的优点:
1. 用C语言开发的PHP框架, 相比原生的PHP, 几乎不会带来额外的性能开销.
2. 所有的框架类, 不需要编译, 在PHP启动的时候加载, 并常驻内存.
3. 更短的内存周转周期, 提高内存利用率, 降低内存占用率.
4. 灵巧的自动加载. 支持全局和局部两种加载规则, 方便类库共享.
5. 高性能的视图引擎.
6. 高度灵活可扩展的框架, 支持自定义视图引擎, 支持插件, 支持自定义路由等等.
7. 内建多种路由, 可以兼容目前常见的各种路由协议.
8. 强大而又高度灵活的配置文件支持. 并支持缓存配置文件, 避免复杂的配置结构带来的性能损失.
9. 在框架本身,对危险的操作习惯做了禁止.
10.更快的执行速度, 更少的内存占用.

Yaf现在在国外已经被很多人关注, 包括Zend Framework的作者, 也在twitter上推荐了Yaf:
julienPauli:
pecl/yaf finally made it : A framework, inspired by ZendFramework, entirely writen in a C extension

九月底的流水帐

半个月前buyvm kvm放货,因为事先写了脚本监控buyvm放货情况,凌晨放货,早上起来是收的email,抢的时候就只剩最后一个了,只是线路不太好,是he的。

刚买的时候并不稳定,应该是有不少人在做测试,就放了半个月,今天顺便付了一下下个月的账单。

新买的kvm准备用来做些垃圾站,赚些宝宝奶粉钱。

目前博客所在vps为buyvm 15$年,很稳定,nlayer 的线路,电信联通速度不错,不常抽!以后接着放博客和其它几个小流量企业站

上周新注册了一个域名 http://lhold.com 目前 还没想好用来做什么站,暂时放一个dedecms 集了些数据。

这周五回南昌过十一了,上星期电话抢的票,就是电话比较难打,定好后,晚上排队取票时非常happy!不怕票卖光了~~~~

mysql 主从同步实例-从同步备份步骤

环境:
A、B的MySQL 数据库 版本同为5.0.24

A:主服务器
操作系统:Windows xp
IP地址:192.168.0.81
B:从服务器
操作系统:Windows xp
的IP地址:192.168.0.82

配置过程:
1、在A的数据库中建立一个备份帐户,命令如下:
GRANT REPLICATION SLAVE,RELOAD,SUPER ON *.*
TO test@’192.168.0.82 ‘
IDENTIFIED BY ‘1234’;

建立一个帐户test,并且只能允许从192.168.0.82这个地址上来登陆,密码是1234。

在B Slave上做连接测试:

mysql -h 192.168.0.81 -u test -p

2、对A服务器的配置进行修改,打开mysql/my.ini文件,在[mysqld]下面添加如下内容:
server-id=1
log-bin=D:\server2\mysql\log-bin.log

server-id:为主服务器A的ID值
log-bin:二进制变更日值

继续阅读