web-dev-qa-db-ja.com

いいえPHP大規模プロジェクトの場合?なぜですか?

私は、PHPを大規模なプロジェクトに使用しないでください)と人々が述べた(提案されていない、議論されていない、提供されていない)いくつかの投稿を読みました。

主にPHP開発者である私は、2つの質問をします:

  1. 「大規模プロジェクト」の定義とは?
  2. 何故なの? PHPを使用する際の落とし穴

私は小さな開発チームを運営しており、経験から、品質の構築、編成、文書化、コメント、カプセル化が私たちの最優先事項であることを知っています。独自のフレームワークとアプローチを使用して素晴らしいプロジェクトを開発することができますが、それでも、時間を浪費している場合は、これ以上投資したくありません。

考え?

64
jerebear

PHPは、プレゼンテーションとロジックを組み合わせたコードを記述できるため、またはSQLインジェクションを許可するため、恐ろしい言語です。それは言語とは何の関係もありません、それは開発者です

PHPは非常にスケーラブルであることを証明しています。ウィキペディアはインターネット上で最大かつ最も人気のあるサイトの1つであり、PHPを実行しています。十分に言った?

フレームワークを提供するツール/ライブラリはたくさんあり、誰かが貧弱で保守性の低いコードを書く可能性が低くなります。CakePHP、Symfony、PDO、Smartyなどを参照してください。

参入障壁が非常に低い言語であるため、不適切なラップを受けています。無料で、非常に安価に入手できますPHP hosting、ドキュメントは最高です、オンラインのチュートリアルがたくさんあり、それに加えて多くのことが非常に簡単になります(例:URLを開いてファイルのコンテンツを取得する: file('http://www.google.com');)。これは、多くの初心者がそれを手に入れ、非常に危険なサイトをたくさん作成したことを意味しますが、それは最初に選択した言語で発生します。

確かなORMフレームワークを使用して(SOについては約30の質問があります)、それがあなたを良い扱いにします。

94
nickf

使用しないと言う人の多くは、実際には使用しないと言っていますPHP 4.これは

適切なコードを任意の言語で記述できます

そして

あなたはどんな言語でも悪いコードを書くことができます

多くの場合、PHPはスパゲッティコードライブラリのもつれになり、「アプリケーション」を単なる一連のスクリプトにすることができます(この良い例については、Moodleを参照してください...)。

多くの「使用しないPHP for large stuff」はPHPからハッキングされているのは、その本来の目的であるテンプレート言語です。私には理解できますが、それができることを証明するプロジェクトはたくさんあります(Drupal、mediawiki、Facebook)。

31
jskulski

PHPを大規模プロジェクトに使用できない理由はありません。結局のところ、FacebookはPHPをベースに構築されています。ただし、問題はありますが、大規模プロジェクトには問題があります。

PHPが普及している理由は、エントリへの障壁が低く、安価なホスティングです。Apache拡張機能として実行され、コーディングを開始するだけで十分です。Netなどのより多くのエンタープライズプラットフォームに行く場合またはJavaの場合、エントリに対する障壁がはるかに高くなりますが、アプリケーションを拡張できるようにするためのインフラストラクチャも多数付属しています。

たとえば、PHPのデータベース抽象化は(imho)は悲惨です。ベンダー固有です。MySQLでは、人々は次のようなことをする傾向があります。

_function get_users($surname) {
  mysql_query("select * from users where surname = '$surname'");
  ...
}
_

これはいくつかの理由で悪いです:

  • クエリキャッシュの利用が不十分です。
  • 文字のエスケープは処理しません(もちろん、これはmysql_escape_string()で実行できますが、人々がこれを行わない頻度に驚かれます)。そして
  • SQLインジェクション攻撃を許可するような方法でコーディングするのはかなり簡単です。

個人的に私は上記のすべての理由でmysqliを好みますが、それ自体に問題があります。つまり、LONGTEXTフィールドを使用するとmysqlがクラッシュし、少なくとも2005年以降は修正されていません(はい、私と他のいくつかのバグが発生しています)。

これをJava(よく知っている))と比較してください。JPAまたはIbatisは、起動コストが高く、非常に優れたORMソリューションですが、企業規模での支援になります。

