PHP のメモリ制限を増やす方法と静的クラスの使用に関する個人的な意見
もちろん、静的クラスには、いくつかのステートレス ツール クラスの実装に非常に適しているという利点もあります。しかし、ほとんどの場合、システムの早期の固定化を避けるために、より多くのオブジェクトを使用し、静的クラスを使用しないほうがよいという私の主観的な傾向があります。 。ところで、静的クラスがオブジェクトより速いなんて誰も言わないことを祈ります。
PHP プログラムを実行すると、通常、「致命的なエラー: 許容メモリ サイズ xxxxxx バイトが使い果たされました」というエラーが発生します。これは、PHP スクリプトがメモリを大量に使用し、システム設定の最大メモリを超えていることを意味します。許可された。この問題を解決するには、まずプログラムに過剰なメモリが割り当てられているかどうかを確認する必要があります。プログラムに問題がない場合は、次の方法で PHP のメモリ制限 (memory_limit) を増やすことができます。
php のメモリ制限値を確認する
この値を確認するには、view-php-info.php などの空の php ファイルを作成する必要があります。次に、その中にコードを貼り付けます。
このスクリプトを Web サーバーに置き、ブラウザで呼び出します。現時点では、以下に示すように、PHP 環境設定に関する情報を確認できます。その一部は「memory_limit」に関するものです。
注: このメソッドを使用して php その他を表示できます。パラメータ設定、memory_limit だけでなく
memory_limit はどのくらいに設定する必要がありますか?
これはアプリケーションの要件に完全に依存します。たとえば、WordPress ではコア コードを実行するために 32MB が必要です。 Drupal 6 では、この値が少なくとも 16MB である必要があり、32MB に設定することをお勧めします。多数のプラグイン、特に画像処理を必要とするプラグインをインストールする場合は、128MB 以上のメモリが必要になる場合があります。
memory_limit の設定方法
方法 1: php.ini
最も簡単または最も一般的に使用される方法は、php.ini
1 を変更することです。適切な値を見つけてください Web サイト上で有効となる php.ini ファイル PHP パラメータを設定できる場所は複数あるため、正しい設定ファイルを見つけて変更を加えることが最初のステップです。上記の方法で php ファイルを作成し、その構成パラメータを表示すると、「ロードされた構成ファイル」項目が表示されます。例は次のとおりです。
Linux ユーザーの場合、 「php -i | grep Loaded Configuration File」を実行して、対応する設定ファイルを見つけます。 Windows ユーザーの場合は、php インストール ディレクトリ内の php.ini を変更してみてください。
2. php.ini を編集します。php.ini で「memory_limit」項目を見つけます。ない場合は、このパラメータをファイルの最後に追加できます。以下にいくつかの設定例を示します。
memory_limit = 128M; 128M を任意の値に変更できます。
ファイルを保存します。
3. Web サーバーを再起動します。が Web サーバーである場合は、次のコマンドを実行します。
httpd restart
場合によっては、php.ini をプライベートに変更することが許可されない場合があります。たとえば、仮想ホスティング サービスを購入したが、サービス プロバイダーがこのファイルの変更を許可していない場合です。次に、memory_limit の値を増やすための他の方法を検討することをお勧めします。
方法 2: .htaccess
注: このメソッドは、php が Apache モジュールとして実行される場合にのみ有効です。 Web サイトのルート ディレクトリで「.htaccess」ファイルを見つけます。ファイルがない場合は、自分で作成できます。次に、次の設定を追加します
php_valuememory_limit 128M; 128M を任意の値に変更できます
方法 3: 実行時に php のメモリ設定を変更します
次のコマンドラインを PHP コードに追加します。
ini_set('memory_limit','128M');
memory_limit の変更に失敗しました
仮想ホストを使用している場合、memory_limit の値の変更に失敗する可能性がありますメモリ制限。これに対処する方法については、サービス プロバイダーに問い合わせる必要があります。通常、サービス プロバイダーでは設定できる最大値が制限されているか、まったく変更できません。その環境が本当に要件を満たせない場合は、別のホスティングプロバイダーへの変更を検討することをお勧めします。
ヘーゲルには「存在は合理的である」という有名な言葉があります。これを引数として使用すると、静的クラスの使用は合理的でなければなりません。ただし、極端な場合には、コードが静的クラスに依存しすぎると、その劣化を解決する必要があります。これもケシと同じでハーブとして薬効はありますが、不謹慎に大量に使用するとハーブになってしまいます。
静的クラスとは何ですか?
いわゆる静的クラスとは、オブジェクトにインスタンス化する必要がなく、静的な方法で直接呼び出すことができるクラスを指します。コードは次のとおりです。
class Math{ public static function ceil($value) { return ceil($value) } public static function Floor($value) { return Floor($value) }} ?>
このクラスが果たす役割は名前空間に似ています。これが、多くの人が静的クラスを使用することを好む最も直接的な理由かもしれません。
静的クラスの問題
本質的に、静的クラスはプロセス指向です。通常、静的クラスは元のプロセス指向のコードを機械的にまとめただけなので、結果はクラスの形で存在しますが、この時点のクラスは皇帝の新しい服のようなものです。静的クラスは実際にはオブジェクト指向のシェルを身に着けており、プロセス指向のことを実行していると言えます。
オブジェクト指向設計の原則の 1 つ: 実装のためのプログラミングではなく、インターフェイスのためのプログラミング。これにはどのような違いがあるのでしょうか?例: 価格の要因はさておき、個別のグラフィックス カードを搭載したコンピュータと統合グラフィックス カードを搭載したコンピュータのどちらを好みますか?ほとんどの人はディスクリートグラフィックスカードを選択すると思います。独立したグラフィックス カードはインターフェイス プログラミングをターゲットとみなすことができ、統合グラフィックス カードは実装プログラミングをターゲットとみなすことができます。実装固有のプログラミングの欠点は明らかです。変更の可能性が失われるということです。
以下に記事管理システムの例を示します。
class Article{ public function save() { ArticleDAO::save() }}?Article 必要なドメイン ロジックを実装し、データの永続化を ArticleDAO に任せます。 ArticleDAO は静的クラスであり、マザーボードに組み込まれた統合グラフィックス カードと同じくらい変更が困難です。ただし、呼び出し時に静的クラスの名前が使用されるため、実際には、それを実現するメソッドがいくつかあります。 🎜> class Article{ private static $ dao = 'ArticleDAO'; public static function setDao($dao) { self::$dao = $dao; } public static function save() { $dao = self::$dao; dao::save(); } }?>
変数を使用すると、実行時に使用する静的クラスを設定できます:
Article::setDao('MockArticleDAO');www errenzhuan.cc;Article:: save();?>
この実装は Mock の問題を解決しているように見えますが、まず、元のコードを変更し、開始と終了の原則に違反します。変数、および静的変数は共有状態であるため、他のコードの実行を妨げる可能性があるため、これは完璧な解決策ではありません。
追加の説明では、動的言語の特性を利用して、実際には別のクラス定義ファイルを必要とするだけで Mock を実装できますが、これには欠点もあります。実装は何度も変更されていますが、実際には要求する機会は 1 回だけです。そうしないと、重複定義エラーが発生します。
注: 場合によっては、静的遅延バインディングを使用すると、静的クラスのテスト容易性も向上します。PHPUnit を参照してください。
オブジェクトの値
静的クラスを放棄して代わりにオブジェクトを使用する場合、記事管理システムの例をどのように実装すればよいでしょうか?コードは次のとおりです。
class Article{ private $dao; public function __construct($dao = null) { if ($dao === null) { $dao = new ArticleDAO() } -> setDao($dao); } パブリック関数 setDao($dao) { $this->dao = $dao; } パブリック関数 save() { $this->dao->save(); ?>
実際、ここではよく呼ばれる依存関係注入テクノロジが使用されており、コンストラクターまたはセッターを通じて依存オブジェクトを注入します。
$article = new Article(new MockArticleDAO());$article- > save();?>
オブジェクトには独自の状態があり、共有された状態は他のコードの実行を妨げません。