qq群聊天纪实 - 关于性能、引擎速度

news/2025/1/12 23:30:52/

 

/* 请勿转载,因为转载也没啥意义,看看就行咧。。。HOHO */

时间:2007-01-25
地点:PHPer群

黑夜路人 20:18:30
让你看一个题
善良的BEN 20:18:43
脑筋急转弯?
黑夜路人 20:18:49
 
善良的BEN 20:20:12
什么地方 too many?web 还是 db ?
黑夜路人 20:20:19
mysql
善良的BEN 20:20:41
pconnect 用的太多了?
黑夜路人 20:20:46
HOHO
黑夜路人 20:20:52
看我的解决方案
善良的BEN 20:20:58
好像还有个什么配置什么的
黑夜路人 20:21:24
除了这个,你还有啥建议?
善良的BEN 20:21:43
木有
善良的BEN 20:21:50
这是好事情
善良的BEN 20:21:58
限制一下ip?
黑夜路人 20:22:03
汗。。。
黑夜路人 20:22:37
能看到图吗?有了这个提示。。。
善良的BEN 20:22:53
啥图?
黑夜路人 20:23:07
19、现在因为投票人数太多,网站时常出现too many connection的错误,请提供解决方案。
 (1) 增加MySQL服务器端最大链接数量
 (2) PHP端不使用长连接:mysql_pconnect函数,而使用mysql_connect函数链接数据库
 (3) 使用数据库连接池
 
善良的BEN 20:23:48
跟我说的差不多嘛~ 
黑夜路人 20:23:56
20、在成功解决连接数的问题后,发现程序运行缓慢,经查发现是mysql并发太多,表被锁定的现象严重,请提供解决方案。
 
善良的BEN 20:24:45
1、拆表。这是你说的~ 
 
善良的BEN 20:25:07
2、使用事务和存储过程
黑夜路人 20:25:46
事务能搞定?
飞风 20:25:56
事务会是速度更慢吧?
黑夜路人 20:26:16
20、在成功解决连接数的问题后,发现程序运行缓慢,经查发现是mysql并发太多,表被锁定的现象严重,请提供解决方案。
(1) 单台数据库服务器上进行分表,把压力大的表分成多个表
(2) 单台数据库服务器上开放多个MySQL进程,监听不同端口,然后PHP客户端读写数据分离到不同端口,同时进行单机内同步
(3) 两台数据库服务器,构建Master/Slave 结构,Master服务器负责 插入/删除/更新 操作,Slave负责提取操作,Master同步到Slave。
 
善良的BEN 20:26:33
事务是保证按顺序准确提交执行SQL的
黑夜路人 20:26:39
但是第二个方法估计有问题。。。嘿嘿,本机同步,嘻嘻,太NB了
善良的BEN 20:27:16
本机同步有啥意思?
黑夜路人 20:27:18
那事务也不能解决负载哇。。
善良的BEN 20:27:34
还不如弄个内存磁盘
飞风 20:27:41
事务是保证正确提交,对负载有负面影响。
黑夜路人 20:27:50
汗。。。共享内存?
黑夜路人 20:28:14
另外,存储过程能够解决复杂吗?
飞风 20:28:20
呵呵,这些在哪里看到的?学习下~
黑夜路人 20:28:25
s/复杂/负载/g
黑夜路人 20:28:58
这是我朋友发给我 他做的题。。。下面是我写的答案
善良的BEN 20:29:03
现在是解决表锁定的问题
飞风 20:29:17
 
黑夜路人 20:29:28
对,锁定肯定是并发太多的缘故
黑夜路人 20:29:55
比如,这个表正在进行insert操作的时候,又冒出了一个update操作,那时候update操作就必须在队列里等待,就形成了锁表
黑夜路人 20:30:29
对了,ben,队列咋实现?链表?线性表?
 
善良的BEN 20:30:32
用事务可以让mysql自己去合理解决部分顺序问题
善良的BEN 20:31:14
很多操作可以并行进行而不引发说表
善良的BEN 20:31:19