したがって、PHPで大規模なプロジェクトを実行することを禁止されていません。他のプラットフォームが提供するものを複製するために、ますます多くの作業を自分で行わなければならないという点で、それは単により困難です。

つまり、PHP + memcached/APC + beanstalkdは長い道のりです。

PHPは実際にはバックグラウンド処理またはスレッド化をサポートしていません。そのために何か他のもの(またはスタンドアロンスクリプト)が必要です。他のものを使用している場合は、なぜそれを使用しないのですか? Webのもの(Java、Ruby、.Netなど)の場合も。

18
cletus

リンクした質問 が削除されたので、ここにその一部を配置します。

質問


私は別の質問スレッドでPHPひどい言語を呼び出して、それを狂ったように投票しました。どうやらここにはPHPを愛する人がたくさんいるようです。

だから私は本当に興味があります。何が欠けていますか? PHPが良い言語になる理由は何ですか?

これが嫌いな理由は次のとおりです。

  • PHPには、組み込み関数とライブラリ関数の命名に一貫性がありません。予測可能な命名パターンは、どのデザインでも重要です。

  • PHPには、組み込み関数のパラメーターの順序に一貫性がありません。たとえば、単純なケースでは迷惑であり、あらゆる種類の予期しない動作またはそれ以上の事態を引き起こすarray_mapとarray_filterがあります。

  • PHP開発者は、組み込み関数と下位レベルの機能を常に非推奨にしています。良い例は、関数の参照渡しを非推奨にした場合です。これにより、関数を実行する人にとって悪夢が生まれましたコールバック。

  • 再設計における考慮の欠如。上記の廃止により、多くの場合、関数にデフォルトのキーワード値を提供する機能がなくなりました。彼らはこれをPHP 5で修正しましたが、PHP 4!

  • ネームスペースの実行不良(以前はネームスペースがまったくなかった)。名前空間が存在するようになったので、逆参照文字として何を使用しますか?バックスラッシュ! PHPでも、エスケープに普遍的に使用される文字!

  • 過度に広範な暗黙の型変換はバグの原因となります。たとえば、floatからintegerへの暗黙的な変換、または再度の変換については問題ありません。しかし、PHP(最後にチェックした))は喜んで魔法のように配列を整数に変換しようとします。

  • 不十分な再帰パフォーマンス。再帰は、あらゆる言語で書くための根本的に重要なツールです。複雑なアルゴリズムをはるかに簡単にすることができます。不十分なサポートは許されません。

  • 関数は大文字と小文字を区別しません。彼らがこれについて何を考えていたのか私にはわかりません。プログラミング言語は、コンピューターとコードのリーダーの両方に動作を明確に指定する方法です。大文字と小文字を区別しないと、あいまいさが多くなります。

  • PHPは、処理とプレゼンテーションの結合を推奨します(実際には必須です)。はい、できますPHPそれはそうしませんが、実際には(サウンドデザインの観点から)間違った方法でコードを書く方が簡単です。

  • PHPのパフォーマンスはキャッシングなしではひどいです。 PHP用の商用キャッシュ製品を販売している人はいますか?ああ、見て、PHPのデザイナーはそうします。

最悪の場合、PHPは、Webアプリケーションの設計が簡単であることを人々に納得させます。そして、実際には、多くの労力が大幅に軽減されます。しかし、実際には、安全かつ効率的な作業は非常に困難です。

PHPはプログラマーのサブグループ全体に悪い習慣と悪いデザインを教えてきました。安全に使用するための理解が不足している機能へのアクセスが与えられています。これにより、安全ではないというPHPの評判に。

(ただし、PHPは他のどのWebプログラミング言語よりも安全ではありません。)

PHPについて何が欠けているのですか?貧しいプログラマーを生み出している、有機的に成長し、管理が不十分な言語の混乱を目にしています。

そうでなければ私を納得させてください!


評価の高い回答


私はあなたの各弾丸ポイントに対応することを試みます

PHPには、組み込み関数とライブラリ関数の命名に一貫性がありません。予測可能な命名パターンは、どのデザインでも重要です。

