转:谁动了我的内存(PHP内存管理)

首先让我们看一个问题: 如下代码的输出,


  1. var_dump(memory_get_usage());
  2. $a = "laruence";
  3. var_dump(memory_get_usage());
  4. unset($a);
  5. var_dump(memory_get_usage());

输出(在我的个人电脑上, 可能会因为系统,PHP版本,载入的扩展不同而不同):


  1. int(90440)
  2. int(90640)
  3. int(90472)

注意到 90472-90440=32, 于是就有了各种的结论, 有的人说PHP的unset并不真正释放内存, 有的说, PHP的unset只是在释放大变量(大量字符串, 大数组)的时候才会真正free内存, 更有人说, 在PHP层面讨论内存是没有意义的.

那么, 到底unset会不会释放内存? 这32个字节跑哪里去了?

要回答这个问题, 我将从俩个方面入手:


阅读剩余部分...

你知道啥叫真正的美腿吗?别上大街瞎看了

    美腿就是,有5处并拢,4处空隙的腿。具体来说,标有○的5处(大腿,膝,腓,脚脖子内侧,脚尖)左右紧贴在一起,标有×符号的4处(大腿和根儿之间,大腿和膝之间,膝和腓之间,腓和脚脖子之间)是处于分开的状态。除此之外,如果膝朝向着正面且腿形笔直的话,可以说是非常美丽的腿了。

美腿的标准.jpg

说说mysql_connect和mysql_pconnect的区别

      说说mysql_connect和mysql_pconnect的区别,这俩函数用法上差不多,网上有说应该用pconnect的,pconnect是个好东西;也有视pconnect如洪水猛兽的,坚决不让用pconnect的,也有态度暧昧不清的。那这个东西到底如何呢?
     永久链接并不是说,服务器打开了一个连接,然后所有的人都共享这个链接。永久连接一样是每个客户端来就打开一个连接,有200人访问就有200个连接。其实mysql_pconnect()本身并没有做太多的处理, 它唯一做的只是在php运行结束后不主动close掉mysql的连接.
     在php经cgi方式运行时pconnect和connect是基本没有区别的, 因为cgi方式是每一个php访问起一个进程, 访问结束后进程也就结束了, 资源也全释放了. 当php以apache模块方式运行时, 由于apache有使用进程池, 一个httpd进程结束后会被放回进程池, 这也就使得用pconnect打开的的那个mysql连接资源不被释放, 于是有下一个连接请求时就可以被复用.这就使得在apache并发访问量不大的时候, 由于使用了pconnect, php节省了反复连接db的时间, 使得访问速度加快. 这应该是比较好理解的. 但是在apache并发访问量大的时候, 如果使用pconnect, 会由于之前的一些httpd进程占用的mysql连接没有close, 则可能会因为mysql已经达到最大连接着, 使得之后的一些请求永远得不到满足.若mysql最大连接数设为500, 而apache的最大同时访问数设为2000,假设所有访问都会要求访问db, 而且操作时间会比较长,当前500个请求的httpd都没有结束的时候,之后的httd进程都是无法连接到mysql的(因已经达到mysql最大连接数). 只有当前500个httpd进程结束或被复用才可以连接得到了mysql.
     当db操作复杂, 耗时较长时, 因httpd会fork很多并发进程处理, 而先产生的httpd进程不释放db连接, 使得后产生的httpd进程无法连上db. 因为这样没有复用其它httpd进程的mysql连接. 于是会就产生很多连接超时。 在并发访问量不高时,使用pconnect可以简单提高访问速度, 但在并发量增大后, 是否再使用pconnect就要看程序员的选择了.
     就我个人认为, php现在对mysql的连接并没有真正用到连接池, pconnect也只是相当于借了apache的进程池来用, 所以在并发访问量大的时候pconnect并不能很好的提高访问db效率.
      在实际的应用中,用mysql_pconnect的话,每次刷新和请求新的页面都比较快,而用mysql_connect的话,每次刷新都要重新请求,当数据库连接比较慢的时候,就能看出差异了。当你的数据库连接比较慢,DB操作不是很复杂,并且你的程序足够自信,不会产生死锁的时候,或者你拥有对服务器的控制权,满足以上四个条件中的任意两个,那就可以用pconnect。
    pconnect不用在脚本里关闭,可以在mysql中设置lifetime,也可以写shell定期扫描,kill掉休眠过长的连接。 一句话总结:要用好pconnect,不仅仅是php脚本的事 还关系到数据库和服务器的设置。

用mysql的存储过程和event来做计划任务

     关键字:mysql,PROCEDURE,event,crontab.摘自《PHP开发指南》第十八章。
     我在第一章提到过CLI的执行是不限时的,所以你可以用它来做计划任务。也就是在未来的某个时间自动执行某个任务。网页的话,可以这么来

<?Php


set_time_limit(0);

if(date("m")%5==0){

//do something}

    加入ignore_user_abort(true)是为了保证用户在关闭了网页后,程序不会立即中断,而是在后台执行。计划任务的触发可以由用户或蜘蛛来触发,也可以对某些任务采取伪任务的方式(即若任务没有被外界触发,那么在后台查看任务时,先标记任务为已执行,然后再触发慢慢地去执行。因为很多任务的实时性并不高)。如果是unix系操作系统的话,则用crontab这款工具来执行。如果是涉及到单纯的数据库操作的话,则可以由mysql5.1的event来定时触发。这样比用php来的更直接。既然是数据库操作,我为啥不直接用mysql呢?何必再php调mysql多此一举?下面我举个例子,顺带介绍下mysql里的存储过程和定时器。

比如,我有个需求,需要定期删除已被处理过的log,而这些log存储在数据库里,表结构如下:

阅读剩余部分...

转:《百姓网公开笔试题:查询条件的子集判断》的一份 PHP 答卷


原题见

我的答卷在

演示地址为 http://soulogic.com/subset_test/




碰到这道题时才意识到自己的见识浅薄,非等到这种题出来才能明白,高等数学对于程序员而言是多么重要。其中最难最关键的部分是在留言里看到了 qmigh 的解释才搞定的。

这道题分三部分:把查询语句转成数组结构,然后把层级混乱的条件最终分解成 以 OR 关联的 AND 合集(也就是 qmigh 所解释的),以及按规则来读取并判断两个数组。在我的代码里,Class TreeStore 负责前两步,Class SetCheck 负责后一步。

由于我完全说不出任何术语,只能把数组的转换过程列一下了。

原始语句

阅读剩余部分...

    Page :
  1. 1
  2. 2