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

robake 2015-08-28 01:38:12
我是搞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了。
测试结果:



对比差别能这么大吗?
...全文
332 1 收藏 26
写回复
26 条回复
用户昵称不能为空 2015年09月04日
你的那段PHP 代码明显有问题,首先比较罗嗦,很初级
回复 点赞
__小帅 2015年09月03日
没有可比性,看看你的代码就知道你是刚入门php。完全不是一个套路。 先用settimeout 延时 然后再测试整个http请求过程时间。
回复 点赞
黄袍披身 2015年09月01日
我让你改代码 希望你改成 单纯的插入数据这样来测试.其次一个呢 我们暂时没你那样的环境做测试 所以也得不出其他结果 兴许你换一台电脑就跑出不一样的结果了,彼此的数据库驱动应该都不是一样的吧 C#是不是有自己的数据库驱动呢. 最后呢 要用mysqli 来测试.....mysql 已经淘汰了.
回复 点赞
robake 2015年09月01日
引用 20 楼 qq_17461621 的回复:
开发php应用程序,不要在windows的框架上折腾,操作系统请换成linux,lamp架构!!! 这样的php性能是最好的。
我还没入门,只是在学的阶段,windows环境下的环境是最容易布署的。
回复 点赞
BalongX 2015年09月01日
楼主真逗,写了一段这样的代码就来对比性能
回复 点赞
robake 2015年09月01日
引用 22 楼 PhpNewnew 的回复:
我让你改代码 希望你改成 单纯的插入数据这样来测试.其次一个呢 我们暂时没你那样的环境做测试 所以也得不出其他结果 兴许你换一台电脑就跑出不一样的结果了,彼此的数据库驱动应该都不是一样的吧 C#是不是有自己的数据库驱动呢. 最后呢 要用mysqli 来测试.....mysql 已经淘汰了.
试了把mysqli,结果是一样的,没有变化。 算了,结贴,也许php不是想象中的那么强大。
回复 点赞
robake 2015年08月31日
引用 11 楼 misakaqunianxiatian 的回复:
难道说PHP已经衰落了么。。。。。。
别在那开玩笑,我相信现在这么大的互联网企业用php开发高并发应用,说明php的性能其实是很可观的。 我是想搞明白为什么我测试的却是这样,是代码问题还是环境问题。
回复 点赞
水静流深308 2015年08月31日
开发php应用程序,不要在windows的框架上折腾,操作系统请换成linux,lamp架构!!! 这样的php性能是最好的。
回复 点赞
misaka去年夏天 2015年08月31日
难道说PHP已经衰落了么。。。。。。
回复 点赞
robake 2015年08月31日
引用 9 楼 qq_17461621 的回复:
慢点很正常,逻辑清晰就好。解释和编译如何对比!!
那是否是说两者的性能差异是因为一个编译了一个是脚本解释执行的? 但就算是这样,差异不会这么大吧。
回复 点赞
水静流深308 2015年08月31日
慢点很正常,逻辑清晰就好。解释和编译如何对比!!
回复 点赞
robake 2015年08月31日
结果一样,还是要1秒
回复 点赞
黄袍披身 2015年08月31日
引用 6 楼 robake 的回复:
注释掉数据库执行后的结果:执行时间都是一样,几乎为0.






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


把代码改一下

php -q 测试文件.php

直接跑看结果
回复 点赞
robake 2015年08月31日
注释掉数据库执行后的结果:执行时间都是一样,几乎为0. 是否能从这说明就是php的性能问题?是因为win 7的原因吗?
回复 点赞
robake 2015年08月31日
引用 17 楼 zhoukang0916 的回复:
这个不符合逻辑吧,就算要走dns解析,总不会php走,c#就不走了吧,我那里都用的localhost,并没有哪里使用的ip。 我并没有不允许你把PHP和.NET都使用127.0.0.1去访问。 你发问题讨论的内容是:在同等的机器下,使用 "合理" 的方法得到 "合理" 的结果。 或许如同xuzuning所说,是我测试方法不正确,但粗略来看,这个似乎也并不大的不妥吧,我所知道的是现在很多大型网站都是使用nginx作为php的容器在使用,而我测试C#的只是使用的VS2010自带的测试服务器,这两者之间本身是存在差异的吧。 你不觉得是跑偏了?
恐怕是你这里理解错了,我的问题是同一台机器,不同的服务器环境,性能差别为什么这么大?大的原因是代码问题还是环境问题,还是测试方法的问题,我说到的那些使用nginx作为容器,这怎么就是跑偏了?
回复 点赞
robake 2015年08月31日
回复 点赞
PandaIT 2015年08月31日
这个不符合逻辑吧,就算要走dns解析,总不会php走,c#就不走了吧,我那里都用的localhost,并没有哪里使用的ip。 我并没有不允许你把PHP和.NET都使用127.0.0.1去访问。 你发问题讨论的内容是:在同等的机器下,使用 "合理" 的方法得到 "合理" 的结果。 或许如同xuzuning所说,是我测试方法不正确,但粗略来看,这个似乎也并不大的不妥吧,我所知道的是现在很多大型网站都是使用nginx作为php的容器在使用,而我测试C#的只是使用的VS2010自带的测试服务器,这两者之间本身是存在差异的吧。 你不觉得是跑偏了?
回复 点赞
robake 2015年08月31日
引用 14 楼 zhoukang0916 的回复:
很明显嘛 把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自带的测试服务器,这两者之间本身是存在差异的吧。
回复 点赞
robake 2015年08月31日
C#是直接使用VS2010自带的asp.net Development server调试的,没有附加的内容。 前边尝试过去掉数据库执行的代码,同样再运行,耗时和C#里一样,都是0(或是约等于0) 而加上数据库执行代码后,一个就是1秒多,一个就是0.001秒,那这样应该是可以判断问题出在访问mysql的环节吧。 php访问mysql数据库是自带的驱动吗?C#是直接从官网下载的连接库。
回复 点赞
PandaIT 2015年08月31日
很明显嘛 把localhost换成127.0.0.1,因为MySQL会去走一个DNS解析的过程,在服务器上也应该使用ip来进行数据库连接,或者在(windows)my.ini里面修改一下配置也是可以的。 就算(当前)测试整个http的周期PHP都还是强过.net的.
回复 点赞
发动态
发帖子
基础编程
创建于2007-09-28

9734

社区成员

14.0w+

社区内容

从PHP安装配置,PHP入门,PHP基础到PHP应用
社区公告
暂无公告