PHP データベースにレコードを挿入するパフォーマンスの比較から疑問が生じます。

WBOY
リリース: 2016-06-23 13:27:16
オリジナル
1094 人が閲覧しました

私は 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 rpm ハード ドライブで構成されています

一度テストしただけでは問題は説明されません



もちろんテストは5,000 回を超える書き込みを監視したところ、PHP コードでループが使用されており、各書き込みに約 1 秒かかっていることがわかりました。

そして、同じ C# が何十回も続きますが、最初の 0.15 秒を除いて、その他はすべて約 0.0001 秒です。

では、これは一度限りの問題ではなく、なぜコードに問題があるのか​​、それともテスト環境に問題があるのか​​を尋ねたいと思います。

ループは大規模な http ループです。実際にテストされるのは、Web システム全体の応答速度です。
比較するには、少なくともデータベースにアクセスしない一連のページが必要です。

テストするには、さらにいくつかのマシンに変更します。

データベースの実行をコメントアウトします。最終結果: 実行時間はほぼ 0 です。





これは、PHP のパフォーマンスの問題であることを示していますか? win7のせいでしょうか?

データベースの実行をコメントアウトした後の結果: 実行時間は同じで、ほぼ 0 です。







これは、PHP のパフォーマンスの問題であることを示していますか? win7のせいでしょうか?


コードを変更します

php -q Test file.php

直接実行して結果を確認します
結果は同じですが、それでも 1 秒かかります

ロジックが正しい限り、遅くなるのは正常ですクリア。解釈と編纂の比較方法! !

ロジックが明確であれば、遅くても正常です。解釈と編纂の比較方法! !


ということは、2 つのパフォーマンスの違いは、一方がコンパイルされ、もう一方がスクリプトによって解釈されて実行されるためということですか?

それでも、その差はそれほど大きくないでしょう。

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 開発サーバーを使用して直接デバッグされます。

データベースによって実行されたコードを削除して再度実行してみましたが、消費時間は C# と同じで 0 (またはほぼ 0 に等しい) です。
データベースによって実行されたコードを追加すると、1 が大きくなります。 1 秒、もう 1 つは 0.001 秒である場合、問題は mysql へのアクセスにあると判断できるはずです。

php には mysql データベースにアクセスするための独自のドライバーがありますか? C# は、公式 Web サイトから直接ダウンロードされた接続ライブラリです。

それは明らかです

localhost を 127.0.0.1 に変更します。MySQL は DNS 解決プロセスを通過するため、データベース接続にはサーバー上の IP を使用するか、(Windows) my.ini で少し変更する必要があります。という構成も可能です。

たとえ http サイクル全体が (現時点で) テストされたとしても、PHP は依然として .net より優れています



これは論理的ではありません。これらはすべて localhost を使用し、IP は使用されません。

http サイクル全体を通して、php は .net よりも優れています。これは私のテストと矛盾しているようです。

おそらく xuzuning が言ったように、私のテスト方法は間違っていますが、大まかに見て、これは大きな問題ではないようです。現在、多くの大規模な Web サイトが PHP のコンテナーとして nginx を使用しているということです。 C# をテストするために VS2010 に付属のテスト サーバーのみを使用しました。この 2 つは異なります。

これは論理的ではありません。DNS 解決を使用する必要がある場合でも、どこでも localhost を使用しており、IP は使用されていません。

127.0.0.1 を使用して PHP と .NET の両方にアクセスすることは許可しません。

ご質問の内容は次のとおりです: 同じマシンの下で、「合理的な」結果を得るために「合理的な」方法を使用します。

おそらく xuzuning が言ったように、私のテスト方法は間違っていますが、大まかに見て、これは大きな問題ではないようです。現在、多くの大規模な Web サイトが PHP コンテナーとして nginx を使用しているということです。 C# をテストするために VS2010 に付属のテスト サーバーのみを使用しました。この 2 つには違いがあります。

脱線していると思いませんか?


これは論理的ではありません。DNS 解決を使用したい場合でも、どこでも php や C# を使用するわけではありません。また、IP も使用されません。

127.0.0.1 を使用して PHP と .NET の両方にアクセスすることは許可しません。

ご質問の内容は次のとおりです: 同じマシンの下で、「合理的な」結果を得るために「合理的な」方法を使用します。

おそらく xuzuning が言ったように、私のテスト方法は間違っていますが、大まかに見て、これは大きな問題ではないようです。現在、多くの大規模な Web サイトが PHP コンテナーとして nginx を使用しているということです。 C# をテストするために VS2010 に付属のテスト サーバーのみを使用しました。この 2 つには違いがあります。

道を外れたと思いませんか?



ここで誤解しているのではないかと思いますが、同じマシンでもサーバー環境が異なると、なぜこれほど大きなパフォーマンスの差が生じるのでしょうか?最大の理由は、コードの問題、環境の問題、またはコンテナとして nginx を使用するテスト方法の問題ですが、なぜこれが間違っているのでしょうか。

PHP アプリケーションを開発するときは、Windows フレームワークをいじらないでください。オペレーティング システムを Linux または Lamp アーキテクチャに変更してください。 ! !
この種の php パフォーマンスは最高です。

PHP アプリケーションを開発するときは、Windows フレームワークをいじらないでください。オペレーティング システムを Linux または Lamp アーキテクチャに変更してください。 ! !
この種の php パフォーマンスは最高です。



私はまだ始めていません。学習段階にあるだけですが、Windows 環境が最も簡単に導入できます。

コードの変更をお願いしましたが、テスト用のデータを挿入するだけのコードに変更していただければ幸いです。2 番目については、現時点ではテスト用の環境がありません。おそらく、コンピューターを変更すると、異なる結果が得られるでしょう。その結果、C# には独自のデータベース ドライバーがあるのでしょうか? 最後に、mysqli を使用してテストする必要があります。 ...mysql は削除されました

コードを変更させていただきます。単純にテストするデータを挿入するように変更していただければ幸いです。2 つ目については、あなたのようなテスト環境がありません。おそらく、コンピューターを変更すると、それぞれ異なる結果が得られるでしょう。C# には独自のデータベース ドライバーが必要ですか? mysqli を使用してテストする...mysql が削除されました


mysqli を試してみましたが、結果は同じで、変化はありません。

忘れてください、ノット、おそらく php は想像されているほど強力ではありません。

ポスターはとても面白いので、パフォーマンスを比較するために次のようなコードを書きました
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート