Archive for PHP/Mysql

本站表情使用频率统计,排第一的是…呵呵厚。

星期三, 二月 15th, 2012

恩恩…昨晚用手机上了下自己博客,拉到底部看了下表情数量,Orz果然好恐怖啊,看看我的手机截图吧。

今天无聊突然想删减掉一些博客的评论表情好了,删了几个记忆中不常用的,还是有很多表情我都用不到啊,所以我该删哪些呢..

我想到了为何不统计一下博客中每个表情的使用频率?使用数最少的就依次开删嘛.. :hong

于是写了段程序统计了一下文章,以及所有评论中的表情数量。看到了结果,这数量真令人吃惊. :)

上图是前5名的表情被使用次数。

为啥这种弱弱的装哭的表情排名第一?!! 

你们都是受吗? :s1zhuangxia

想看更多的排名的话,可以到“禽兽森林”里面看,或者直接点这个“表情频率排行”传送门过去。

===快递的分割线===

前两天买了3套盗版漫画书。昨天坐等快递。结果,东西没送到我手上,弱弱的公司前台给收了。不知道谁收的,看了下签名哥哥我整个人都无语了。

图片签收,你全家都是图片啊我擦,要是东西出了问题我找谁去啊。 :s1haopapa

===jQuery插件lazyload()插件===

说起这个表情使用频率统计页面,还有一点是想减少些服务器的http请求。想到了很多人博客里都用到的jquery图片延迟插件:jquery lazyload这个插件。下载后检查了下,发现这是个坑爹货 (更多…)

[WP优化]wordpress那坑爹的函数与那坑爹的效率

星期三, 十一月 30th, 2011

一直都感觉wp的效率不太行,一直没去看看到底wp那里慢了。今天有点时间就抽空让我来看看wp首页以及文章页面到底运行了哪些sql吧。 :arrow:

一直都是听说wp每次打开都会有大量的请求,昨天查了一下,首页有近20条的sql查询(不包括我用了memcached缓存的),文章页的话有差不多25条查询,把sql输出一下看傻了。这啥啊各种联表各种表达式。 :s1liuxue

运行wp的get_links_list()函数,监视一下sql可以看到:

SELECT *  , IF (DATE_ADD(link_updated, INTERVAL 120 MINUTE) >= NOW(), 1,0) as recently_updated  , UNIX_TIMESTAMP(link_updated) AS link_updated_f  FROM wp_links  INNER JOIN wp_term_relationships AS tr ON (wp_links.link_id = tr.object_id) INNER JOIN wp_term_taxonomy as tt ON tt.term_taxonomy_id = tr.term_taxonomy_id WHERE 1=1 AND link_visible = 'Y'  AND ( tt.term_id = 2 ) AND taxonomy = 'link_category'    ORDER BY link_name ASC

这句东西。就我现在这种小表都需要0.1秒的查询时间,表大了的话,会很搞笑的。所以各位用wp,而且有使用get_links_list()这个函数来获取友链的同学赶紧换其他方式吧。不要用这个函数了。

假如你的友链关系不复杂,像我一样没有做分类什么的,直接用下面这句就行了,不明白wp官方为什么会将link_visible这个字段采用字符型做记录,虽然建了索引但mysql跑去扫全表了。 :s1gouxuelt

select * from wp_links where link_visible='Y' order by link_name asc

于是从查询到显示,可以在页面上搞这么一段:

#global $wpdb;	//这应该写不写无所谓
$links_wpdb = $wpdb->get_results("select * from wp_links where link_visible='Y' order by link_name asc");

if( $links_wpdb ) {
        foreach( $links_wpdb as $k=>$v ) {
                $tmpstr .= '< li >< a title="'.$v->link_description.'" href="'.$v->link_url.'" target="'.$v->link_target.'">'.$v->link_name.'< /a >< / li >'; //注意去掉一些地方的空格
        }
        echo $tmpstr;
}

假如你的服务器安装了memcached,那么可以这样,加了缓存减少数据库压力 :s1niuyao
(更多…)

FLASH上传图片传值二进制数据给PHP处理

星期六, 九月 17th, 2011


不知道写这种文章会不会太经常了?好像前几天才更新了一篇啊?这篇本来是昨晚发出来的,忘记了… :s1ruo