黑夜路人 20:31:40
做脚本就是郁闷,很多东西接触不到。。。比如啥 线程、进程、并发、队列 啥的。。。NND
善良的BEN 20:32:02
队列有很多种啊,随便你用什么的数据结构
黑夜路人 20:32:08
连内存都没的操作。。。 
黑夜路人 20:32:24
再看下一题
黑夜路人 20:32:26
21、因为用户实在太多,所以又分配给你两台服务器,你会如何来安排这3台服务器?
 
善良的BEN 20:32:56
memcache?
飞风 20:33:12
一台web服务器,两台数据库服务器集群吧?
善良的BEN 20:33:17
3台都是db吗?
黑夜路人 20:33:25
不可能
黑夜路人 20:33:28
肯定有一台web
黑夜路人 20:33:47
21、因为用户实在太多,所以又分配给你两台服务器,你会如何来安排这3台服务器?
(1) 如果瓶颈在数据库上,那么就一台做Web服务器,另外两台做数据库服务器,组建Master/Slave结构
(2) 如果瓶颈在Web 服务器上,那么就两台服务器做Web,然后一台数据库服务器,同时在一台Web服务器上做缓存服务器,把部分数据库读取数据直接转移到缓存服务器上进行读取
 
善良的BEN 20:34:06
。。。
善良的BEN 20:34:12
说跟没说差不多
黑夜路人 20:34:17
可不。。。哈哈
黑夜路人 20:34:25
有啥建议没有?
善良的BEN 20:34:25
当然是哪差补哪里啦
黑夜路人 20:34:40
不过估计是数据库瓶颈
 
善良的BEN 20:35:14
其实绝大部分数据库的瓶颈都是在 io 上
黑夜路人 20:35:17
但是如果流量很大,web服务器少了也是个问题,因为httpd会超多
黑夜路人 20:35:31
io的瓶颈在于硬盘的制作工艺上。。。
黑夜路人 20:35:56
所以嘛,U盘类的硬盘将是很有前景滴
善良的BEN 20:36:30
解决io 一个就是用nb的硬盘再加上raid什么的,另一个就是用内存代替硬盘
黑夜路人 20:36:47
内存代替硬盘是目前百度和google的解决方案
黑夜路人 20:36:57
但是对于需要很精确的数据来说还是不行
黑夜路人 20:37:05
搜索引擎多点少点数据没关系,嘿嘿
善良的BEN 20:37:11
硬盘本来就是内存的妥协存在
黑夜路人 20:37:15
再看这题
黑夜路人 20:37:19
13、请举例说明在你的开发过程中用什么方法来加快页面的加载速度。
 
善良的BEN 20:37:51
页面要小
黑夜路人 20:37:55
这个我就不知道怎么回答了。。。冒汗。。。
善良的BEN 20:38:11
需要时才 include
善良的BEN 20:38:20
还有 eA
善良的BEN 20:38:42
要多利用 js
飞风 20:38:57
JS最好都在一个文件中加载。
善良的BEN 20:39:14
因为 js 不但可以减少服务端的压力而且还可以被客户端缓存
黑夜路人 20:39:34
HOHO,就是ajax咧
飞风 20:39:44
运行的时候去掉空格和注释
 
善良的BEN 20:39:54
现在客户端机器那么NB不用就太浪费了
黑夜路人 20:40:57
汗。。。
善良的BEN 20:41:04
去掉空格和注释这个太BT了~
黑夜路人 20:41:17
apc跟ea是一个东西吗?
善良的BEN 20:41:27
一类东西
黑夜路人 20:41:32
Alternative PHP Cache
黑夜路人 20:41:37
xCache
黑夜路人 20:41:42
还有叫啥的?
善良的BEN 20:41:46
eA
善良的BEN 20:42:06
eAccelerator
善良的BEN 20:42:13
PHP Accelerator
黑夜路人 20:42:20
以前叫做 mmcache ?
飞风 20:42:35
不是吧。。
善良的BEN 20:42:36

善良的BEN 20:42:39
turck-mmcache
善良的BEN 20:42:48
现在这娃去zend了
黑夜路人 20:42:50
历史够悠久
黑夜路人 20:43:01
zend的缓存工具叫啥?
善良的BEN 20:43:21
zps
善良的BEN 20:43:38
zend per...system 什么的
 
