一個php資料庫插入記錄的效能對比產生的問題。

來源:互聯網
上載者:User
我是搞C#的,最近因為一些原因吧,也在學點php。
今天測試了一段代碼,很簡單,就是往資料庫裡寫入一行記錄。抓一下這段程式的執行時間,產生了一個疑問:php怎麼這麼慢。

我的php環境是phpstudyIntegration Environment,php版本是5.3.29,伺服器用的nginx。
mysql資料庫有張表users:
id(自增列),name(varchar),time(time)
我php的測試代碼:
本網頁執行耗時:".$thistime." 秒。".time();function Request($s){if($_REQUEST){$p = $_REQUEST[$s];if($p == ""){return "";}else{return $p;}}elsereturn "";}function getRand(){$a = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_()&^}{+=|?!@#$%";$start = rand(0,strlen($a)-1);$len = rand(1,strlen($a));$str = substr($a,$start,$len);echo "產生的使用者名稱:" . $str ."
";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不是想象中的那麼強大。

樓主真逗,寫了一段這樣的代碼就來對比效能

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.