> 백엔드 개발 > PHP 튜토리얼 > 一个php数据库插入记录的性能对比产生的问题。

一个php数据库插入记录的性能对比产生的问题。

WBOY
풀어 주다: 2016-06-23 13:27:16
원래의
1096명이 탐색했습니다.

我是搞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";	}?>
로그인 후 복사


我发现执行时间居然有1秒多点,发现很慢。

而相同的,我用C#整了段代码:
        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();        }
로그인 후 복사

结果是速度远超php了。
测试结果:



对比差别能这么大吗?


回复讨论(解决方案)

测试用的机器是同一台,配置为win7,i3,5400转硬盘

测试一次,不能说明任何问题



测试当然不是一次呢,可以看到,php代码里用了个循环,我监测了5000多次的写入,每次的写入都是处于1秒左右的。

而同样的,c#的,持续的几十次,除第一次大约是在0.15秒左右外,其他的都是在0.0001秒左右。

所以不是一次的,我是想问问为什么会这样,是代码有问题还是测试环境有问题。

您的循环是 http 大循环,测试的实际是整个 web 系统的响应速度
至少还需要一组无数据库访问页面做对照

多换几个机器测试,综合对比下

注释掉数据库执行后的结果:执行时间都是一样,几乎为0.






是否能从这说明就是php的性能问题?是因为win 7的原因吗?

注释掉数据库执行后的结果:执行时间都是一样,几乎为0.






是否能从这说明就是php的性能问题?是因为win 7的原因吗?



把代码改一下

php -q  测试文件.php

直接跑看结果

结果一样,还是要1秒

慢点很正常,逻辑清晰就好。解释和编译如何对比!!

慢点很正常,逻辑清晰就好。解释和编译如何对比!!



那是否是说两者的性能差异是因为一个编译了一个是脚本解释执行的?

但就算是这样,差异不会这么大吧。

难道说PHP已经衰落了么。。。。。。

难道说PHP已经衰落了么。。。。。。



别在那开玩笑,我相信现在这么大的互联网企业用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。

整http周期,php都强过.net,这个似乎跟我这个测试有冲突吧。

或许如同xuzuning所说,是我测试方法不正确,但粗略来看,这个似乎也并不大的不妥吧,我所知道的是现在很多大型网站都是使用nginx作为php的容器在使用,而我测试C#的只是使用的VS2010自带的测试服务器,这两者之间本身是存在差异的吧。

这个不符合逻辑吧,就算要走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自带的测试服务器,这两者之间本身是存在差异的吧。 

你不觉得是跑偏了?



恐怕是你这里理解错了,我的问题是同一台机器,不同的服务器环境,性能差别为什么这么大?大的原因是代码问题还是环境问题,还是测试方法的问题,我说到的那些使用nginx作为容器,这怎么就是跑偏了?

开发php应用程序,不要在windows的框架上折腾,操作系统请换成linux,lamp架构!!!
这样的php性能是最好的。

开发php应用程序,不要在windows的框架上折腾,操作系统请换成linux,lamp架构!!!
这样的php性能是最好的。



我还没入门,只是在学的阶段,windows环境下的环境是最容易布署的。

我让你改代码 希望你改成 单纯的插入数据这样来测试.其次一个呢 我们暂时没你那样的环境做测试 所以也得不出其他结果 兴许你换一台电脑就跑出不一样的结果了,彼此的数据库驱动应该都不是一样的吧 C#是不是有自己的数据库驱动呢.

最后呢 要用mysqli 来测试.....mysql 已经淘汰了.

我让你改代码 希望你改成 单纯的插入数据这样来测试.其次一个呢 我们暂时没你那样的环境做测试 所以也得不出其他结果 兴许你换一台电脑就跑出不一样的结果了,彼此的数据库驱动应该都不是一样的吧 C#是不是有自己的数据库驱动呢.

最后呢 要用mysqli 来测试.....mysql 已经淘汰了.



试了把mysqli,结果是一样的,没有变化。

算了,结贴,也许php不是想象中的那么强大。

楼主真逗,写了一段这样的代码就来对比性能

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