善良的BEN 20:43:50
就是性能那个词~ 
善良的BEN 20:44:28
现在好像被集成到 ZendPlatform 了
黑夜路人 20:44:48
汗。。。zend的我都没装过
黑夜路人 20:45:00
我加一条:-尽量使用过程方式编码,面向对象尽量减少继承之类的操作
黑夜路人 20:45:09
哈哈,OOP的同志们要BS偶咧。。
善良的BEN 20:45:12
 
黑夜路人 20:45:33
你研究过引擎,说说继承是不是超级浪费时间?
善良的BEN 20:46:28
有,不过也不能说是超级浪费
黑夜路人 20:46:51
嘿嘿。。。有测试过多浪费时间吗?
黑夜路人 20:47:11
听你的文章说php5.2在这方面大大滴改进咧?
善良的BEN 20:47:15
木有~ 
善良的BEN 20:47:26
不过可以这么说
善良的BEN 20:47:57
php 5.2 的 oo 不比 php 4的 po 差多少
黑夜路人 20:48:23
什么意思?解析速度?
善良的BEN 20:48:24
但php 5.2 的 oo 跟 php 5.2 的 po 嘛。。。 
善良的BEN 20:48:49
po  = 面向过程啊
黑夜路人 20:48:49
你的意思是说,php5.2的整体解析性能超过了php4.x
黑夜路人 20:49:09
不管是oop还是opp?
善良的BEN 20:49:42
可以想想看嘛,那么多牛人那几年时间也不是在吃白饭嘛~
黑夜路人 20:50:00
php5.2 oop == php 4.x opp
php5.2 opp != php5.2 oop
 
黑夜路人 20:50:42
那么,是否: php5.2 opp > php4.x opp ?
善良的BEN 20:50:54
right~ 
黑夜路人 20:51:11
反正就是比php4.x快就对了
黑夜路人 20:51:20
php5.0.x如何?
善良的BEN 20:51:29
垃圾
黑夜路人 20:51:40
汗。。。我现在一直在用。。。
善良的BEN 20:51:55
整个一个实验品
黑夜路人 20:52:19
汗。。。
善良的BEN 20:52:20
php5源码Zend目录里面有个bench.php
黑夜路人 20:52:25
干哈滴?
善良的BEN 20:52:41
测试用的
善良的BEN 20:53:22
没有类
善良的BEN 20:53:44
只有函数。里面有各式各样的操作
黑夜路人 20:54:16
包括什么操作?
善良的BEN 20:54:29
看看不就知道了 
善良的BEN 20:55:02
除了类的所有语言特性操作
善良的BEN 20:55:23
function simplecall() {
  for ($i = 0; $i < 1000000; $i++)
    strlen("hallo");
}
善良的BEN 20:55:32
这是测试调用函数
善良的BEN 20:55:39

function hallo($a) {
}

function simpleucall() {
  for ($i = 0; $i < 1000000; $i++)
    hallo("hallo");
}
善良的BEN 20:56:00
这是测试调用用户自定义的函数
 
黑夜路人 20:56:13
哦。。。调用函数的处理时间如何?
善良的BEN 20:56:39
不着,以前测过,不过忘了~ 
善良的BEN 20:57:26
往群共享里面传了一份 bench.php
黑夜路人 20:58:31
刷新列表失败
黑夜路人 20:58:41
13、请举例说明在你的开发过程中用什么方法来加快页面的加载速度。
(1) PHP程序端尽量少的include操作,减少磁盘IO,尽量使用过程方式编码,面向对象尽量减少继承之类的操作,减少PHP脚本引擎解析时间。
(2) 减少页面中无谓的HTML、CSS、JS代码
 (3) PHP端使用一些PHP缓存工具,比如xCache、APC、eAccelerator等缓存扩展
(4) 对页面进行缓存,生成静态文件或者缓存到Memcache等缓存服务器上
 
善良的BEN 20:58:42
。。。
善良的BEN 20:59:11
这是答案还是刚才咱们说的?
黑夜路人 20:59:23
我们刚才说的,这些东西没答案,哈哈
善良的BEN 20:59:30
 
黑夜路人 20:59:47
8、请说明PHP中传值与传引用的区别。什么时候传值什么时候传引用?
 
善良的BEN 21:00:05
老掉牙的题目了~ 
黑夜路人 21:00:29
嘿嘿,又不也是c
黑夜路人 21:00:37
php没有指针,只有引用
黑夜路人 21:00:51
对了,php的引用,脚本引擎是当作指针处理的吗?
善良的BEN 21:01:29
脚本中所有的变量的值都是保存在一个表里面
黑夜路人 21:01:52
什么表?hash表?
善良的BEN 21:02:01

黑夜路人 21:02:16
如何调用?通过key?
善良的BEN 21:02:38
对啊
善良的BEN 21:02:49
新建一个变量时
 
善良的BEN 21:03:15
就有一个 变量名 指向 符号表中的值
黑夜路人 21:03:40
哦。。。
黑夜路人 21:03:43
我有个问题一直想问你
黑夜路人 21:04:07
strlen函数在哪里定义的?我找遍了 ext/stands/string.c 也没发现
善良的BEN 21:04:09
引用时就再建一个变量名,这个变量名还是指向被引用那个变量所指向符号表中的值
善良的BEN 21:05:10
你要说不是指针,php 根本就没有内存这个概念,你怎么说他是个指针?
善良的BEN 21:05:23
但是你可以这样去理解他~
黑夜路人 21:05:35
abc  ---> 变量1
aaa  ---> 变量1
善良的BEN 21:05:45
把他当成泛指的或者是特殊的指针就行了
黑夜路人 21:05:52
两个变量名指向同一个符号表中的值。。。
善良的BEN 21:05:59
right~
善良的BEN 21:06:16
所以说 别名 这个术语是正确的
黑夜路人 21:06:23
对于脚本引擎的代码都是保存在 Zend Engine 里的吧?
善良的BEN 21:06:51
是啊。要不咋会被反编译出来? 
黑夜路人 21:06:57
$a = '123';
$b = &$a;
unset($a);
echo $b;
//123
黑夜路人 21:07:38
这个。。。就是unset的时候,其实只是把$a这个变量名称给销毁了,但是变量值并没有被销毁?
黑夜路人 21:08:12
也就是说,所有在执行的变量的值都是保存在符号表中,没有被销毁,只有最后脚本执行结束的时候才销毁?
善良的BEN 21:08:39

善良的BEN 21:08:49
我是说上上句
黑夜路人 21:09:06
那第二句捏?
 
善良的BEN 21:09:59
每个变量都有个引用计数
善良的BEN 21:10:33
unset的时候如果还有别的引用就不delete,只是 ref_count-- 而已
善良的BEN 21:11:11
如果 ref_count-- 后为 0 就彻底 delete
黑夜路人 21:12:45
就是把符号表中的值得给删除掉
黑夜路人 21:12:58
还有想问你两个问题
黑夜路人 21:13:04
strlen函数在哪里定义的?我找遍了 ext/stands/string.c 也没发现 
善良的BEN 21:13:39
我看看
黑夜路人 21:16:31
第一个问题:strlen的效率高吗?就是说是否像c里面的机构体一样,一个字符数组保存字符串,一个整形变量保存字符串长度,那么样使用strlen的时候,就直接把字符串长度返回了:
typedef struct s{
    char * string[],
    int str_length
}
善良的BEN 21:17:14
我还没找到函数原型,不过应该是的
黑夜路人 21:17:23
int strlen(*string){
    return string->str_length;
}
善良的BEN 21:17:43
因为在建立一个字符串变量时会自动把长度保存下来
黑夜路人 21:17:46
那么就是说strlen的效率很高了?
黑夜路人 21:20:18
第二个问题:count() 数组的时候,效率是否很高?
for($i=0; $i<count($arr); $i++){
    echo $arr[$i];
}
善良的BEN 21:20:44
很低
黑夜路人 21:20:51
像这个时候,是否count函数是否会记录上次count过的值,而且在循环的时候不会重新计算?
 
