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

/* 请勿转载,因为转载也没啥意义,看看就行咧。。。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晕。。。


。。。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值