估计php5。0能好一些,连接对象的管理始终是java得好。

解决方案 »

  1.   

    好,有空我也装个php5.0来测一下,看结果会怎么样。虽说并发连接1000是没什么可能,但在高峰期一些负载比较重的站点,如果在内部某个页面执行的时间又比较长,那么占用几百个连接还是有可能的。这是一个很大的问题,PHP连接一多效率好像就会急速下降了
      

  2.   

    怎么没把ASP的也一块测试一下
      

  3.   

    能不能用mysql_connect()来测试一下.
    mysql_pconnect()并没有使用连接池..所以在并发量大的时候反而会使得效率降低的
      

  4.   

    这个测试很有意思,建议你也使用tomcat等其它容器试一下。另外,再使用mysql_connect做一下测试。没有做过这方面的测试,关注。
      

  5.   

    确定一点,这种测试时不要用pconnect。pconnect一直霸着数据库不放。并发测试应该用connect,而且要注意一用完立马释放连接,这样可以提高资源利用率。估计并发速度也能提高点。你再测测看。
      

  6.   

    我看了phpmanual,里面说pconnect和connect的区别是,用pconnect不用重新打开连接,因此选用pconnect可以提高效率。phpmanual好象真的是这么讲的。每次都重新打开数据库连接会很浪费时间的,如果是这样的话应该更比不上jsp。有空我再测试一下。不过要等到星期一去公司才能有相同的硬件条件了。
      

  7.   

    "PHP连接一多效率好像就会急速下降了"
    那是因为你使用pconnect如果是connect就不会出现“急速下降”
      

  8.   

    关于类似的测试早看过了,个人喜欢的是PHP的开放和与平台无关性
      

  9.   

    建议使用mysql_connect()和mysql_close()做测试
      

  10.   

    这个周末也一直进行类似的测试,比较好玩。我觉得上面有几位仁兄都说错了,根据我的测试结果,证明phpmanual说得真的不错,mysql_pconnect的确比mysql_connect的效率要高得多,而并不是上面几位说的mysql_connect的效率高。其实这个测试很简单,大家无论什么语言,只要支持多线程的就可以了。你可以每次开多个线程同时连接两个网页,一个用connect,一个用pconnect,然后再记录平均的花费时间。我敢保证,只要开十个线程以上,pconnect的效率至少是connect的两倍以上!这是我的实测结果。另外要注意的是这两个网页应该对数据库进行比较繁重的select工作,占连接的时间应该长一点,比如从一个具有65万条记录的表中间大约35万处select 100条记录(不要在那些只有一百条记录的表中select十条记录,这样一点意义都没,也测不了速度)。这样很容易就反映出速度的差距了。
        总结一下,根据我的测试结果,大约可以得知以下信息(信不信大家自己去试验,欢迎发表心得,我也会有空无聊还测试其它DBMS和其它server):
        1、对于php来说,任何数据库的pconnect函数都比connect函数效率要高!当一个站点负载很重的时候,我觉得使用pconnect要好(其实想想也很有道理,连接数据库是比较耗时的,不然java中也不会搞个连接池。想起我以前用PHP开发过的一个负载很重的OA,居然用connect,汗:(
        2、如果是比较简单的不涉及很繁重的数据库操作的页面,好像PHP比JSP还要快。
        3、如果是简单地操作数据库,数据库操作能在很短的时间完成,PHP的pconnect和JSP加了连接池的速度差不多。而connect则弱很多(当然,和JSP的Class.forName(XXX)..DriverManager.getConnection...之类的差不多,都是很蠢的每次重新打开数据库连接)
        4、如果对数据库的操作比较繁重,不能在很短的时间完成,就像我上述的那个,单个线程也要0.7秒左右,PHP,无论是pconnect或者connect,都比JSP加连接池效率要差很远很远。
        5、我个人觉得PHP的pconnect和JSP的连接池机制有点相似了,只是pconnect的管理要比人家的连接池差一大截,效率也低一大截。上述的测试,PHP主要就输在这里。
        6、再次提醒大家写PHP时记住用pconnect而不是connect,繁重的时候这真的是可能是一个瓶颈。
      

  11.   

    我们学校的服务器也是用apache2+php4.3的,
    有时候在访问量很多时,速度就会很慢,相反
    我在一台asp的主机上就从来没有这种情况,
    难道php比asp差??
      

  12.   

    其实如果说php对mysql等和处理不如jsp这样的结果我是可以接受的..但是就这个测试来说, 我觉可能php对mysql处理方面还没有做太多的优化.(当然jsp那也可能也没做什么优化).
    ---
    我先简单说一下php中mysql_pconnect()的实现方式吧, 其实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.其实这个也很好解释了xgy_p的测试中若操作比较简单, pconnect比connect效率高很多, 而且跟使用jsp的连接池的速度比较接近. 因为这个时候httpd进程可以不断的给复用.而当DB操作复杂, 耗时较长时, 因httpd会fork很多并发进程处理, 而先产生的httpd进程不释放db连接, 使得后产生的httpd进程无法连上db. 因为这样没有复用其它httpd进程的mysql连接. 于是会就产生很多连接超时, 像一开始的1000个并发连接测试说几乎都是连接超时就是这个原因.---
    反进来看jsp用的如果是纯粹的db连接池, 则不会有因为达到mysql连接上限而连不上的问题, 因为jsp的连池会使得可以等待其它连接使用完毕并复用. 
    因此在并发访问量不高时,使用pconnect可以简单提高访问速度, 但在并发量增大后, 是否再使用pconnect就要看程序员的选择了..
      

  13.   

    上述测试用的mysql3.23.46(很旧,但很稳定,现在大型网站一般都用它),JDBC驱动用org.gjt.mm.mysql.Driver那个。
    to freecmd(自由鼠) :
        访问量多的时候如果使用connect方法的话速度会拖很慢的,看看你学校那台是不是这样。我认为ASP比PHP还要慢很多倍,ASP.NET可能会好,ASP就不用说了,虽然我没测试过,有空我会试试。
      

  14.   

    en..就我个人认为, php现在对mysql的连接并没有真正用到连接池, pconnect也只是相当于借了apache的进程池来用, 所以在并发访问量大的时候pconnect并不能很好的提高访问DB效率. 在这一点上. php的确比不上jsp.就目前的这种情况, 如果并发量大的话, 我个人建议是好还用mysql_connect.
      

  15.   

    看着小瑜的评论觉得有点道理。实际测试PHP的瓶颈真的就在连接DB这里,而且并发越大,差距越明显,这样的话真的很难适合于高负荷的应用了。PHP中到底有没有类似于JAVA中的连接池之类的东西啊?有没人知道怎样实现啊?我觉得PHP的社团这么聪明,没理由没人会想过这个问题的,应该有解决方法吧。改天我上php.net仔细看看。另外想问问大家,国内还有没有哪个关于PHP的论坛比较有深度一点的。
      

  16.   

    提个醒:php与mysql连接用/tmp/socket而不用127.0.0.1(或localhost)访问效率提高30%。
      

  17.   

    还有呀,不知楼主给单个php进程配置的内存是多少。