私は 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"; }?>
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(); }
テストに使用したマシンは同じで、win7、i3、5400 rpm ハード ドライブで構成されています
一度テストしただけでは問題は説明されません
もちろんテストは5,000 回を超える書き込みを監視したところ、PHP コードでループが使用されており、各書き込みに約 1 秒かかっていることがわかりました。
そして、同じ C# が何十回も続きますが、最初の 0.15 秒を除いて、その他はすべて約 0.0001 秒です。
では、これは一度限りの問題ではなく、なぜコードに問題があるのか、それともテスト環境に問題があるのかを尋ねたいと思います。
ループは大規模な http ループです。実際にテストされるのは、Web システム全体の応答速度です。
比較するには、少なくともデータベースにアクセスしない一連のページが必要です。
テストするには、さらにいくつかのマシンに変更します。
データベースの実行をコメントアウトします。最終結果: 実行時間はほぼ 0 です。
これは、PHP のパフォーマンスの問題であることを示していますか? win7のせいでしょうか?
データベースの実行をコメントアウトした後の結果: 実行時間は同じで、ほぼ 0 です。
これは、PHP のパフォーマンスの問題であることを示していますか? win7のせいでしょうか?
ロジックが正しい限り、遅くなるのは正常ですクリア。解釈と編纂の比較方法! !
ロジックが明確であれば、遅くても正常です。解釈と編纂の比較方法! !
PHPは衰退したと言えるでしょうか? 。 。 。 。 。
テストする場合、コントロール グループには同等の条件が必要です
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# と同じで 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 より優れています
これは論理的ではありません。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 つには違いがあります。
道を外れたと思いませんか?
PHP アプリケーションを開発するときは、Windows フレームワークをいじらないでください。オペレーティング システムを Linux または Lamp アーキテクチャに変更してください。 ! !
この種の php パフォーマンスは最高です。
PHP アプリケーションを開発するときは、Windows フレームワークをいじらないでください。オペレーティング システムを Linux または Lamp アーキテクチャに変更してください。 ! !
この種の php パフォーマンスは最高です。
コードの変更をお願いしましたが、テスト用のデータを挿入するだけのコードに変更していただければ幸いです。2 番目については、現時点ではテスト用の環境がありません。おそらく、コンピューターを変更すると、異なる結果が得られるでしょう。その結果、C# には独自のデータベース ドライバーがあるのでしょうか? 最後に、mysqli を使用してテストする必要があります。 ...mysql は削除されました
mysqli を試してみましたが、結果は同じで、変化はありません。