一个php数据库插入记录的性能对比产生的问题。
我是搞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不是想象中的那么强大。
楼主真逗,写了一段这样的代码就来对比性能

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

在PHP中,應使用password_hash和password_verify函數實現安全的密碼哈希處理,不應使用MD5或SHA1。1)password_hash生成包含鹽值的哈希,增強安全性。 2)password_verify驗證密碼,通過比較哈希值確保安全。 3)MD5和SHA1易受攻擊且缺乏鹽值,不適合現代密碼安全。

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。

PHP類型提示提升代碼質量和可讀性。 1)標量類型提示:自PHP7.0起,允許在函數參數中指定基本數據類型,如int、float等。 2)返回類型提示:確保函數返回值類型的一致性。 3)聯合類型提示:自PHP8.0起,允許在函數參數或返回值中指定多個類型。 4)可空類型提示:允許包含null值,處理可能返回空值的函數。

PHP仍然具有活力,其在現代編程領域中依然佔據重要地位。 1)PHP的簡單易學和強大社區支持使其在Web開發中廣泛應用;2)其靈活性和穩定性使其在處理Web表單、數據庫操作和文件處理等方面表現出色;3)PHP不斷進化和優化,適用於初學者和經驗豐富的開發者。

PHP和Python各有優劣,選擇取決於項目需求和個人偏好。 1.PHP適合快速開發和維護大型Web應用。 2.Python在數據科學和機器學習領域佔據主導地位。

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。
