8

Google Developers PHPのパフォーマンスのヒントを読んで、変数の余分なコピーを作成することは推奨されないことがわかりました。

これの代わりに:

$description = strip_tags($_POST['description']);
echo $description;

これをお勧めします:

echo strip_tags($_POST['description']);

その理由は、メモリの不要な消費の可能性です。

しかし、いくつかの検索を行うと、PHPが「コピーオンライト」メモリ管理を実装しているという反論がいくつか見られました。これは基本的に、実際にコピーされるデータを気にすることなく、必要な数の変数に値を割り当てることができることを意味します。

$_POSTしたがって、たとえば$_GETコードの多くの場所で変数が使用される、より複雑な状況で、次の基準を考慮して、追加の変数を使用するかどうかを選択する方がよいかどうかを知りたいと思います。

1)セキュリティ

2)メンテナンス/読みやすさ

3)パフォーマンス

編集1

以下の例を使用して、質問をよりよく説明します。

この種類のコードの方が良いですか(上記の基準を考慮して):

$user = anti_injection($_POST['user']);
$pass = anti_injection($_POST['pass']);

// Continue the code using $user and $pass

それともこれ?

$_POST['user'] = anti_injection($_POST['user']);
$_POST['pass'] = anti_injection($_POST['pass']);

// Continue the code using $_POST['user'] and $_POST['pass']
4

2 に答える 2

4

$ descriptionの「コピー」が必要ない場合、より明確なアプローチは間違いなく次のとおりです。

echo strip_tags($_POST['description']);

パフォーマンスに関しては、あなたが言ったように、PHPはメモリ内に結果の値を作成し、それをZ_Data構造体に割り当てるため、メモリを消費します。したがって、最初または2番目の方法を使用する方が速くもメモリ消費も少なくなりません。

最後に、セキュリティはメモリ消費とは関係ありませんが、出力を正しくクリーンアップする方法を覚えておく必要があります。ストリップタグの使用は問題ありません。スラッシュを追加することは、ハッカーがXSSインジェクションを使用するのを防ぐもう1つの良い方法です。

また、コピーオンライトに関して、これを行う場合は次の点にも注意してください。

$description = 'Hello-world';
$trimmed_description = str_replace('-', ' ', $description);
$escaped = htmlentities($trimmed_description);
echo $escaped;

それ以外の

echo htmlentities(str_replace('-', ' ', 'Hello-world'));

後者は明らかにあなたのメモリを節約します...この場合はほとんどありませんが、それでもいくつかを節約します...

于 2012-07-10T15:48:36.077 に答える
4

PHPの「レイジーコピー」はアレイにのみ適用されます。配列のデータは、配列の1つのコピーが変更された場合にのみ複製さforeachれます。そのため、たとえば、元の配列のコピーでループが機能しても問題ありません。

オブジェクトは、で指定されていない場合でも、参照によって渡されます&。例:

$a = new StdClass();
$b = $a;
$b->derp = "foo";
var_dump($a->derp); // "foo"

リソースは、特定の拡張機能によって使用されるリソースへの参照であるため、意味のあるコピーはできません。

他のすべては直接コピーされます。


とにかく、不要な変数は避ける必要があります。たとえば、次の代わりに:

$step1 = 123;
$step2 = $step1 * 4;
$step3 = $step2 + 99;
$step4 = $step3 / 3;
echo $step4;

あなたはただ書くことができます:

echo (123*4+99)/3;

(または、この場合は、echo 197;

重要なのは、不要な変数は混乱を招き、他の場所で定義した変数と競合する可能性があるということです。

于 2012-07-10T15:51:03.213 に答える