imagemagick 图片格式转换、降低图片质量、等比缩放和居中补白

图片格式转换、降低图片质量:

#-quality 70: 把图片的质量压缩到70%
$ convert test.png -quality 70 test.jpg

等比缩放:

$this->convert_cmd="/usr/bin/convert";

$size = "80x80";//图片尺寸

//源图片:$image;等比缩放后图片:$tmp_img
exec("{$this->convert_cmd} -resize $size '$image' '$tmp_img'");

居中补白:
服务器端需要安装最新的imagemagick:http://www.imagemagick.org/script/install-source.php#unix

$this->convert_cmd="/usr/bin/convert";

$size = "80x80";//图片尺寸

//源图片:$image;补白后图片:$tmp_img
exec("{$this->convert_cmd} -resize $size -background white -gravity center -extent $size '$image' '$tmp_img'");

[转]TextMate 快捷键

mac: textmate常用快捷键

mate file 终端下mate打开文件
commond + option + L 显示行号
commond + F 页面搜索文字
commond + shift + F 项目搜索文字
commond + G 下一个搜索文字
commond + shift + G 上一个搜索文字
commond + option + F 替换一个
commond + ctrl + F 全部替换
ctrl + A 光标回到行首
ctrl + E 光标回到行尾
ctrl + L 自动生成 =>
ESC 自动补全
commond + S 保存
commond + option + S 全部保存
commond + shift + S 另存为。。。。
ctrl + w 选取一个单词
commond + shift + -> 选中光标右面的内容
commond + shift + <- 选中光标左面的内容 option|ctrl + shift + > 选中光标右面的单词
option|ctrl + shift + < 选中光标左面的单词 commond + shift + L 选取一行信息 commond + L 定位到某一行 commond + option + -> textmate项目中右面的标签
commond + option + <- textmate项目中左面的标签 commond + 数字 选择某个标签 ctrl + tab 在菜单栏和页面切换 commond + -> 光标回到行尾
commond + <- 光标回到行首 commond + ^ 光标回到页首 commond + 下箭头 光标回到页尾 option|ctrl + -> 光标向右移动一个单词
option|ctrl + <- 光标向左移动一个单词
ctrl + 上箭头 向上移动下拉菜单
ctrl + 下箭头 向下移动下拉菜单
ctrl + shift + K 删除一行
commond + / 注释一行
commond + z 返回前一个内容
commond + shift + z 返回后一个内容
commond + ] 增加缩进
commond + [ 减少缩进
ctrl + commond + 上箭头 向上移动整行
ctrl + commond + 下箭头 向下移动整行
commond + option + [ 格式化代码
commond + shift + T 当前文件中所有方法的
commond + T 打开项目下的文件
commond + O 打开项目
commond + N 新建文件
ctrk + shift + A 鼠标指向目录,按快捷键,打开svn选项
commond + W 关闭标签
commond + shift + W 关闭项目
commond + option + L 显示行号
commond + X 剪切
commond + C 复制
commond + V 粘帖
ctrl + option + commond + V 从历史中选择内容粘帖
commond + M 最小法
commond + F2 标记
F2 在标记间切换

MYSQL PARTITION 分区

拆表:
ALTER TABLE `cdb_posts` PARTITION BY KEY (`pid`) PARTITIONS 20;
恢复:
ALTER TABLE `cdb_posts` REMOVE PARTITIONING;

如果创建的是MyISAM表类型的话,则会发现:

PHP函数 fgetcsv 中文问题

今天使用fgetcsv,打开上传的CSV文件后,发现文件列中包含中文的都为空。

解决方案:
// utf-8
setlocale(LC_ALL, ‘en_US.UTF-8′);
// 简体
setlocale(LC_ALL, ‘zh_CN’);

以下是常用的地区标识:
zh_CN GB2312
en_US.UTF-8 UTF-8
zh_TW BIG5
zh_HK BIG5-HKSCS
zh_TW.EUC-TW EUC-TW
zh_TW.UTF-8 UTF-8
zh_HK.UTF-8 UTF-8
zh_CN.GBK GBK

例子:

setlocale(LC_ALL, 'zh_CN.GBK');

$goods_csv=$_FILES['goods_info']['tmp_name']; //CSV编码为ANSI

$file = fopen($goods_csv,'r');

while ($data = fgetcsv($file)) {
    $goods_list[] = $data;
}

foreach($goods_list as $key=>$value){
    foreach($value as $k=>$v){
        //由于PHP文件编码是UTF-8,把GBK转码成UTF-8
        $goods_list[$key][$k] = mb_convert_encoding($v, "UTF-8", "GBK");
    }
}
print_r($goods_list);

fclose($file);

[转]Mysql数据存储引擎InnoDB和MyISAM区别

MyISAM:这个是默认类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写,它是存储记录和文件的标准方法.与其他存储引擎比较,MyISAM具有检查和修复表格的大多数工具. MyISAM表格可以被压缩,而且它们支持全文搜索.它们不是事务安全的,而且也不支持外键。如果事物回滚将造成不完全回滚,不具有原子性。如果执行大量的SELECT,MyISAM是更好的选择。

InnoDB:这种类型是事务安全的.它与BDB类型具有相同的特性,它们还支持外键.InnoDB表格速度很快.具有比BDB还丰富的特性,因此如果需要一个事务安全的存储引擎,建议使用它.如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表,对于支持事物的InnoDB类型的标,影响速度的主要原因是AUTOCOMMIT默认设置是打开的,而且程序没有显式调用BEGIN 开始事务,导致每插入一条都自动Commit,严重影响了速度。可以在执行sql前调用begin,多条sql形成一个事物(即使autocommit打开也可以),将大大提高性能。

InnoDB和MyISAM是在使用MySQL最常用的两个表类型,各有优缺点,视具体应用而定。下面是已知的两者之间的差别,仅供参考。

InnoDB

InnoDB 给 MySQL 提供了具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。InnoDB 提供了行锁(locking on row level),提供与 Oracle 类型一致的不加锁读取(non-locking read in SELECTs)。这些特性均提高了多用户并发操作的性能表现。在InnoDB表中不需要扩大锁定(lock escalation),因为 InnoDB 的列锁定(row level locks)适宜非常小的空间。InnoDB 是 MySQL 上第一个提供外键约束(FOREIGN KEY constraints)的表引擎。

InnoDB 的设计目标是处理大容量数据库系统,它的 CPU 利用率是其它基于磁盘的关系数据库引擎所不能比的。在技术上,InnoDB 是一套放在 MySQL 后台的完整数据库系统,InnoDB 在主内存中建立其专用的缓冲池用于高速缓冲数据和索引。 InnoDB 把数据和索引存放在表空间里,可能包含多个文件,这与其它的不一样,举例来说,在 MyISAM 中,表被存放在单独的文件中。InnoDB 表的大小只受限于操作系统的文件大小,一般为 2 GB。

InnoDB所有的表都保存在同一个数据文件 ibdata1 中(也可能是多个文件,或者是独立的表空间文件),相对来说比较不好备份,免费的方案可以是拷贝数据文件、备份 binlog,或者用 mysqldump。

MyISAM

MyISAM 是MySQL缺省存贮引擎 .

每张MyISAM 表被存放在三个文件 。frm 文件存放表格定义。 数据文件是MYD (MYData) 。 索引文件是MYI (MYIndex) 引伸。

因为MyISAM相对简单所以在效率上要优于InnoDB..小型应用使用MyISAM是不错的选择.

MyISAM表是保存成文件的形式,在跨平台的数据转移中使用MyISAM存储会省去不少的麻烦

以下是一些细节和具体实现的差别:

1.InnoDB不支持FULLTEXT类型的索引。

2.InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count(*)语句包含 where条件时,两种表的操作是一样的。

3.对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。

4.DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。

5.LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用。

另外,InnoDB表的行锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,例如update table set num=1 where name like “%aaa%”

任何一种表都不是万能的,只用恰当的针对业务类型来选择合适的表类型,才能最大的发挥MySQL的性能优势。

以下是InnoDB和MyISAM的一些联系和区别:

1. 4.0以上mysqld都支持事务,包括非max版本。3.23的需要max版本mysqld才能支持事务。

2. 创建表时如果不指定type则默认为myisam,不支持事务。

可以用 show create table tablename 命令看表的类型。

2.1 对不支持事务的表做start/commit操作没有任何效果,在执行commit前已经提交,测试:

执行一个msyql:

  use test;

  drop table if exists tn;

  create table tn (a varchar(10)) type=myisam;

  drop table if exists ty;

  create table ty (a varchar(10)) type=innodb;

  begin;

  insert into tn values(‘a’);

  insert into ty values(‘a’);

  select * from tn;

  select * from ty;

  都能看到一条记录

  执行另一个mysql:

  use test;

  select * from tn;

  select * from ty;

  只有tn能看到一条记录

  然后在另一边

  commit;

  才都能看到记录。

3. 可以执行以下命令来切换非事务表到事务(数据不会丢失),innodb表比myisam表更安全:

  alter table tablename type=innodb;

3.1 innodb表不能用repair table命令和myisamchk -r table_name,但可以用check table,以及mysqlcheck [OPTIONS] database [tables]

4. 启动mysql数据库的命令行中添加了以下参数可以使新发布的mysql数据表都默认为使用事务(只影响到create语句。)

  –default-table-type=InnoDB

  测试命令:

  use test;

  drop table if exists tn;

  create table tn (a varchar(10));

  show create table tn;

5. 临时改变默认表类型可以用:

  set table_type=InnoDB;

  show variables like ‘table_type’;

  或:

  c:\mysql\bin\mysqld-max-nt –standalone –default-table-type=InnoDB

[转载]http://www.alixixi.com/program/a/2011012867299.shtml

PHP 获取文件大小

//获取文件大小
function getFileSize($url){
    $url = parse_url($url);
    if($fp = @fsockopen($url['host'],empty($url['port'])?80:$url['port'],$error)){
          fputs($fp,"GET ".(empty($url['path'])?'/':$url['path'])." HTTP/1.1\r\n");
          fputs($fp,"Host:$url[host]\r\n\r\n");
          while(!feof($fp)){
                $tmp = fgets($fp);
                if(trim($tmp) == ''){
                    break;
                }else if(preg_match('/Content-Length:(.*)/si',$tmp,$arr)){
                    //正则表达式i:大小写; s:忽略无意义符号:空格,换行及全角XX;
                    return trim($arr[1]);
                }
          }
          return null;
    }else{
          return null;
    }
}

Linux LFS

LFS——Linux From Scratch,就是一种从网上直接下载源码,从头编译LINUX的安装方式。它不是发行版,只是一个菜谱,告诉你到哪里去买菜(下载源码),怎么把这些生东西( raw code) 作成符合自己口味的菜肴──个性化的linux,不单单是个性的桌面。 (转自百度百科)

之前有接触过,但是没有能安装完成。明天开始根据LFS文档来安装自己的第一个LFS,fighting!!!

NOSQL mongodb与php

第一个mongodb与php测试用例:

<?php
try {
$conn = new Mongo();
}catch(Exception $e){
die('Fail');
}

$db = $conn->test;

//mongo认证,返回array([ok]=>1)表示认证成功
print_r($db->authenticate("admin", "123456"));

$cursor = $db->data->find();

while ($cursor->hasNext()){
$result[] = $cursor->getNext();
}
print_r($result);

增删改查:

<?php
try {
$conn = new Mongo();
}catch(Exception $e){
die('Fail');
}

$db = $conn->test;

$db->authenticate("admin", "123456");

$collection = $db->data;

//新增
$user = array('name' => 'admin', 'email' => 'admin@admin.com');
$collection->insert($user); 

//删除
$collection->remove(array('name'=>'test'), array("email" => "admin@admin.com"));  

//修改
$newdata = array('$set' => array("email" => "test@test.com"));
$collection->update(array("name" => "admin"), $newdata);

//查找一条
$user = $collection->findOne(array('name' => 'admin'), array('email'));  //查找name=admin的某一行中的email列值
var_dump($user);

NOSQL mongodb 安装及简介

简介
NOSQL:指的是非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。
MongoDB:是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。

安装
服务端:

$ cd /home/super
$ wget http://fastdl.mongodb.org/linux/mongodb-linux-i686-1.6.5.tgz
$ tar -zxvf mongodb-linux-i686-1.6.5.tgz
$ mv mongodb-linux-i686-1.6.5 /usr/local/mongodb
$ cd /usr/local/mongodb
$ mkdir /data
$ mkdir /data/mongodb
$ ./mongod --fork --dbpath /data/mongodb --logpath /data/mongod.log --maxConns 1000 --directoryperdb --auth --quiet --logappend &
$ netstat -ln #查看******

显示如下图所示:

测试:

$ ./mongo
>help
db.help()                    help on db methods
db.mycoll.help()             help on collection methods
rs.help()                    help on replica set methods
help connect                 connecting to a db help
help admin                   administrative help
help misc                    misc things to know

show dbs                     show database names
show collections             show collections in current database
show users                   show users in current database
show profile                 show most recent system.profile entries with time >= 1ms
use                 set current database
db.foo.find()                list objects in collection foo
db.foo.find( { a : 1 } )     list objects in foo where a == 1
it                           result of the last line evaluated; use to further iterate
> use test #选择数据库,test可以是从未建立过的数据库
switched to db test
> a={name:'test'}
{"name":"test"}
> b={url:'http://www.test.com'}
{ "url" : "http://www.test.com" }
> db.data.save(a) #将数据保存到data表中,data表可以是从未建立过的数据表
> db.data.save(b)
> db.data.find()  #数据查询
{ "_id" : ObjectId("4d7f7c1076568212fe4efbad"), "name" : "test" }
{ "_id" : ObjectId("4d7f7c1876568212fe4efbae"), "url" : "http://www.test.com" }
> show collections #显示test库下所有的表
data
system.indexes
> db.data.find().limit(1) #只显示一条记录
{ "_id" : ObjectId("4d7f7c1076568212fe4efbad"), "name" : "test" }
#增加认证,添加管理员
> use admin
> db.addUser("admin","123456");
#以后登录mongodb必须认证
> use admin
> db.auth("admin","123456")
> db.shutdownServer()

安装rockmongo://MongoDB可视化管理工具

$ mkdir /var/www/html/rockmongo
$ cd /var/www/html/rockmongo
$ wget http://rock-php.googlecode.com/files/rockmongo-v1.0.12.1.zip
$ unzip rockmongo-v1.0.12.1.zip
#修改管理员名和密码
$ vim config.php

mongo-php-driver: //参照:http://www.php.net/manual/en/mongo.installation.php#mongo.installation.nix

$ cd /home/super
$ wget --no-check-certificate https://github.com/mongodb/mongo-php-driver/tarball/master
$ tar -zxvf mongodb-mongo-php-driver-1.1.4-4-g0c16c89.tar.gz
$ cd mongodb-mongo-php-driver-0c16c89/
$ phpize
$ ./configure
$ make && make install

memcached配置

1.memcache-client //memcached客户端

$ cd /home/super
$ wget http://pecl.php.net/get/memcached-2.1.0.tgz
$ tar -zxvf memcached-2.1.0.tgz
$ cd memcached-2.1.0
$ /usr/local/bin/phpize #使用phpize建立php扩展
$ ./configure --prefix=/usr/local/memcached --with-php-config=/usr/local/bin/php-config
$ make && make install
#记录下一个很长的路径:/usr/local/lib/php/extensions/no-debug-zts-20090626/

$ vim /usr/local/php/lib/php.ini #配置php.ini
>extension_dir = "/usr/local/lib/php/extensions/no-debug-zts-20090626/"
>extension=memcached.so
$ /usr/local/apache2/bin/apachectl restart

2.memcached //memcache服务端

#安装 libevent
$ cd /home/super
$ wget http://monkey.org/~provos/libevent-1.3b.tar.gz
$ tart -zxvf libevent-1.3b.tar.gz
$ cd libevent-1.3b
$ ./configure
$ make && make install
#安装 memcached
$ cd /home/super
$ wget http://www.danga.com/memcached/dist/memcached-1.2.2.tar.gz
$ tar -zxvf memcached-1.2.1.tar.gz
$ cd memcached-1.2.1
$ ./configure
$ make && make install
#测试libevent是否安装成功:
$ ls -al /usr/lib | grep libevent
#启动(安装后位置:/usr/local/bin/memcached)
#$ memcached -d -m 128 -l 0.0.0.0 -p 11211 -u root //0.0.0.0对任何客户端都开放memcache
#memcached的基本设置
#启动Memcache的服务器端:
$ /usr/local/bin/memcached -d -m 10 -u root -l 0.0.0.0 -p 12000 -c 256 -P /tmp/memcached.pid
#-d选项是启动一个守护进程,
#-m是分配给Memcache使用的内存数量,单位是MB,我这里是10MB,
#-u是运行Memcache的用户,我这里是root,
#-l是******的服务器IP地址,如果有多个地址的话,我这里指定了服务器的IP地址192.168.0.200,
#-p是设置Memcache******的端口,我这里设置了12000,最好是1024以上的端口,
#-c选项是最大运行的并发连接数,默认是1024,我这里设置了256,按照你服务器的负载量来设定,
#-P是设置保存Memcache的pid文件,我这里是保存在 /tmp/memcached.pid,
#如果要结束Memcache进程,执行:
#kill cat /tmp/memcached.pid
#也可以启动多个守护进程,不过端口不能重复。

成功截图:
写一个phpinfo();的php文件,成功啦~

$ cd /var/www/html
$ vim memcache.php
>$memcache = new Memcache();
>$memcache->connect('127.0.0.1', 12000);
>$memcache->set('key', 'This is a memcache key!', 0, 60);
>$res = $memcache->get('key');
>echo $res;

3.memcached统计监控

$ telnet 127.0.0.1 12000
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
stats
STAT pid 1467
STAT uptime 59525
STAT time 1368585692
STAT version 1.4.15
STAT libevent 2.0.21-stable
STAT pointer_size 64
STAT rusage_user 0.196012
STAT rusage_system 0.232014
STAT curr_connections 5
STAT total_connections 51
STAT connection_structures 6
STAT reserved_fds 20
STAT cmd_get 42
STAT cmd_set 20
STAT cmd_flush 6
STAT cmd_touch 0
STAT get_hits 29
STAT get_misses 13
STAT delete_misses 0
STAT delete_hits 5
STAT incr_misses 0
STAT incr_hits 0
STAT decr_misses 0
STAT decr_hits 0
STAT cas_misses 0
STAT cas_hits 0
STAT cas_badval 0
STAT touch_hits 0
STAT touch_misses 0
STAT auth_cmds 0
STAT auth_errors 0
STAT bytes_read 3520
STAT bytes_written 3893
STAT limit_maxbytes 268435456
STAT accepting_conns 1
STAT listen_disabled_num 0
STAT threads 4
STAT conn_yields 0
STAT hash_power_level 16
STAT hash_bytes 524288
STAT hash_is_expanding 0
STAT bytes 470
STAT curr_items 2
STAT total_items 20
STAT expired_unfetched 0
STAT evicted_unfetched 0
STAT evictions 0
STAT reclaimed 3
END

遇到问题:
如果遇到 memcached:error while loading shared libraries:libevent-1.3b.so.1:cannot open shared object file:No such file or directory.
使用 LD_DEBUG=libs /usr/local/bin/memcached -v 查看其启动的时候,加载lib情况;具体的不列出;
执行:ln -s /usr/local/lib/libevent-1.3b.so.1 /lib/libevent-1.3b.so.1问题可以解决;

第 4 页,共 5 页12345