善良的BEN 21:20:57
并不会先计算count 数
善良的BEN 21:21:08
会计算 n 次
黑夜路人 21:21:12
汗。。。
黑夜路人 21:21:38
数组变量不会记录下来长度吗?
善良的BEN 21:21:44
这个问题你一问我就知道你问什么了 
黑夜路人 21:22:06
我一直很纳闷
善良的BEN 21:22:15
关键是编译器并不知道你在{}里面有没有对数组进行操作
黑夜路人 21:22:41
按照刚才的说法,变量存储在符号表中的时候,应该会存储它的长度吧?那么字符串会,数组应该自然也会了?
善良的BEN 21:23:00
像C中那就是sting[128],那就是128没说的
善良的BEN 21:23:17
数组本身就是一个hash表
黑夜路人 21:23:19
这么说,count的时候是会重新对数字进行点数了?
黑夜路人 21:23:43
php的数组在脚本引擎中是怎么存储的?给个结构体看看。。。
善良的BEN 21:24:09
就是一个hash表啊
Phzzy 21:24:22
D你们太彪悍了
黑夜路人 21:24:23
但是有数字索引还有关联索引哇
善良的BEN 21:24:26
跟保存变量的那个表一样
Phzzy 21:24:32
偶听得一愣一愣的
善良的BEN 21:24:33
所以你的数组才会可以存储任意的东西
黑夜路人 21:24:50
这个功能是我最喜欢的,哈哈,php最好用的就是数组!!
黑夜路人 21:25:05
我不行,主要是听Ben兄滴。。。嘿嘿
 
Phzzy 21:25:31
偶听了很久了
善良的BEN 21:25:36
数字索引还有关联索引都是一个hash函数 
善良的BEN 21:25:40
ZEND_API int zend_hash_exists(HashTable *ht, char *arKey, uint nKeyLength);
ZEND_API int zend_hash_index_exists(HashTable *ht, ulong h);
ZEND_API ulong zend_hash_next_free_element(HashTable *ht);
善良的BEN 21:25:57
看见了
ZEND_API int zend_hash_exists(HashTable *ht, char *arKey, uint nKeyLength);
ZEND_API int zend_hash_index_exists(HashTable *ht, ulong h);
了没有?
黑夜路人 21:26:04
HashTable 这个结构体拿来看看。。。
善良的BEN 21:26:44
不让发?
善良的BEN 21:26:50
收到了没有?
黑夜路人 21:26:51
啥?没看见。。。
Phzzy 21:26:52
D我在公司,黑夜保存一份聊天记录!!!
黑夜路人 21:27:05
哈哈。。。好,我发到博客上
善良的BEN 21:27:33
KAO~没有发送成功(服务器超时).
黑夜路人 21:27:54
不要发图。。。
黑夜路人 21:28:02
直接复制粘贴代码
善良的BEN 21:28:21
 struct _hashtable;
typedef struct bucket{
 ulong h;
 uint nKeyLength;
 void *pData;
 void *pDataPtr;
 struct bucket *pListNext;
 struct bucket *pListLast;
 struct bucket *pNext;
 struct bucket *pLast;
 char arKey[1]; /* Must be last element */
} Bucket;
typedef struct _hashtable {
 uint nTableSize;
 uint nTableMask
 uint nNumofElements;
 ulong nNextFreeElement;
 Bucket *pInternalPointer;
 Bucket *pListHead;
 Bucket *pListTail;
 Bucket **arBuckets;
 dtor_func_t pDestructor;
 zend_bool persistent;
 unsigned char nApplycount;
 unsigned char nApplyCount;
 zend_bool bApplyProtection;
#if ZEND_DEBUG
 int inconsistent;
#endif
} HashTable;
善良的BEN 21:28:38
看看图片能不能收到~
Phzzy 21:28:59
图也发上哈,我在linux下没鸟图
善良的BEN 21:29:07
。。。
黑夜路人 21:29:11
收到了
黑夜路人 21:29:48
考,结构体套结构体。。。汗
善良的BEN 21:29:55
就在 Zend/zend_hash.h 中
善良的BEN 21:30:29
那个 bucket 就是放具体元素的地方
善良的BEN 21:30:52
HashTable 负责管理这些元素
善良的BEN 21:31:14
bucket 里面有个
 void *pData;
 void *pDataPtr;