X咧这破东西之前没有做过,FLASH咋传值给PHP我都不知道,更不用说传图片了。
问了做FLASH的同事,说是已经把图片截图需要的区域打包成二进制数据post给我了,Orz哥哥我没做过只能硬着头皮上了。
查了下资料,嘿,很简单嘛。

$img = $GLOBALS["HTTP_RAW_POST_DATA"];

if(empty($img)) {
	$img = file_get_contents('php://input');
}

$fp = fopen($filename,"w");
fwrite($fp,$img);
fclose($fp);

这样直接写文件就行了~但是发现不对啊,生成的图片都是傻逼的啊,傻逼windows解析不出来啊…
(更多…)

CentOS 5.5下安装Apache,PHP,MYSQL等玩具

星期四, 九月 8th, 2011

钱丢出去,换来一个纯净的CentOS。唔…前几天不是刚买了个VPS耍么,以后这服务器真是够我折腾啦哈哈哈哈哈。哥哥我很高兴~ :love

话说之前自己做测试环境都是懒得装centOS,一直在用utuntu,apache,mysql这些软件一直都是源码编译安装,好歹这次搞了个centos的VPS,当然就得试试用传说中的yum来过过招。

昨天把博客索性一起搬家到VPS上来了,懒得再同步数据库,所以丢失了那个叫loveeeeeeeeeee的评论一条。 :s1weisuox   今天在中午吃饭时间把rewrite搞了一下,明明不想用rewrite的说…

好吧,那么今晚就把前几天用的yum安装发一下。很简单很简单,简单到极致的LAMP环境安装。

1. 直接丢个yum安装一些大致需要的东西

yum -y install httpd php mysql mysql-server php-mysql httpd-manual mod_ssl mod_perl
mod_auth_mysql php-mcrypt php-gd php-xml php-mbstring php-ldap php-pear php-xmlrpc
mysql-connector-odbc mysql-devel libdbi-dbd-mysql

2. 上面程序运行完后要给安装的程序添加开机启动并启动起来~~

chkconfig --levels 235 mysqld on
/etc/init.d/mysqld start

//apache开机启动,然后当然是启动服务了
chkconfig --levels 235 httpd on
/etc/init.d/httpd start

3. 修改下mysql密码,直接命令行上敲,要是报错的话临时其实可以用mysqladmin的绝对位置+后面的命令

mysqladmin -u root password '你的新密码'

4. 好像现在httpd服务也开了,mysql也启动了,最简单的环境不是已经安装好了嘛?写个phpinfo文件查看下各种配置,好像php,mysql的版本有点老了哦

# rpm --import http://www.jasonlitka.com/media/RPM-GPG-KEY-jlitka

# vi /etc/yum.repos.d/CentOS-Base.repo 增加下面信息

[utterramblings]
name=Jason's Utter Ramblings Repo
baseurl=http://www.jasonlitka.com/media/EL$releasever/$basearch/
enabled=1
gpgcheck=1
gpgkey=http://www.jasonlitka.com/media/RPM-GPG-KEY-jlitka
//用下面这两句升级一下php,mysql~
#yum update php
#yum update mysql

就这样就完成了简单的LAMP环境搭建,简单暴力。不想这么简单的可以自己下源码编译,嘿嘿,其实感觉自己编译的更有感觉一点?囧囧

这真的算是很简单的安装了,还有一些模块没有安装,大家在后面的使用中自然会碰到,反正碰到问题见招拆招,咱以不变应万变,不怕。细细索索的东西就不写了(其实是有碰到挺多问题但是我都忘了哈,股沟一下而已) :P

哦,对了,SSH好像正常使用就不说安装了,FTP得有一个:

yum install vsftpd

注意上网查一下更改下权限就可以了~

(更多…)

[难得技术] Mysql的索引测试与sql语句优化

星期二, 四月 26th, 2011

建立测试数据表