私はこのトピックが好きでも嫌いでもあります。その中心にあるので、この問題は正しいです。一部のバイワード関数がアンダースコアで分割されているのに、分割されていないのはなぜですか?なぜ、needleおよびhaystackパラメータが引数シグネチャの位置を交換するのですか?バカバカしい。しかし、結局のところ、これは本当に重要なのでしょうか?私のIDE intellisenseとphp.netをブラウザでクリックするだけで、これはそれほど大きな問題ではありません。PHP言語?はい、それは私の効果的なプログラマーになる能力を妨げますか?いいえ。

PHP開発者は、組み込み関数と下位レベルの機能を常に非推奨にしています。良い例は、関数の参照渡しを非推奨にした場合です。これにより、関数を実行する人にとって悪夢が生まれましたコールバック。

個人的には、これは良い点ではないと思います。言語の進化、特にPHPのようにクルフトを持っているもの)の廃止には非推奨が必要です。PHPは、 "悪いプログラマーになる」*が、同時にPHPグループも、呼び出し時の参照渡しなどの愚かな構文を言語から削除しようとすると問題が発生します。 。呼び出し時の参照渡しをなくすことは、彼らがこれまで行った中で最高の動きの1つでした。初心者の開発者がこの「機能」を使用するよりも簡単に自分の足で撃つ方法はありませんでした。

再設計における考慮の欠如。上記の廃止により、多くの場合、関数にデフォルトのキーワード値を提供する機能がなくなりました。彼らはこれをPHP 5で修正しましたが、PHP 4!

全体的に配慮が足りないとは思いませんが、この変化に悩まされて、酸っぱい味わいが残っていると思います。言語の変更は、多くの場合、数年前ではなくても数ヶ月前に知られています。 4から5に移動するための移行ガイドが提供され、バージョンの違いはマニュアルに記載されています。呼び出し時の参照渡しは恐ろしい「機能」であり、開発者が他の方法では得ることができない表現力を与えません。私はそれがなくなってうれしいです(魔法の引用のような他のがらくたとともに)

ネームスペースの実行不良(以前はネームスペースがまったくなかった)。名前空間が存在するようになったので、逆参照文字として何を使用しますか?バックスラッシュ! PHPでも、エスケープに普遍的に使用される文字!

私はこれについて複雑な感情を持っています。私の一部は「気にかけて、文字エスケープはとにかく文字列の外では意味がない」と思っており、私の一部は「きっと彼らはより良いものを使うことができる」と思っています。しかし、できますか?わかりません。私はZendパーサーの開発者ではありません。 5.3 PHP=まで名前空間がまったくなかったというのは大きな見落としですか?)はい、絶対に。

過度に広範な暗黙の型変換はバグの原因となります。たとえば、floatからintegerへの暗黙的な変換、または再度の変換については問題ありません。しかし、PHP(最後に確認した))は、配列を整数に魔法のように変換しようとします。

PHPがこれを行う方法に同意しないことは問題ないと思いますが、それが言語を「悪い」ものにすることには同意しません。しかし、このトピックにどれだけ座りたいか、弱いか強いかについて議論してください入力します(PSはしません、まったく)レコードの場合:PHPはE_WARNINGレベルのエラーを発行します引数の型が重要であり、強制によって解決できない場合。

不十分な再帰パフォーマンス。再帰は、あらゆる言語で書くための根本的に重要なツールです。複雑なアルゴリズムをはるかに簡単にすることができます。不十分なサポートは許されません。

PHPはWeb用のDSLです。私はそれを8年間フルタイムで行っており、再帰を4または5回使用した可能性があります。通常、ある種の迷惑なディレクトリまたはXMLトラバーサルに使用します。それは、ウェブ開発に頻繁に必要とされるパターンではありません。パフォーマンスの低下については言い訳はしませんが、これは本番の問題というよりも、学術的な問題です。本当に強力な再帰的なパフォーマンスが必要な場合、PHPはすでに間違った言語です。

関数は大文字と小文字を区別しません。彼らがこれについて何を考えていたのか私にはわかりません。プログラミング言語は、コンピューターとコードのリーダーの両方に動作を明確に指定する方法です。大文字と小文字を区別しないと、あいまいさが多くなります。

私は完全にこれに同意します。

PHPは、処理とプレゼンテーションの結合を推奨します(実際には必須です)。はい、できますPHPこれはそうしませんが、実際には(サウンドデザインの観点から)間違った方法でコードを書く方が簡単です。