善良的BEN 21:31:28
所以可以放任何类型的数据
善良的BEN 21:31:53
变量、函数、类、常量等都在这里面放着
黑夜路人 21:33:28
上面及格 *pListNext 和 *pListLast 干哈滴?
善良的BEN 21:35:24
不着~木有具体在意过
善良的BEN 21:35:53
俺也不是万能滴~ 
黑夜路人 21:36:15
在我心中你是!
善良的BEN 21:36:39
不要搞个人崇拜嘛~
黑夜路人 21:37:07
必须滴,新时代必须有新英雄!
善良的BEN 21:37:25
低调,低调。。。。
黑夜路人 21:37:44
写c爽,不过一个指针指来指去。。。好TMD晕。。。


。。。。。

 


http://www.ppmy.cn/news/866071.html

相关文章

QQ2000 的聊天室刷屏机设计技术

program chat2001; uses windows,messages,sysutils; {$R *.RES} const CRLF#13#10; exename:pchar刷屏机器人 2001; var //---------------------- wClass: TWndClass; //窗口类变量 Msg: TMSG; //消息变量 hInst, //程序实例 Handle,…

QQ2011多开的实现

先运行一个客户端A&#xff0c;然后再打开一个客户端B&#xff0c;发现直接激活前一个实例。 我们开着客户端A&#xff0c;OD加载再一个客户端 F8单步走&#xff0c;发现跟到 这个CALL的时候激活客户端A了&#xff0c;在这个CALL下断&#xff0c;CTRLF2重新载入一下&#xff0c…

C# 高仿腾讯QQ (1)

QQ是什么&#xff0c;不用我说了吧&#xff0c;呵呵&#xff0c;一直以来感觉腾讯QQ无论功能&#xff0c;界面&#xff0c;各方面&#xff0c;都十分完美&#xff0c;所以也想着哪天自己开发个&#xff0c;当然盗版跟正版是没什么可比性的啦。做这个&#xff0c;纯粹是为了提高…

tq210 内存配置

S5PV210有两个独立的DRAM控制器&#xff0c;分别是DMC0和DMC1&#xff0c;其中&#xff0c;DMC0最大支持512MByte&#xff0c;DMC1最大支持1GByte&#xff0c;而DMC0和DMC1又同时支持两个片选CS0和CS1。S5PV210的内存模块相比2440和6410来讲要更加复杂一些&#xff0c;要想正确…

Hadoop-day07(MapReduce三个小案例)

MapReduce三个小案例 回顾一下 wordcount案例中map阶段 回顾一下 wordcount案例中的reduce阶段 1、IK分词器(统计三国演义指定词语个数) 步骤一&#xff1a;找到ik依赖,并添加到环境中 步骤二&#xff1a;在hadoop项目中创建子项目&#xff0c;并添加环境依赖 步骤三&#xff1…

025、QQ互联

一、QQ登录开发文档 QQ登录&#xff1a;即我们所说的第三方登录&#xff0c;是指用户可以不在本项目中输入密码&#xff0c;而直接通过第三方的验证&#xff0c;成功登录本项目。 1. QQ互联开发者申请步骤 若想实现QQ登录&#xff0c;需要成为QQ互联的开发者&#xff0c;审核…

QQ API

QQ API设计说明书目录一、引言 31.1 编写目的 31.2 更新时间 3二、总体设计 3三、注册的系统消息 33.1 WM_QQAPI_REGISTER 33.2 WM_QQAPI_REGISTER_RESP 43.3 WM_QQAPI_AVAILABLE 4四、从设备到QQ的自定义事件 54.1 EVENT_QQAPI_SET_AUDIODEVICE …

本地部署 Stable Diffusion XL Gradio Demo WebUI

StableDiffusion XL Gradio Demo WebUI 0. 先展示几张 StableDiffusion XL 生成的图片1. 什么是 Stable Diffusion XL Gradio Demo WebUI2. Github 地址3. 安装 Miniconda34. 创建虚拟环境5. 安装 Stable Diffusion XL Gradio Demo WebUI6. 启动 Stable Diffusion XL Gradio De…