我是搞C#的,最近因为一些原因吧,也在学点php。
今天测试了一段代码,很简单,就是往数据库里写入一行记录。抓一下这段程序的执行时间,产生了一个疑问:php怎么这么慢。
我的php环境是phpstudy集成环境,php版本是5.3.29,服务器用的nginx。
mysql数据库有张表users:
id(自增列),name(varchar),time(time)
我php的测试代码:
<script>function r(s){ window.location=s;}</script><?php$starttime = explode(' ',microtime());$p = Request("p");if($p==""){ InsertRecord(getRand()); echo "插入第1条记录。"; echo "<script>setTimeout(\"r('?p=2');\",10)</script>";}else{ $q = (int)$p; InsertRecord(getRand()); echo "插入第".$q."条记录。"; echo "<script>setTimeout(\"r('?p=".($q+1)."');\",10)</script>";}$endtime = explode(' ',microtime());$thistime = $endtime[0]+$endtime[1]-($starttime[0]+$starttime[1]);$thistime = round($thistime,3);echo "<br>本网页执行耗时:".$thistime." 秒。".time();function Request($s){ if($_REQUEST) { $p = $_REQUEST[$s]; if($p == "") { return ""; } else { return $p; } } else return "";}function getRand(){ $a = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_()&^}{+=|?!@#$%"; $start = rand(0,strlen($a)-1); $len = rand(1,strlen($a)); $str = substr($a,$start,$len); echo "生成的用户名:" . $str ."<br>"; return $str;}function InsertRecord($s){ $link = mysql_connect('localhost', 'root', 'root'); if (!$link) { die('Could not connect: ' . mysql_error()); } //echo 'Connected successfully'; $sql = "insert into users (name,time) values ('" . $s . "','" .date('y-m-d h:i:s',time())."')"; // 执行sql查询 mysql_select_db("test", $link);//设定要操作的数据库 //$result=mysql_query($sql, $link); if (!mysql_query($sql,$link)) { die('Error: ' . mysql_error()); } mysql_close($link); //echo "1 record added"; }?>
protected void Page_Load(object sender, EventArgs e) { DateTime start = DateTime.Now; Run(); DateTime end = DateTime.Now; TimeSpan span = end - start; double seconds = span.TotalSeconds; Response.Write("程序耗时:" + seconds); } private static void Run() { string name = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRS"; Console.WriteLine("插入:" + name); MySqlConnection conn = new MySqlConnection(); conn.ConnectionString = "server=localhost;User Id=root;password=root;Database=test"; conn.Open(); MySqlCommand cmd = new MySqlCommand(); cmd.Connection = conn; cmd.CommandText = "insert into users (name,time) values ('" + name + "','" + DateTime.Now.ToString() + "')"; cmd.ExecuteNonQuery(); cmd.Dispose(); conn.Close(); conn.Dispose(); }
测试用的机器是同一台,配置为win7,i3,5400转硬盘
测试一次,不能说明任何问题
测试当然不是一次呢,可以看到,php代码里用了个循环,我监测了5000多次的写入,每次的写入都是处于1秒左右的。
而同样的,c#的,持续的几十次,除第一次大约是在0.15秒左右外,其他的都是在0.0001秒左右。
所以不是一次的,我是想问问为什么会这样,是代码有问题还是测试环境有问题。
您的循环是 http 大循环,测试的实际是整个 web 系统的响应速度
至少还需要一组无数据库访问页面做对照
多换几个机器测试,综合对比下
注释掉数据库执行后的结果:执行时间都是一样,几乎为0.
是否能从这说明就是php的性能问题?是因为win 7的原因吗?
注释掉数据库执行后的结果:执行时间都是一样,几乎为0.
是否能从这说明就是php的性能问题?是因为win 7的原因吗?
结果一样,还是要1秒
慢点很正常,逻辑清晰就好。解释和编译如何对比!!
慢点很正常,逻辑清晰就好。解释和编译如何对比!!
难道说PHP已经衰落了么。。。。。。
难道说PHP已经衰落了么。。。。。。
无论如何,插入一条记录是不可能要花费 1 秒的
测试时,对照组要有对等的条件
Mysql.net 只在第一次连接数据库时存在真实的物理连接操作,这与 php mysql 扩展的长连接是等效的
但你测试时,php 用的是短连接
我前面已经说了,你测试的是整个 http 会话的时间。下结论前应刨去非 MySQL 的因素
nginx + php 是 CGI 工作方式
你也没说明 C# 是什么方式工作的
如果你把运行环境造成的延时都归罪于 MySQL 的话,显然是不公正的
很明显嘛
把localhost换成127.0.0.1,因为MySQL会去走一个DNS解析的过程,在服务器上也应该使用ip来进行数据库连接,或者在(windows)my.ini里面修改一下配置也是可以的。
就算(当前)测试整个http的周期PHP都还是强过.net的.
C#是直接使用VS2010自带的asp.net Development server调试的,没有附加的内容。
前边尝试过去掉数据库执行的代码,同样再运行,耗时和C#里一样,都是0(或是约等于0)
而加上数据库执行代码后,一个就是1秒多,一个就是0.001秒,那这样应该是可以判断问题出在访问mysql的环节吧。
php访问mysql数据库是自带的驱动吗?C#是直接从官网下载的连接库。
很明显嘛
把localhost换成127.0.0.1,因为MySQL会去走一个DNS解析的过程,在服务器上也应该使用ip来进行数据库连接,或者在(windows)my.ini里面修改一下配置也是可以的。
就算(当前)测试整个http的周期PHP都还是强过.net的.
这个不符合逻辑吧,就算要走dns解析,总不会php走,c#就不走了吧,我那里都用的localhost,并没有哪里使用的ip。
我并没有不允许你把PHP和.NET都使用127.0.0.1去访问。
你发问题讨论的内容是: 在同等的机器下,使用 "合理" 的方法得到 "合理" 的结果。
或许如同xuzuning所说,是我测试方法不正确,但粗略来看,这个似乎也并不大的不妥吧,我所知道的是现在很多大型网站都是使用nginx作为php的容器在使用,而我测试C#的只是使用的VS2010自带的测试服务器,这两者之间本身是存在差异的吧。
你不觉得是跑偏了?
这个不符合逻辑吧,就算要走dns解析,总不会php走,c#就不走了吧,我那里都用的localhost,并没有哪里使用的ip。
我并没有不允许你把PHP和.NET都使用127.0.0.1去访问。
你发问题讨论的内容是: 在同等的机器下,使用 "合理" 的方法得到 "合理" 的结果。
或许如同xuzuning所说,是我测试方法不正确,但粗略来看,这个似乎也并不大的不妥吧,我所知道的是现在很多大型网站都是使用nginx作为php的容器在使用,而我测试C#的只是使用的VS2010自带的测试服务器,这两者之间本身是存在差异的吧。
你不觉得是跑偏了?
开发php应用程序,不要在windows的框架上折腾,操作系统请换成linux,lamp架构!!!
这样的php性能是最好的。
开发php应用程序,不要在windows的框架上折腾,操作系统请换成linux,lamp架构!!!
这样的php性能是最好的。
我让你改代码 希望你改成 单纯的插入数据这样来测试.其次一个呢 我们暂时没你那样的环境做测试 所以也得不出其他结果 兴许你换一台电脑就跑出不一样的结果了,彼此的数据库驱动应该都不是一样的吧 C#是不是有自己的数据库驱动呢.
最后呢 要用mysqli 来测试.....mysql 已经淘汰了.
我让你改代码 希望你改成 单纯的插入数据这样来测试.其次一个呢 我们暂时没你那样的环境做测试 所以也得不出其他结果 兴许你换一台电脑就跑出不一样的结果了,彼此的数据库驱动应该都不是一样的吧 C#是不是有自己的数据库驱动呢.
最后呢 要用mysqli 来测试.....mysql 已经淘汰了.
楼主真逗,写了一段这样的代码就来对比性能