*うーん、このトピックは必死に精通しています...

しかし真剣に、私は人々が絶対に100%あなたが望むどんな出力システムでも実装できる言語について不平を言うだろうことを発見します(PHPのテンプレートのシステムだけがこれに話します) )-OR-オーバーヘッドをすべてスキップして直接出力します。これはPHP悪いことにはなりません。PHP良いです。

PHPのパフォーマンスはキャッシングなしではひどいです。 PHP用の商用キャッシュ製品を販売している人はいますか?ああ、見て、PHPのデザイナーはそうします。

バイトコードキャッシング(アクセラレータのような)または出力キャッシングを意味しますか?

前者の場合、私はこのトピックについてどれだけ気にかけているのか本当にわかりません。アクセラレータは無料で簡単に実行できます。なぜそれが言語の一部ではないのかについて議論することはできますが、結局はそれほど重要ではないと思います。

あなたが出力キャッシュについて話しているなら、私はあなたに何を言うべきかわかりません。トラフィックの多いWebプロジェクトでは、キャッシュが必要です(シードポッドキャスト#27など)。これはPHP固有の問題ではありませんまったく

要約すると、PHPは非常に学術的な方法で「悪い」言語だと考えています。そして、あなたの以前の投稿では、PHP "物事を成し遂げる"。


2番目に高い評価の回答


あなたのすべての批判(およびいくつか)は有効です。あなたはPHPを憎むことが許され、さらには期待されています。

しかし、再び、それはいくつかの利点があります:

  • ユビキタス
  • 高速(特にopcodeキャッシュを使用)
  • 巨大なコミュニティ(そして素晴らしいドキュメント)
  • 作品

最後に、他の言語で作成する優れたコードを作成することで、多くの欠点ではなくても多くの欠点を克服できます。多くの場合、多くの代替手段よりも速く実行され、ホストやスケーリングが容易になる、PHPで堅固で安全で香りのよいコードを記述できます。


3番目に評価された回答


PHPについて何が欠けているのですか?貧しいプログラマーを生み出している、有機的に成長し、管理が不十分な言語の混乱を目にしています。

シンプル。貧しいプログラマーが自分の言語について非常に防御的になるという事実。 ;)PHPは簡単に習得でき、他の方法よりもはるかに簡単です。一度習得すると、1)PHPの何が問題になっているのか、2)代案の方が優れていること、 3)代替方法の1つに切り替えて学習する方法。

そして、たぶん、人々はどのような選択肢を持っているのでしょうか? ASP? Webサーバー(Apache)の大部分で実行できないことから、それ自体でとんでもない、過度に設計された設計の選択まで、それ自体には多くの問題があります(webforms?Viewstate?AJAX where your非同期」リクエストがインターセプトされて実行されます順次?)Ruby Railsで?たぶん、サポートするWebサーバーの数を除いて)繰り返しますか?現時点では簡単に近づくことはできません。遅いので、おそらくPHPの「強さ」はgoodの代替が存在しないことです。少なくともこれが、私が可能な限りすべてのWebプログラミングから離れている理由ですPHP最悪で、他の選択肢にもあまり熱心ではありません。

PHPには根本的な問題が数多くあるため、面白くもありません。ユニコードのサポートの欠如から、予期しないセキュリティホールにつながることが多い多くの暗黙的な型変換、表示などの完全な混合、その他すべて、または(最後にチェックした)使用しないデフォルトのデータベースモジュールまでパラメータ化されたクエリ。ここでは、データベースへのアクセスとHTMLの生成という2つの目的のために作成された言語について話しますが、どちらもひどい言語です。

それは厄介な混乱であり、言語を設計する資格がない、または能力のない人々によって設計された言語です。 ;)


17
Vinko Vrsalovic

私にとって最悪のPHP=罪はプレゼンテーションとビジネスロジックのカップリングです。それはあなたがより良い方法でそれを書くことができないということではありませんが、あなたがそうすることを奨励していません。しないことをお勧めします。

PHP=サイトにも多数のセキュリティの脆弱性が関連しています。多くのサイトがPHPで記述されているため)不均衡であることを証明することはできませんが、そうだと思います。私がそうだとすれば、セキュリティの脆弱性は一種のバグなので、PHPサイトは全体的にバグが多い傾向があると思います。

