程序员世界里有哪些名言警局呢?Jun Auza 列出了一些启迪人心的至理名言,它们大多来自产业界富于经验的人们。
下文列出前10个供读者欣赏。
10. "People think that computer science is the art of geniuses but the actual reality is the opposite, just many people doing things that build on each other, like a wall of mini stones."- Donald Knuth
10. “人们认为计算机科学是天才的艺术,但事实完全相反:只是很多人在共同建立起来的事物之上工作,就像一条由小石头铺成的小径。”—— Donald Knuth
9. “First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack.”- George Carrette
9. “首先学会计算机科学和所有的理论。然后发展出一个编程风格。之后便要忘掉所有这些,以自由的方式探索。”—— George Carrette
8. “Most of you are familiar with the virtues of a programmer. There are three, of course: laziness, impatience, and hubris.”- Larry Wall
8. “大多数的你们都熟悉程序员的美德。它们有三点:懒,不耐烦,以及狂妄自大。”—— Larry Wall
7. “Most software today is very much like an Egyptian pyramid with millions of bricks piled on top of each other,with no structural integrity, but just done by brute force and thousands of slaves.”- Alan Kay
7. “今日的大多数软件很像埃及金字塔,由千百万砖头堆砌起来,层层相切,没有着整体的结构,是由畜力和成千上万奴隶的力量建立起来的。”—— Alan Kay
6. “The trouble with programmers is that you can never tell what a programmer is doing until it’s too late.”- Seymour Cray
6. “程序员的问题是,不到太晚,你永远无法知道一个他在做着些什么。”—— Seymour Cray
5. “To iterate is human, to recurse divine.”- L. Peter Deutsch
5. “人理解迭代,神理解递归。”—— Peter Deutsch
4. "On two occasions I have been asked [by members of Parliament]: 'Pray, Mr. Babbage, if you put into the machine wrong figures, will the right answers come out?' I am not able rightly to apprehend the kind of confusion of ideas that could provoke such a question."- Charles Babbage
4. “有两次我被(国会议员)问道:‘ Mr. Babbage,如果你输入计算机错误的数据,正确的答案会出来吗?’我完全无法理解能产生此种问题的大脑的混乱。”
3. "Most good programmers do programming not because they expect to get paid or get adulation by the public, but because it is fun to program."- Linus Torvalds
3. “大部分好的程序员编程并不是为了钱或名望,而只是因为纯粹的乐趣。”—— Linus Torvalds
2. "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."- Martin Golding
2. “编程的时候,总是想着那个维护你代码的人会是一个知道你住在哪儿的有暴力倾向的精神病患者。”—— Martin Golding
1. “There are two ways of constructing a software design. One way is to make it so simple that there are obviously no deficiencies. And the other way is to make it so complicated that there are no obvious deficiencies.”- C.A.R. Hoare
1. “有两种生成一个软件设计方案的途径。一个是把它做得如此简单,以致于明显不会有漏洞存在。另一个是把它做的如此复杂,以致于不会有明显的漏洞存在。”—— C.A.R. Hoare
来源:http://cnbeta.com/articles/129807.htm
下文列出前10个供读者欣赏。
10. "People think that computer science is the art of geniuses but the actual reality is the opposite, just many people doing things that build on each other, like a wall of mini stones."- Donald Knuth
10. “人们认为计算机科学是天才的艺术,但事实完全相反:只是很多人在共同建立起来的事物之上工作,就像一条由小石头铺成的小径。”—— Donald Knuth
9. “First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack.”- George Carrette
9. “首先学会计算机科学和所有的理论。然后发展出一个编程风格。之后便要忘掉所有这些,以自由的方式探索。”—— George Carrette
8. “Most of you are familiar with the virtues of a programmer. There are three, of course: laziness, impatience, and hubris.”- Larry Wall
8. “大多数的你们都熟悉程序员的美德。它们有三点:懒,不耐烦,以及狂妄自大。”—— Larry Wall
7. “Most software today is very much like an Egyptian pyramid with millions of bricks piled on top of each other,with no structural integrity, but just done by brute force and thousands of slaves.”- Alan Kay
7. “今日的大多数软件很像埃及金字塔,由千百万砖头堆砌起来,层层相切,没有着整体的结构,是由畜力和成千上万奴隶的力量建立起来的。”—— Alan Kay
6. “The trouble with programmers is that you can never tell what a programmer is doing until it’s too late.”- Seymour Cray
6. “程序员的问题是,不到太晚,你永远无法知道一个他在做着些什么。”—— Seymour Cray
5. “To iterate is human, to recurse divine.”- L. Peter Deutsch
5. “人理解迭代,神理解递归。”—— Peter Deutsch
4. "On two occasions I have been asked [by members of Parliament]: 'Pray, Mr. Babbage, if you put into the machine wrong figures, will the right answers come out?' I am not able rightly to apprehend the kind of confusion of ideas that could provoke such a question."- Charles Babbage
4. “有两次我被(国会议员)问道:‘ Mr. Babbage,如果你输入计算机错误的数据,正确的答案会出来吗?’我完全无法理解能产生此种问题的大脑的混乱。”
3. "Most good programmers do programming not because they expect to get paid or get adulation by the public, but because it is fun to program."- Linus Torvalds
3. “大部分好的程序员编程并不是为了钱或名望,而只是因为纯粹的乐趣。”—— Linus Torvalds
2. "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."- Martin Golding
2. “编程的时候,总是想着那个维护你代码的人会是一个知道你住在哪儿的有暴力倾向的精神病患者。”—— Martin Golding
1. “There are two ways of constructing a software design. One way is to make it so simple that there are obviously no deficiencies. And the other way is to make it so complicated that there are no obvious deficiencies.”- C.A.R. Hoare
1. “有两种生成一个软件设计方案的途径。一个是把它做得如此简单,以致于明显不会有漏洞存在。另一个是把它做的如此复杂,以致于不会有明显的漏洞存在。”—— C.A.R. Hoare
来源:http://cnbeta.com/articles/129807.htm
缓存机制简单的说就是缓存sql文本及查询结果,如果运行相同的sql,服务器直接从缓存中取到结果,而不需要再去解析和执行sql。如果表更改了,那么使用这个表的所有缓冲查询将不再有效,查询缓存值的相关条目被清空。更改指的是表中任何数据或是结构的改变,包括INSERT、UPDATE、DELETE、TRUNCATE、ALTER TABLE、DROP TABLE或DROP DATABASE等,也包括那些映射到改变了的表的使用MERGE表的查询。显然,这对于频繁更新的表,查询缓存是不适合的,而对于一些不常改变数据且有大量相同sql查询的表,查询缓存会节约很大的性能。
查询必须是完全相同的(逐字节相同)才能够被认为是相同的。另外,同样的查询字符串由于其它原因可能认为是不同的。使用不同的数据库、不同的协议版本或者不同 默认字符集的查询被认为是不同的查询并且分别进行缓存。
下面sql查询缓存认为是不同的:
SELECT * FROM tbl_name
Select * from tbl_name
查询缓存相关参数
mysql> SHOW VARIABLES LIKE '%query_cache%';
+------------------------------+---------+
| Variable_name | Value |
+------------------------------+---------+
| have_query_cache | YES | --查询缓存是否可用
| query_cache_limit | 1048576 | --可缓存具体查询结果的最大值
| query_cache_min_res_unit | 4096 |
| query_cache_size | 599040 | --查询缓存的大小
| query_cache_type | ON | --阻止或是支持查询缓存
| query_cache_wlock_invalidate | OFF |
+------------------------------+---------+
下面是一个简单的例子:
[mysql@csdba1850 ~]$ mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.0.45-community MySQL Community Edition (GPL)
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> set global query_cache_size = 600000; --设置缓存内存
Query OK, 0 rows affected (0.00 sec)
mysql> set session query_cache_type = ON; --开启查询缓存
Query OK, 0 rows affected (0.00 sec)
mysql> use test
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| animals |
| person |
+----------------+
5 rows in set (0.00 sec)
mysql> select count(*) from animals;
+----------+
| count(*) |
+----------+
| 6 |
+----------+
1 row in set (0.00 sec)
--Qcache_hits表示sql查询在缓存中命中的累计次数,是累加值。
mysql> SHOW STATUS LIKE 'Qcache_hits';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Qcache_hits | 0 | --0次
+---------------+-------+
8 rows in set (0.00 sec)
mysql> select count(*) from animals;
+----------+
| count(*) |
+----------+
| 6 |
+----------+
1 row in set (0.00 sec)
mysql> SHOW STATUS LIKE 'Qcache%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Qcache_hits | 1 | --表示sql在缓存中直接得到结果,不需要再去解析
+---------------+-------+
8 rows in set (0.00 sec)
mysql> select count(*) from animals;
+----------+
| count(*) |
+----------+
| 6 |
+----------+
1 row in set (0.00 sec)
mysql> select count(*) from animals;
+----------+
| count(*) |
+----------+
| 6 |
+----------+
1 row in set (0.00 sec)
mysql> SHOW STATUS LIKE 'Qcache_hits';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Qcache_hits | 3 | --上面的sql也是是从缓存中直接取到结果
+---------------+-------+
1 row in set (0.00 sec)
mysql> insert into animals select 9,'testsds' ; --插入数据后,跟这个表所有相关的sql缓存就会被清空掉
Query OK, 1 row affected (0.00 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> select count(*) from animals;
+----------+
| count(*) |
+----------+
| 7 |
+----------+
1 row in set (0.00 sec)
mysql> SHOW STATUS LIKE 'Qcache_hits';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Qcache_hits | 3 | --还是等于3,说明上一条sql是没有直接从缓存中直接得到的
+---------------+-------+
1 row in set (0.00 sec)
mysql> select count(*) from animals;
+----------+
| count(*) |
+----------+
| 7 |
+----------+
1 row in set (0.00 sec)
mysql> SHOW STATUS LIKE 'Qcache_hits';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Qcache_hits | 4 |
+---------------+-------+
1 row in set (0.00 sec)
我是从07年12月开始学习mysql的,断断续续看了一小部分。一直想写个mysql入门的系列,包括mysql的安装,配置再到优化,复制,集群等等,唉,懒哪,什么都没有整理出来,希望年后能有所进展。
参考:
http://dev.mysql.com/doc/refman/5.1/zh/
--EOF--
地址:http://rdc.taobao.com/blog/dba/html/61_mysql_select_cache.html
查询必须是完全相同的(逐字节相同)才能够被认为是相同的。另外,同样的查询字符串由于其它原因可能认为是不同的。使用不同的数据库、不同的协议版本或者不同 默认字符集的查询被认为是不同的查询并且分别进行缓存。
下面sql查询缓存认为是不同的:
SELECT * FROM tbl_name
Select * from tbl_name
查询缓存相关参数
mysql> SHOW VARIABLES LIKE '%query_cache%';
+------------------------------+---------+
| Variable_name | Value |
+------------------------------+---------+
| have_query_cache | YES | --查询缓存是否可用
| query_cache_limit | 1048576 | --可缓存具体查询结果的最大值
| query_cache_min_res_unit | 4096 |
| query_cache_size | 599040 | --查询缓存的大小
| query_cache_type | ON | --阻止或是支持查询缓存
| query_cache_wlock_invalidate | OFF |
+------------------------------+---------+
下面是一个简单的例子:
[mysql@csdba1850 ~]$ mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.0.45-community MySQL Community Edition (GPL)
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> set global query_cache_size = 600000; --设置缓存内存
Query OK, 0 rows affected (0.00 sec)
mysql> set session query_cache_type = ON; --开启查询缓存
Query OK, 0 rows affected (0.00 sec)
mysql> use test
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| animals |
| person |
+----------------+
5 rows in set (0.00 sec)
mysql> select count(*) from animals;
+----------+
| count(*) |
+----------+
| 6 |
+----------+
1 row in set (0.00 sec)
--Qcache_hits表示sql查询在缓存中命中的累计次数,是累加值。
mysql> SHOW STATUS LIKE 'Qcache_hits';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Qcache_hits | 0 | --0次
+---------------+-------+
8 rows in set (0.00 sec)
mysql> select count(*) from animals;
+----------+
| count(*) |
+----------+
| 6 |
+----------+
1 row in set (0.00 sec)
mysql> SHOW STATUS LIKE 'Qcache%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Qcache_hits | 1 | --表示sql在缓存中直接得到结果,不需要再去解析
+---------------+-------+
8 rows in set (0.00 sec)
mysql> select count(*) from animals;
+----------+
| count(*) |
+----------+
| 6 |
+----------+
1 row in set (0.00 sec)
mysql> select count(*) from animals;
+----------+
| count(*) |
+----------+
| 6 |
+----------+
1 row in set (0.00 sec)
mysql> SHOW STATUS LIKE 'Qcache_hits';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Qcache_hits | 3 | --上面的sql也是是从缓存中直接取到结果
+---------------+-------+
1 row in set (0.00 sec)
mysql> insert into animals select 9,'testsds' ; --插入数据后,跟这个表所有相关的sql缓存就会被清空掉
Query OK, 1 row affected (0.00 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> select count(*) from animals;
+----------+
| count(*) |
+----------+
| 7 |
+----------+
1 row in set (0.00 sec)
mysql> SHOW STATUS LIKE 'Qcache_hits';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Qcache_hits | 3 | --还是等于3,说明上一条sql是没有直接从缓存中直接得到的
+---------------+-------+
1 row in set (0.00 sec)
mysql> select count(*) from animals;
+----------+
| count(*) |
+----------+
| 7 |
+----------+
1 row in set (0.00 sec)
mysql> SHOW STATUS LIKE 'Qcache_hits';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Qcache_hits | 4 |
+---------------+-------+
1 row in set (0.00 sec)
我是从07年12月开始学习mysql的,断断续续看了一小部分。一直想写个mysql入门的系列,包括mysql的安装,配置再到优化,复制,集群等等,唉,懒哪,什么都没有整理出来,希望年后能有所进展。
参考:
http://dev.mysql.com/doc/refman/5.1/zh/
--EOF--
地址:http://rdc.taobao.com/blog/dba/html/61_mysql_select_cache.html
前言 :
在PHP+MySQL架构的站点中,本文重点从MySQL的角度去分析如何使Discuz!论坛(或者类似的PHP+MySQL架构的程序)应对大访问 量。同时给出一些使用Memcache去减轻MySQL压力的建议。其中很多数据是个人测试的结果,如有不同意见,敬请留言告之。另外由于个人思维的问 题,行文比较跳跃,特此声明!
系统分析 :
单纯的从MySQL的角度出发,单台MySQL的数据库负载到每天上亿次的操作(每秒大概1100次MySQL操作,然后乘以86400)应该不是非常困 难的事情。按照这个数据也就是说一个单MySQL服务器的论坛来说可以跑到2千万PV是不成问题的,我相信国内绝大部分的论坛都不可能做到每天2千万的 PV,但实际情况并不是如此。当论坛PV超过百万的时候一台WEB早已经不堪重负了。
就我手头的一些数据显示,目前的Discuz!论坛的基本服务器架构是前面Squid顶着,后面才是一台DB在撑着。这种架构中,web服务器压力 增大可以通过并行增加服务器解决,而MySQL压力却无处释放,在不考虑MySQL官方服务的情况下,我们通过合理的利用Memcache是可以达到减轻 MySQL服务器负载的。
可能会有朋友说我们可以对数据表进行分表(注:此处分表是指通过PHP程序去分表,比如pw,dv的分表 )处理,但是当前的情况是一台DB服务器已经不能支撑当前的数据处理了,通过PHP对MySQL进行的分表依然不能减轻MySQL的负载。(注:本段文字针对已经成型的系统,如果是独立开发的系统在架构前期就进行数据的同步分区还是不错的。 )
还可能有朋友会说利用MySQL的主从构架,如果你提出这个问题,我就很明确的告诉你,回去看看手册吧。在Mysql Master/Slave 模式中,Slave主要是来备份数据的,只有当Master出现故障时,Slave才会接过Master的服务,对外部请求进行处理,直到Master恢 复正常。就是说:在Master/Slave中,要么是Master在服务,要么是Slave在服务,不会Master/Slave同时提供服务。 使用MySQL主从依然不能有效的降低MySQL的负载。
或许你又会问我为什么不使用MySQL集群(MySQL Cluster),那可是白花花的银子啊,同等金钱的付出下,获得最大的收益才是王道。PS:说句题外话,MySQL手册中将MySQL集群解释为MySQL簇,不习惯。
其实在MySQL5.1中的MySQL分区(MySQL Partition)是个很好的东西,它允许根据可以设置为任意大小的规则,跨文件系统分配单个表的多个部分。实际上,表的不同部分在不同的位置被存储为 单独的表。我认为这个才是当前情况下,最积极有效的降低MySQL负载的解决方法之一 。但是遗憾的是,这种MySQL分区的方式我个人没有使用过的经历,也不见有相当充分的案例表明它是稳定的或者不稳定的。所以我还在徘徊中。如果你知道,请麻烦告之!有朋友说腾讯是在用MySQL分区,但是遗憾的是我没有得到确切的数据。
好了分析总结了这么多种降低MySQL负载的方式之后,在用户环境需求等特定条件下,我得出结论在当前情况下,缓解Discuz!论坛的MySQL负载比较有效的方法就是使用Memcache!
使用Memcache的理由 :
1.Web Server(Lighttpd、Nginx据说都比Apache效率高好多,大家可以试用下)对CPU要求高,对内存要求低;而Memcached Server是对CPU要求低,对内存要求高,所以可以搭配使用。在对前端的Web Server上安装Memcached Server是可行的。
2.金钱金钱金钱,最少的付出,获得最大的收益。
3.简单简单简单,对于一个架构合理的系统来说,添加Memcache的支持可能只是一个批量处理文件的过程
Discuz!使用Memcache
1.在config.inc.php中增加
$memcachehost = '127.0.0.1';
$memcacheport = 11211;
$memcachelife = 60;
2.在include/common.inc.php中
$mem = new Memcache;
$mem->connect($memcachehost, $memcacheport);
3.修改include/db_mysql.class.php中的fetch_array、query这两个方法,并添加query_mysql方法,代码如下:
function fetch_array($query, $result_type = MYSQL_ASSOC) {
return is_resource($query) ? mysql_fetch_array($query, $result_type) : $query[0];
}
function query_memcache($sql, $type = '') {
global $mem,$memcachelife;
$key = md5($sql);
if(!($query = $mem->get($key))) {
$query = $this->query($sql, $type);
while($item = $this->fetch_array($query)) {
$res[] = $item;
}
$query = $res;
$mem->set($key, $query , 0, $memcachelife);
}
return $query;
}
function query($sql, $type = '') {
global $debug, $discuz_starttime, $sqldebug, $sqlspenttimes;
$func = $type == 'UNBUFFERED' && @function_exists('mysql_unbuffered_query') ?
'mysql_unbuffered_query' : 'mysql_query';
if(!($query = $func($sql, $this->link)) && $type != 'SILENT') {
$this->halt('MySQL Query Error', $sql);
}
if(substr($sql, 0, 6) == 'SELECT') {
echo '<font color="red">Cache SQL</font>:<font color="green">'.$sql.'</font><br /><br />';
} else {
echo '<font color="red">Flash SQL</font>:<font color="green">'.$sql.'</font><br /><br />';
}
$this->querynum++;
return $query;
}
4.将需要使用Memcache缓存的SQL查询的代码由
$db->query(
修改为
$db->query_memcache(
注意并将
while($post = $db->fetch_array($query)) {
修改为
foreach($query as $post) {
没有while的$db->fetch_array可以不用修改。
下面代码有用得着的就拿去:
preg_replace("/while\([$](\w+)\s*\=\s*[$]db->fetch_array\([$]query\)\)/is", "foreach(\$query as \$\\1)", $file);
回头放出个小工具批量替换下就可以了。
在EditPlus中可以这样替换:while\([$](.*) = [$]db->fetch_array\([$]query\)\)替换为foreach($query as $\1)
5.完成了,测试吧!~
来源:http://koda.javaeye.com/blog/244875
在PHP+MySQL架构的站点中,本文重点从MySQL的角度去分析如何使Discuz!论坛(或者类似的PHP+MySQL架构的程序)应对大访问 量。同时给出一些使用Memcache去减轻MySQL压力的建议。其中很多数据是个人测试的结果,如有不同意见,敬请留言告之。另外由于个人思维的问 题,行文比较跳跃,特此声明!
系统分析 :
单纯的从MySQL的角度出发,单台MySQL的数据库负载到每天上亿次的操作(每秒大概1100次MySQL操作,然后乘以86400)应该不是非常困 难的事情。按照这个数据也就是说一个单MySQL服务器的论坛来说可以跑到2千万PV是不成问题的,我相信国内绝大部分的论坛都不可能做到每天2千万的 PV,但实际情况并不是如此。当论坛PV超过百万的时候一台WEB早已经不堪重负了。
就我手头的一些数据显示,目前的Discuz!论坛的基本服务器架构是前面Squid顶着,后面才是一台DB在撑着。这种架构中,web服务器压力 增大可以通过并行增加服务器解决,而MySQL压力却无处释放,在不考虑MySQL官方服务的情况下,我们通过合理的利用Memcache是可以达到减轻 MySQL服务器负载的。
可能会有朋友说我们可以对数据表进行分表(注:此处分表是指通过PHP程序去分表,比如pw,dv的分表 )处理,但是当前的情况是一台DB服务器已经不能支撑当前的数据处理了,通过PHP对MySQL进行的分表依然不能减轻MySQL的负载。(注:本段文字针对已经成型的系统,如果是独立开发的系统在架构前期就进行数据的同步分区还是不错的。 )
还可能有朋友会说利用MySQL的主从构架,如果你提出这个问题,我就很明确的告诉你,回去看看手册吧。在Mysql Master/Slave 模式中,Slave主要是来备份数据的,只有当Master出现故障时,Slave才会接过Master的服务,对外部请求进行处理,直到Master恢 复正常。就是说:在Master/Slave中,要么是Master在服务,要么是Slave在服务,不会Master/Slave同时提供服务。 使用MySQL主从依然不能有效的降低MySQL的负载。
或许你又会问我为什么不使用MySQL集群(MySQL Cluster),那可是白花花的银子啊,同等金钱的付出下,获得最大的收益才是王道。PS:说句题外话,MySQL手册中将MySQL集群解释为MySQL簇,不习惯。
其实在MySQL5.1中的MySQL分区(MySQL Partition)是个很好的东西,它允许根据可以设置为任意大小的规则,跨文件系统分配单个表的多个部分。实际上,表的不同部分在不同的位置被存储为 单独的表。我认为这个才是当前情况下,最积极有效的降低MySQL负载的解决方法之一 。但是遗憾的是,这种MySQL分区的方式我个人没有使用过的经历,也不见有相当充分的案例表明它是稳定的或者不稳定的。所以我还在徘徊中。如果你知道,请麻烦告之!有朋友说腾讯是在用MySQL分区,但是遗憾的是我没有得到确切的数据。
好了分析总结了这么多种降低MySQL负载的方式之后,在用户环境需求等特定条件下,我得出结论在当前情况下,缓解Discuz!论坛的MySQL负载比较有效的方法就是使用Memcache!
使用Memcache的理由 :
1.Web Server(Lighttpd、Nginx据说都比Apache效率高好多,大家可以试用下)对CPU要求高,对内存要求低;而Memcached Server是对CPU要求低,对内存要求高,所以可以搭配使用。在对前端的Web Server上安装Memcached Server是可行的。
2.金钱金钱金钱,最少的付出,获得最大的收益。
3.简单简单简单,对于一个架构合理的系统来说,添加Memcache的支持可能只是一个批量处理文件的过程
Discuz!使用Memcache
1.在config.inc.php中增加
$memcachehost = '127.0.0.1';
$memcacheport = 11211;
$memcachelife = 60;
2.在include/common.inc.php中
$mem = new Memcache;
$mem->connect($memcachehost, $memcacheport);
3.修改include/db_mysql.class.php中的fetch_array、query这两个方法,并添加query_mysql方法,代码如下:
function fetch_array($query, $result_type = MYSQL_ASSOC) {
return is_resource($query) ? mysql_fetch_array($query, $result_type) : $query[0];
}
function query_memcache($sql, $type = '') {
global $mem,$memcachelife;
$key = md5($sql);
if(!($query = $mem->get($key))) {
$query = $this->query($sql, $type);
while($item = $this->fetch_array($query)) {
$res[] = $item;
}
$query = $res;
$mem->set($key, $query , 0, $memcachelife);
}
return $query;
}
function query($sql, $type = '') {
global $debug, $discuz_starttime, $sqldebug, $sqlspenttimes;
$func = $type == 'UNBUFFERED' && @function_exists('mysql_unbuffered_query') ?
'mysql_unbuffered_query' : 'mysql_query';
if(!($query = $func($sql, $this->link)) && $type != 'SILENT') {
$this->halt('MySQL Query Error', $sql);
}
if(substr($sql, 0, 6) == 'SELECT') {
echo '<font color="red">Cache SQL</font>:<font color="green">'.$sql.'</font><br /><br />';
} else {
echo '<font color="red">Flash SQL</font>:<font color="green">'.$sql.'</font><br /><br />';
}
$this->querynum++;
return $query;
}
4.将需要使用Memcache缓存的SQL查询的代码由
$db->query(
修改为
$db->query_memcache(
注意并将
while($post = $db->fetch_array($query)) {
修改为
foreach($query as $post) {
没有while的$db->fetch_array可以不用修改。
下面代码有用得着的就拿去:
preg_replace("/while\([$](\w+)\s*\=\s*[$]db->fetch_array\([$]query\)\)/is", "foreach(\$query as \$\\1)", $file);
回头放出个小工具批量替换下就可以了。
在EditPlus中可以这样替换:while\([$](.*) = [$]db->fetch_array\([$]query\)\)替换为foreach($query as $\1)
5.完成了,测试吧!~
来源:http://koda.javaeye.com/blog/244875
为何要换端口,原因是发现有的人把22端口换成了其它端口,如:22345,还不让root登录。
以上摘自:https://www.cnblogs.com/jixingke/p/6213074.html
scp远程两台主机时如何指定端口:
scp 、ssh非22端口的服务器方法
ssh 连接远程ssh非22端口的服务器方法
ssh -p 20086 tiaoban@远程ssh服务器ip #小p
scp 远程拷贝ssh非22端口的服务器文件是使用方法
-P 参数,p的位置放好,格式应该是,scp -P port username@............:/dir 要拷贝到的地方,端口要在前,不像ssh一样加在后面。
usage: scp [-1246BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file]
[-l limit] [-o ssh_option] [-P port] [-S program]
[[user@]host1:]file1 [...] [[user@]host2:]file2
scp -r -c arcfour128 -o "MACs umac-64@openssh.com" ...
注:启用压缩使用参数: -o "Compression yes"
来自:http://blogread.cn/it/article/6776?f=hot3
SCP 命令跟 CP 命令类似,只不过CP命令是在同一台机器上用的,SCP是在2台机器上复制的命令。
阅读全文
以上摘自:https://www.cnblogs.com/jixingke/p/6213074.html
scp远程两台主机时如何指定端口:
scp 、ssh非22端口的服务器方法
ssh 连接远程ssh非22端口的服务器方法
ssh -p 20086 tiaoban@远程ssh服务器ip #小p
scp 远程拷贝ssh非22端口的服务器文件是使用方法
-P 参数,p的位置放好,格式应该是,scp -P port username@............:/dir 要拷贝到的地方,端口要在前,不像ssh一样加在后面。
usage: scp [-1246BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file]
[-l limit] [-o ssh_option] [-P port] [-S program]
[[user@]host1:]file1 [...] [[user@]host2:]file2
scp -r -c arcfour128 -o "MACs umac-64@openssh.com" ...
注:启用压缩使用参数: -o "Compression yes"
来自:http://blogread.cn/it/article/6776?f=hot3
SCP 命令跟 CP 命令类似,只不过CP命令是在同一台机器上用的,SCP是在2台机器上复制的命令。
阅读全文
和外企的CEO们交流,谈论最多的是战略和策略的问题;而和国内医药企业家论道,感慨最多的却是执行力的问题。阅读全文
C:\Documents and Set tings\jackxiang>ping -a 10.6.29.*
Pinging jackxiang-pc.**.com [10.6.29.*] with 32 bytes of data:
Reply from 10.6.29.*: bytes=32 time<1ms TTL=64
Reply from 10.6.29.*: bytes=32 time<1ms TTL=64
Reply from 10.6.29.*: bytes=32 time<1ms TTL=64
Reply from 10.6.29.*: bytes=32 time<1ms TTL=64
Pinging jackxiang-pc.**.com [10.6.29.*] with 32 bytes of data:
Reply from 10.6.29.*: bytes=32 time<1ms TTL=64
Reply from 10.6.29.*: bytes=32 time<1ms TTL=64
Reply from 10.6.29.*: bytes=32 time<1ms TTL=64
Reply from 10.6.29.*: bytes=32 time<1ms TTL=64
下载,安装
下载sphinx-0.9.8.1.tar.gz(在撰写本文时,0.9.8.1是最新版)
安装、启动、使用Sphinx:
./configure --prefix=/usr/local/sphinx
make;make install
cp sphinx-min.conf.dist sphinx.conf
cd /usr/local/sphinx/etc/
配置sphinx的索引任务:
配置sphinx的数据源,Mysql信息配置:
vi sphinx.conf
source src1
{
type = mysql
sql_host = localhost
sql_user = root
sql_pass =
sql_db = test
sql_port = 3306 # optional, default is 3306
sql_query = \
SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content \
FROM documents
sql_attr_uint = group_id
sql_attr_timestamp = date_added
sql_query_info = SELECT * FROM documents WHERE id=$id
}
// ./search --config /usr/local/sphinx/etc/sphinx.conf test
index test1
{
source = src1
path = /usr/local/sphinx/var/data/test1
docinfo = extern
charset_type = sbcs
}
bogon:/usr/local/sphinx/bin # ./indexer --config /usr/local/sphinx/etc/sphinx.conf test1
./searchd --config /usr/local/sphinx/etc/sphinx.conf &
bogon:/usr/local/sphinx/bin # ./search --config /usr/local/sphinx/etc/sphinx.conf test
Sphinx 0.9.9-release (r2117)
Copyright (c) 2001-2009, Andrew Aksyonoff
using config file '/usr/local/sphinx/etc/sphinx.conf'...
index 'test1': query 'test ': returned 3 matches of 3 total in 0.000 sec
displaying matches:
1. document=1, weight=2, group_id=1, date_added=Sun Dec 12 16:28:37 2010
id=1
group_id=1
group_id2=5
date_added=2010-12-12 16:28:37
title=test one
content=this is my test document number one. also checking search within phrases.
2. document=2, weight=2, group_id=1, date_added=Sun Dec 12 16:28:37 2010
id=2
group_id=1
group_id2=6
date_added=2010-12-12 16:28:37
title=test two
content=this is my test document number two
3. document=4, weight=1, group_id=2, date_added=Sun Dec 12 16:28:37 2010
id=4
group_id=2
group_id2=8
date_added=2010-12-12 16:28:37
title=doc number four
content=this is to test groups
words:
1. 'test': 3 documents, 5 hits
http://ishare.iask.sina.com.cn/f/10868512.html?retcode=0
请大家帮我解决一下。这个问题,谢谢您们了。
报的错误信息。
Unable to find the socket transport "http" - did you forget to enable it when you configured PHP? (24)
我的QQ1347901184
报的错误信息。
Unable to find the socket transport "http" - did you forget to enable it when you configured PHP? (24)
我的QQ1347901184
下面是报的错误信息。
Unable to find the socket transport "http" - did you forget to enable it when you configured PHP? (24)
很着急,不知道怎么解决。
给我做网站的公司也不管,希望各位高手能帮助我解决,谢谢您们了。
我的qq是1347901184
Unable to find the socket transport "http" - did you forget to enable it when you configured PHP? (24)
很着急,不知道怎么解决。
给我做网站的公司也不管,希望各位高手能帮助我解决,谢谢您们了。
我的qq是1347901184
从360与QQ之争看互联网资讯获取类网站的盈利模式和互联网用户群的需求演变阅读全文
MySQL性能优化的最佳20+条经验
MySQL: InnoDB 还是 MyISAM?
MyISAM 是MySQL中默认的存储引擎,一般来说不是有太多人关心这个东西。决定使用什么样的存储引擎是一个很tricky的事情,但是还是值我们去研究一下,这里的文章只考虑 MyISAM 和InnoDB这两个,因为这两个是最常见的。
下面先让我们回答一些问题:
你的数据库有外键吗?
你需要事务支持吗?
你需要全文索引吗?
你经常使用什么样的查询模式?
你的数据有多大?
思考上面这些问题可以让你找到合适的方向,但那并不是绝对的。如果你需要事务处理或是外键,那么InnoDB 可能是比较好的方式。如果你需要全文索引,那么通常来说 MyISAM是好的选择,因为这是系统内建的,然而,我们其实并不会经常地去测试两百万行记录。所以,就算是慢一点,我们可以通过使用Sphinx从InnoDB中获得全文索引。
数据的大小,是一个影响你选择什么样存储引擎的重要因素,大尺寸的数据集趋向于选择InnoDB方式,因为其支持事务处理和故障恢复。数据库的在小决定了故障恢复的时间长短,InnoDB可以利用事务日志进行数据恢复,这会比较快。而MyISAM可能会需要几个小时甚至几天来干这些事,InnoDB只需要几分钟。
您操作数据库表的习惯可能也会是一个对性能影响很大的因素。比如: COUNT() 在 MyISAM 表中会非常快,而在InnoDB 表下可能会很痛苦。而主键查询则在InnoDB下会相当相当的快,但需要小心的是如果我们的主键太长了也会导致性能问题。大批的inserts 语句在MyISAM下会快一些,但是updates 在InnoDB 下会更快一些——尤其在并发量大的时候。
所以,到底你检使用哪一个呢?根据经验来看,如果是一些小型的应用或项目,那么MyISAM 也许会更适合。当然,在大型的环境下使用MyISAM 也会有很大成功的时候,但却不总是这样的。如果你正在计划使用一个超大数据量的项目,而且需要事务处理或外键支持,那么你真的应该直接使用InnoDB方式。但需要记住InnoDB 的表需要更多的内存和存储,转换100GB 的MyISAM 表到InnoDB 表可能会让你有非常坏的体验。
来源:http://coolshell.cn/articles/652.html
http://coolshell.cn/articles/1846.html
MySQL: InnoDB 还是 MyISAM?
MyISAM 是MySQL中默认的存储引擎,一般来说不是有太多人关心这个东西。决定使用什么样的存储引擎是一个很tricky的事情,但是还是值我们去研究一下,这里的文章只考虑 MyISAM 和InnoDB这两个,因为这两个是最常见的。
下面先让我们回答一些问题:
你的数据库有外键吗?
你需要事务支持吗?
你需要全文索引吗?
你经常使用什么样的查询模式?
你的数据有多大?
思考上面这些问题可以让你找到合适的方向,但那并不是绝对的。如果你需要事务处理或是外键,那么InnoDB 可能是比较好的方式。如果你需要全文索引,那么通常来说 MyISAM是好的选择,因为这是系统内建的,然而,我们其实并不会经常地去测试两百万行记录。所以,就算是慢一点,我们可以通过使用Sphinx从InnoDB中获得全文索引。
数据的大小,是一个影响你选择什么样存储引擎的重要因素,大尺寸的数据集趋向于选择InnoDB方式,因为其支持事务处理和故障恢复。数据库的在小决定了故障恢复的时间长短,InnoDB可以利用事务日志进行数据恢复,这会比较快。而MyISAM可能会需要几个小时甚至几天来干这些事,InnoDB只需要几分钟。
您操作数据库表的习惯可能也会是一个对性能影响很大的因素。比如: COUNT() 在 MyISAM 表中会非常快,而在InnoDB 表下可能会很痛苦。而主键查询则在InnoDB下会相当相当的快,但需要小心的是如果我们的主键太长了也会导致性能问题。大批的inserts 语句在MyISAM下会快一些,但是updates 在InnoDB 下会更快一些——尤其在并发量大的时候。
所以,到底你检使用哪一个呢?根据经验来看,如果是一些小型的应用或项目,那么MyISAM 也许会更适合。当然,在大型的环境下使用MyISAM 也会有很大成功的时候,但却不总是这样的。如果你正在计划使用一个超大数据量的项目,而且需要事务处理或外键支持,那么你真的应该直接使用InnoDB方式。但需要记住InnoDB 的表需要更多的内存和存储,转换100GB 的MyISAM 表到InnoDB 表可能会让你有非常坏的体验。
来源:http://coolshell.cn/articles/652.html
mysql的where和order by 在一起时,order by 后的索引不能命中。阅读全文
第一步:修改你家目录下的.bashrc或者.bash_profile,忘了是在哪个文件里了,找到相应的PS1变量,修改保存退出。这样以后每次开机就好了。
第二步:
看看/etc/passwd
我发现我的:/etc/passwd 被人给干掉了,唉,还好有备份:看看/etc/passwd.old给恢复了。。。
第二步:
看看/etc/passwd
我发现我的:/etc/passwd 被人给干掉了,唉,还好有备份:看看/etc/passwd.old给恢复了。。。
想生成:
PHP如下:
也可以这样:
mkdir 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
PHP如下:
<?php
for($i=0;$i<100;$i++)$i<10?$ar[]="0$i":$ar[]=$i;
echo "mkdir ";
for($i=0;$i<100;$i++) echo $ar[$i]." ";
?>
for($i=0;$i<100;$i++)$i<10?$ar[]="0$i":$ar[]=$i;
echo "mkdir ";
for($i=0;$i<100;$i++) echo $ar[$i]." ";
?>
也可以这样:
<?php
for($i=0;$i<100;$i++)$i<10?$ar[]="0$i":$ar[]=$i;
for($i=0;$i<100;$i++) echo "mkdir ".$ar[$i].";\n";
?>
for($i=0;$i<100;$i++)$i<10?$ar[]="0$i":$ar[]=$i;
for($i=0;$i<100;$i++) echo "mkdir ".$ar[$i].";\n";
?>
<?php
print_r(preg_replace("/\b(\d)\b/", "0$1", join(" ", array_keys(array_pad(array(), 100, 0)))));
?>
print_r(preg_replace("/\b(\d)\b/", "0$1", join(" ", array_keys(array_pad(array(), 100, 0)))));
?>
<?php
//print_r(preg_replace("/\b(\d)\b/", "0$1", join(" ", array_keys(array_pad(array(), 100, 0)))));
print_r(join(",", array_keys(array_pad(array(), 100, 0))));
?>
//print_r(preg_replace("/\b(\d)\b/", "0$1", join(" ", array_keys(array_pad(array(), 100, 0)))));
print_r(join(",", array_keys(array_pad(array(), 100, 0))));
?>