PHPは、メモリリーク、バッファオーバーフロー、スタックオーバーフロー、およびそのような種類の他のエラーをどのように引き起こす可能性がありますか?PHPはそのようなエラーを引き起こす可能性さえありますか?
3 に答える
ある種の無限再帰を引き起こすことにより、PHPのクラッシュを引き起こす可能性があります。
たとえば、再帰的にそれ自体を必要とするファイルは、スタックオーバーフローを引き起こすはずです。
require __FILE__;
__sleep()
または、オブジェクトのシリアル化を解除することになっているが、serialize()
代わりに呼び出すマジックメソッドの再帰:
class sleepCrasher
{
public function __sleep()
{
serialize($this);
}
}
serialize(new sleepCrasher());
または、新しいインスタンスを作成 するクラスデストラクタ:
class destructorCrasher
{
public function __destruct()
{
new destructorCrasher();
}
}
// Calling __destruct() manually is just for the sake of example,
// In real scenarios, PHP's garbage collector will crash PHP for you.
(new destructorCrasher())->__destruct();
再帰的だけでなく__toString()
:
class toStringCrasher
{
public function __tostring()
{
return strval($this);
}
}
strval(new toStringCrasher());
PHPが保護されている他の再帰シナリオがあります。たとえば、終了条件なしで再帰関数を呼び出したり、再帰的な自己生成ジェネレーターを呼び出したりします。これらはクラッシュを引き起こしませんが、Allowed memory size of ...
致命的なエラーを引き起こします。
その他の例については、次を参照してください。
任意の言語でオーバーフローを引き起こす可能性のある処理(現在の関数を再帰的に呼び出す、無意識にメモリを消費するなど)を実行するか、古き良きPHPインタープリターにその仕事を任せることができます。PHP5で修正されたメモリリークの数を見てください(私のお気に入り:5.2.6でバグ#44069.
を修正しました:'代わりに連結を使用した大量のメモリ使用量.=
')。
全体として、単一のhttpリクエストを処理したいだけであれば、 PHPは(せいぜい)大丈夫です。しかし、それを使って実際に洗練された作業を行うことはできません(Peer2Peerクライアントを実装しようとしたことがありますが、サーバーはわずか10分後にメモリ不足で停止しました-もちろん私に代わってバグになる可能性がありますが、リークを見つけるのに数日を費やしました私自身のコード-役に立たない)。
PHPはインタプリタ言語であるため、すべてのphpスクリプトは、メモリリーク、バッファオーバーフロー、スタックオーバーフローから保護されています。
どのようにあなたはそのような問題に遭遇するでしょう:
整数のオーバーフロー。大きすぎる数値を割り当てるとオーバーフローし、例外は発生しません。
php.iniで構成されているメモリサイズよりも多くのメモリを使用しているため、メモリが不足しています