(私は、いくつかの大きなサイトを指して、どうにかしてPHPでこれを行うことができたと言っているとは思わない。ちなみに、これはタバコに対するものではない。 t隣の隣人が喫煙して100歳になったため、がんを引き起こします。

4
frankodwyer

この同様の質問をチェックしてください- Can PHP Javaだけでなくエンタープライズレベルのサイトも処理できます

要約-Facebook、Wikipedia、Yahoo.com、Digg、Flickr、および他の多くの巨大なサイトがPHPで実行されています。その優れたものを作ることに近づいたとしても、PHPでそこに到達できるので安心できます。

アプリケーションの保守性、拡張性、信頼性、安全性、パフォーマンスは、完全にあなた次第であり、言語に依存しません。 PHPを支持しますが、Webアプリケーションを構築するための非常に便利なツールがあります。

2
Eran Galperin

私にとって、そして大規模なプロジェクト、あるいは巨大なプロジェクトについてさえ話すと、それは(主に)1つのWordに要約されます:Dependencies

スクリプト言語の問題は、世界中のあらゆるものに似ています。最大の利点は同時に最大の欠点です。

最大の利点は、無料で高速にコードを作成できることです。スクリプトを書くだけで、目的を達成できます。冗長性は必要ありません。コードを書くだけです。

最大の欠点は、ある意味で、このスクリプトが他のスクリプトを妨害していないかどうかを確認することです。またはそれ以上:他が依存している古いスクリプトを変更します。すべての依存関係が希望どおりに機能することを確信していますか?

ここでの通常の意味が何であれ、これは「通常の」Webページ生成には当てはまりません。しかし、約50万行のソースコードに依存する製品があり、クライアント用のカスタマイズも追加の10万行のコードで構成されています。そして、コンパイラーがすべての依存関係をチェックし、何か間違った場合(ここで最低レベルを話す、変数またはメソッド呼び出しのタイプミスなど)に警告/エラーを出してくれることは、とても嬉しいことです。

これと、他の言語がその性質上、より使いやすい「エンタープライズ」機能を提供しているという事実(つまり、「銀行用途」のアプリケーションサーバー)は、多くの人が見ない理由を明らかにしていますPHP =大規模な(またはそれ以上:巨大な)プロジェクト。

2
Georgi

PHP言語の構成については、私には十分ではありません。たとえば、関数の名前です。いくつかの方法で関数に名前を付けるのは、 1つの言語です。アンダースコア(function_name)、単語がくっついている(functionname)などの混合です。つまり、これは実際には混乱しています。非常に似ている、または同じことを行う関数が多すぎますが、その名前は非常に混乱しています。これは優れたプログラミング言語の特徴ではありません。

大規模な展開では、言語は書くのに十分簡単で特定のものでなければなりません。 PHP変数型の宣言のように省略されているものは、理解して後で処理するのが非常に難しくなります。

他のポイントは、機能の継続的な追加と他のいくつかのキャンセルです。 OOP in PHP 5を追加することで、プログラマーが簡単にできるようになると想定していますが、後方互換性の考慮事項はどうでしょうか?

このプログラミング言語がそうである主な理由は、その起源であるパー​​ソナルホームページにあります。大規模な展開向けに設計されていません。

この言語をエンタープライズ向けの言語にするための多大な努力があることは知っています。個人的には、十分に優れたオープンソースのサーバー側プログラミング言語を待っています。しかし、この日が来るまで、橋の下には大量の水が流れます。

1
nidorano

これらはすべて良い答えです。

私は初心者でした。私は5年間しかコーディングしていませんが、小規模から大規模までの85のWebサイトを直接サポートおよび管理しています。その理由を説明します。Webサイトを1日停止することで訴えられる可能性は、学習意欲に大きく貢献します。より良いコードの作り方と作り方。

確立された開発者がこの問題について彼らの考えを共有するのを聞いてうれしいです。 PHPが最高だとは思いませんが、私の「ベストプラクティス」への投資は十分に役立っているようです。

みんな、ありがとう!

0
jerebear
0
J. Taylor

当社はPHPを使用していくつかの大規模なWebサイトを運営しており、言語に関連する問題はありませんでした。

0
JW.