-2

その場で配列をフォーマットするための PHP コードを作成する必要がある場合があります。これを行う 1 つの方法は、 を使用することevalです。しかし、生成されたコードを PHP ファイルに書き込んでインクルードすることを考えています。これには多くの利点がevalあります。そのうちの 1 つは、生成されたコードのキャッシュです。しかし、私は他のコードでそのような慣習を見たことがありません。これでセキュリティやその他の問題があるかどうかわかりませんか?

これは例です:

<?php

$code = '<? foreach($rows as $row) {$row["insertion"] = format($row["insertion"]);} ?>'
file_put_contents('formatter.php', $code);
include('formatter.php');

?>

その場でPHPファイルを作成してそれを含めるのは良いことですか?

それともeval()、履歴を保存せずにコードを直接実行する方がよいでしょうか?

4

2 に答える 2

5

生成されたコードを 1 回だけ使用する場合は、eval を使用することをお勧めします。

しかし、私はここでの慣習に疑問を呈します。あなたのコード例は、このパターンの必要性を十分に正当化するにはあまりにも単純すぎるか、基本的な手続き型コードとクロージャなどを過度に複雑にしています。

一般的なガイドライン:

  • *を生成してから実稼働環境で動的コードを呼び出している場合、問題へのアプローチが間違っている可能性があります
  • evalすべての状況の 99.999% で悪い習慣と見なされます。
  • 二度と呼び出されない生成コードはevaledにする必要があります
  • 将来呼び出される (または呼び出される可能性が非常に高い) 生成コードは、ファイルまたはデータベースにキャッシュする必要があります。
于 2012-08-08T18:59:30.263 に答える
0

コードを動的に作成する必要がある場合は、出力をファイルにダンプしてから含める方が常に効率的で、通常はより安全です。次に、これをコードの断片ごとに 1 回実行するだけでよく、(APC などを介した) オペコードのキャッシュと、Zend Core エンジンによるより効率的な前処理が可能になります。もう 1 つの利点は、含まれているファイルをデバッグできることですが、eval()ed ステートメントのデバッグはほとんどサポートされていません。

ファイルに保存する方が安全である理由は、何が実行されたかの記録があるからです。ではeval()、多かれ少なかれブラックボックスであり、何が実行されているのかわかりません。さらに、writes フォルダーを、特定のアプリだけが書き込める場所にロックできるはずです。動的配列の作成ロジックをメイン アプリから分離し、メイン アプリ自体を介してファイルを含めると、一時ファイルを Apache に対して読み取り専用にし、Apache によってのみ書き込み可能にすると、セキュリティとパフォーマンスが確実に向上します。 PHP アプリ (cron などの方法で実行可能)。

あなたがしていること (memcache や APC フェッチ/ストアなど) にはおそらくより良い解決策がありますが、私は同様の状況に遭遇しました。驚くほど)。

于 2012-08-08T18:34:25.037 に答える