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

    技术2022-05-11  96

     

    /* 请勿转载,因为转载也没啥意义,看看就行咧。。。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:19mysql 善良的BEN 20:20:41pconnect 用的太多了? 黑夜路人 20:20:46HOHO 黑夜路人 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:0719、现在因为投票人数太多,网站时常出现too many connection的错误,请提供解决方案。 (1) 增加MySQL服务器端最大链接数量 (2) PHP端不使用长连接:mysql_pconnect函数,而使用mysql_connect函数链接数据库 (3) 使用数据库连接池 善良的BEN 20:23:48跟我说的差不多嘛~  黑夜路人 20:23:5620、在成功解决连接数的问题后,发现程序运行缓慢,经查发现是mysql并发太多,表被锁定的现象严重,请提供解决方案。 善良的BEN 20:24:451、拆表。这是你说的~   善良的BEN 20:25:072、使用事务和存储过程 黑夜路人 20:25:46事务能搞定? 飞风 20:25:56事务会是速度更慢吧? 黑夜路人 20:26:1620、在成功解决连接数的问题后,发现程序运行缓慢,经查发现是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:25s/复杂/负载/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:2621、因为用户实在太多,所以又分配给你两台服务器,你会如何来安排这3台服务器? 善良的BEN 20:32:56memcache? 飞风 20:33:12一台web服务器,两台数据库服务器集群吧? 善良的BEN 20:33:173台都是db吗? 黑夜路人 20:33:25不可能 黑夜路人 20:33:28肯定有一台web 黑夜路人 20:33:4721、因为用户实在太多,所以又分配给你两台服务器,你会如何来安排这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:31io的瓶颈在于硬盘的制作工艺上。。。 黑夜路人 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:1913、请举例说明在你的开发过程中用什么方法来加快页面的加载速度。 善良的BEN 20:37:51页面要小 黑夜路人 20:37:55这个我就不知道怎么回答了。。。冒汗。。。 善良的BEN 20:38:11需要时才 include 善良的BEN 20:38:20还有 eA 善良的BEN 20:38:42要多利用 js 飞风 20:38:57JS最好都在一个文件中加载。 善良的BEN 20:39:14因为 js 不但可以减少服务端的压力而且还可以被客户端缓存 黑夜路人 20:39:34HOHO,就是ajax咧 飞风 20:39:44运行的时候去掉空格和注释  善良的BEN 20:39:54现在客户端机器那么NB不用就太浪费了 黑夜路人 20:40:57汗。。。 善良的BEN 20:41:04去掉空格和注释这个太BT了~ 黑夜路人 20:41:17apc跟ea是一个东西吗? 善良的BEN 20:41:27一类东西 黑夜路人 20:41:32Alternative PHP Cache 黑夜路人 20:41:37xCache 黑夜路人 20:41:42还有叫啥的? 善良的BEN 20:41:46eA 善良的BEN 20:42:06eAccelerator 善良的BEN 20:42:13PHP Accelerator 黑夜路人 20:42:20以前叫做 mmcache ? 飞风 20:42:35不是吧。。 善良的BEN 20:42:36恩 善良的BEN 20:42:39turck-mmcache 善良的BEN 20:42:48现在这娃去zend了 黑夜路人 20:42:50历史够悠久 黑夜路人 20:43:01zend的缓存工具叫啥? 善良的BEN 20:43:21zps 善良的BEN 20:43:38zend 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:57php 5.2 的 oo 不比 php 4的 po 差多少 黑夜路人 20:48:23什么意思?解析速度? 善良的BEN 20:48:24但php 5.2 的 oo 跟 php 5.2 的 po 嘛。。。  善良的BEN 20:48:49po  = 面向过程啊 黑夜路人 20:48:49你的意思是说,php5.2的整体解析性能超过了php4.x 黑夜路人 20:49:09不管是oop还是opp? 善良的BEN 20:49:42可以想想看嘛,那么多牛人那几年时间也不是在吃白饭嘛~ 黑夜路人 20:50:00php5.2 oop == php 4.x oppphp5.2 opp != php5.2 oop  黑夜路人 20:50:42那么,是否: php5.2 opp > php4.x opp ? 善良的BEN 20:50:54right~  黑夜路人 20:51:11反正就是比php4.x快就对了 黑夜路人 20:51:20php5.0.x如何? 善良的BEN 20:51:29垃圾 黑夜路人 20:51:40汗。。。我现在一直在用。。。 善良的BEN 20:51:55整个一个实验品 黑夜路人 20:52:19汗。。。 善良的BEN 20:52:20php5源码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:23function 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:4113、请举例说明在你的开发过程中用什么方法来加快页面的加载速度。(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:478、请说明PHP中传值与传引用的区别。什么时候传值什么时候传引用? 善良的BEN 21:00:05老掉牙的题目了~  黑夜路人 21:00:29嘿嘿,又不也是c 黑夜路人 21:00:37php没有指针,只有引用 黑夜路人 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:07strlen函数在哪里定义的?我找遍了 ext/stands/string.c 也没发现 善良的BEN 21:04:09引用时就再建一个变量名,这个变量名还是指向被引用那个变量所指向符号表中的值 善良的BEN 21:05:10你要说不是指针,php 根本就没有内存这个概念,你怎么说他是个指针? 善良的BEN 21:05:23但是你可以这样去理解他~ 黑夜路人 21:05:35abc  ---> 变量1aaa  ---> 变量1 善良的BEN 21:05:45把他当成泛指的或者是特殊的指针就行了 黑夜路人 21:05:52两个变量名指向同一个符号表中的值。。。 善良的BEN 21:05:59right~ 善良的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:33unset的时候如果还有别的引用就不delete,只是 ref_count-- 而已 善良的BEN 21:11:11如果 ref_count-- 后为 0 就彻底 delete 黑夜路人 21:12:45就是把符号表中的值得给删除掉 黑夜路人 21:12:58还有想问你两个问题 黑夜路人 21:13:04strlen函数在哪里定义的?我找遍了 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:23int 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:43php的数组在脚本引擎中是怎么存储的?给个结构体看看。。。 善良的BEN 21:24:09就是一个hash表啊 Phzzy 21:24:22D你们太彪悍了 黑夜路人 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:40ZEND_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:04HashTable 这个结构体拿来看看。。。 善良的BEN 21:26:44不让发? 善良的BEN 21:26:50收到了没有? 黑夜路人 21:26:51啥?没看见。。。 Phzzy 21:26:52D我在公司,黑夜保存一份聊天记录!!! 黑夜路人 21:27:05哈哈。。。好,我发到博客上 善良的BEN 21:27:33KAO~没有发送成功(服务器超时). 黑夜路人 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:52HashTable 负责管理这些元素 善良的BEN 21:31:14bucket 里面有个  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)