CREATE TABLE `milliontest` (
`id` INT( 11 ) NOT NULL AUTO_INCREMENT ,
`name` CHAR( 100 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' ,
`content` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '',
`time` INT( 11 ) NOT NULL DEFAULT '0',
`lastmodify` DATETIME NOT NULL,
PRIMARY KEY ( `id` )
) ENGINE = Myisam

用上面的语句创建一个测试用的表。表中包含5个字段,自增主键ID,标题名字name,内容content以及创建时间time与最后编辑时间lastmodify,其中time字段用时间戳而编辑时间为年月日格式。由于目前表内没有任何数据,接下来当然是往表里灌数据,灌上100W(唬人用)。

我写了一个php脚本来完成这个任务。代码如下,各位大大不要耻笑:

set_time_limit(0);
$conn = mysql_connect('localhost', 'root', '');
mysql_select_db('test');

$titles 	= array(
'任天堂3DS发售,2000RMB兲朝币',
 '明猪昨天买了飞行俱乐部', '前天第一次玩街霸网战虐人了!'
);
$contents	= array(
'据美国国家地理网站报道,美国“国家地理新闻”网站刊登了过去一周的精彩太空图片。
这些图片集中展现了极光、土卫一“米玛斯”、Abell 383星系团以及好似绿龙般的SH 
2-235星云等壮观景象',
'由于北极气候变暖,大量永冻土带融化,流入海洋。新研究发现,北极部分地区的永
久冻结带每年遭侵蚀的程度最多达到100英尺(约合30米)。');

$max = 1000000;
mysql_query("set names utf8");

for($i = 0; $i < $max; $i++) {
	$tn	= array_rand($titles);
	$cn	= array_rand($contents);
	$time	= time();
	$lastmodify = date('Y-m-d H:i:s');
	$res = mysql_query('insert into milliontest set name="'.$titles[$tn].'",
 content="'.$contents[$cn].'", time="'.$time.'", lastmodify="'.$lastmodify.'"');
	file_put_contents('million_log.txt', $i);
}

花了20多分钟时间数据库里终于有100w的数据了,泪流满面。那么下面就打开mysql终端开始华丽的测试一下。

select * from milliontest where time=1303812283;
/*略去搜索结果*/
146 rows in set (8.16 sec)

一条简单的查询就花了小小的8秒钟时间哦,要是100个人同时访问某个页面而同时运行了这条简单的语句,结果会怎么样咩? :s1hiahia

这里我又做了另一个测试,注意跟上面那条sql语句的区别:

select * from milliontest where time='1303812283';
/*略去搜索结果*/
146 rows in set (55.98 sec)

看到这查询时间,我自己都扭曲了,我只是查询一个想要的结果而已,却花56秒近1分钟的时间来等待查询。所以小提一下sql语句中各位注意一下引号吧。
又做了几组测试,时间多在8秒波动,有空各位自己慢慢测~

现在给time字段加一个索引

mysql> alter table milliontest add index (`time`);
Query OK, 1000000 rows affected (33.88 sec)
Records: 1000000  Duplicates: 0  Warnings: 0

建完索引,继续做一下上面的测试吧,嘻嘻。 :s1kila

mysql> select * from milliontest where time='1303812291';

615 rows in set (0.05 sec)

加了索引后这次花了0.05秒,相对之前的数据,速度提升相当多吧哈哈哈。不过这么简单的查询却花了0.05秒,对于并发量大的时候估计也不乐观咩,咱们试试去掉引号?

mysql> select * from milliontest where time=1303812283;

146 rows in set (0.00 sec)

爽吧!花费时间0.00! :s1nihaha

体会到了索引带来的好处了吧,不过话说我突然想起来,跑去看了一下这张表占的磁盘容量,泪流满面我没找到wamp这个软件吧索引文件丢到哪去了,总之之前我在自己ubuntu下做的测试好像加表数据占了磁盘800M还是多少,忘了

分页的SQL优化(limit优化)

之前在网上看的时候看到很多关于limit优化的文章,不小心看到一篇分页优化,哎哟看完那篇文章之后,我突然恍然大悟,附我跟主管的某段对话:

主管:好像现在后台有点慢?
我:估计是数据正在批量入库的缘故,不快。

但事后我重新测试了下后台,速度还是NN慢。刚好想到某篇分页测试的文章,提到:
select id,name from milliontest limit 0,20;的速度与select id,name from milliontest limit N,20;
不一样,查询结果的速度取决于N,也就是N越大,速度越慢。
嘴巴说没什么用,还是看事实。

mysql> select id,name from milliontest limit 0,20;
20 rows in set (0.00 sec)
而
mysql> select id,name from milliontest limit 100000,20;
20 rows in set (0.25 sec)
再看
mysql> select id,name from milliontest limit 500000,20;
20 rows in set (1.05 sec)

明显查询时间有了小增长吧。后面的时间更恐怖哟。所以很多论坛之类的,数据太久的就不显示出来了,或者加缓存,那是其他的技术咯。 (更多…)