14

コードが同じである場合、次の間に違いがあるように見えます。

include 'external.php';

eval('?>' . file_get_contents('external.php') . '<?php');

違いはなんですか?誰か知っていますか?


include正常に動作し、エラーが発生するため、2つが異なることはわかってevalいます。私が最初に質問したとき、それがすべてのコードでエラーを引き起こしたのか、それとも私のものだけでevalエラーを引き起こしたのかわかりませんでした(そしてコードが編集されたため、エラーの意味を見つけるのは非常に困難でした)。ただし、答えを調べた結果、エラーが発生するかどうかは、のコードに依存するのではなくexternal.php、php設定に依存することがわかりました(short_open_tag正確には)。

4

8 に答える 8

14

さらに調査した結果、何が間違っていたのかがわかりました。問題は、それが「短い開始タグ」であるため、(php.ini または同じ効果を持つ何かで) が 1 に設定されて<?phpいる場合にのみ機能することです。short_open_tag正しい完全なタグは<?phpで、2 番目の p の後にスペースがあります。

そのため、インクルードの適切な同等物は次のとおりです。

eval('?>' . file_get_contents('external.php') . '<?php ');

または、開始タグをすべて一緒に残すこともできます (以下のコメントに記載されているように)。

eval('?>' . file_get_contents('external.php'));

私の最初の解決策は、セミコロンを追加することでした。これも機能しますが、私に尋ねると、あまりきれいに見えません。

eval('?>' . file_get_contents('external.php') . '<?php;');
于 2009-07-26T14:06:51.373 に答える
6

私の知る限り、eval() を使用する場合、php アクセラレータを利用することはできません。

于 2009-07-26T13:54:08.423 に答える
6

APCのようなオペコード キャッシュをインストールした Web サーバーを使用している場合はeval、「最善の解決策」にはなりません。私の記憶が正しければ、評価されたコードはオペコード キャッシュに格納されません(別の回答でも同じことが言われました)。こと、ところで)

少なくともコードが頻繁に変更されない場合に使用できる解決策は、データベースに保存されているコードと含まれているコードを組み合わせて取得することです。

  • 必要に応じて、DB からコードを取得し、ディスク上のファイルに保存します
  • そのファイルを含める
  • コードはディスク上のファイルにあるため、オペコード キャッシュはそれをキャッシュできます。これにより、パフォーマンスが向上します。
  • コードを実行する必要があるたびに DB にリクエストを行う必要はありません。

私はこのソリューションを使用するソフトウェアを使用してきました (ディスク上のファイルは DB に格納されたコードのキャッシュに過ぎません)。とりあえず...

結果として、あまり良くないことがいくつかあります。

  • 「必要に応じて」DBからコードを取得してファイルに入れる必要があります
    • これは、一時ファイルを 1 時間ごとに再生成するか、DB のエントリが変更されたときに削除することを意味しますか? これがいつ発生するかを特定する方法はありますか?
  • また、コードを変更して一時ファイルを使用するか、必要に応じて再生成する必要があります
    • 変更する場所がいくつかある場合、これはいくつかの作業を意味する可能性があります

ところで:「評価は悪です」のようなことをあえて言いますか?

于 2009-07-26T14:24:44.700 に答える
1

これにより、PHP でインクルードのファイル ラッパーがオンになっていると仮定して、ファイルをインクルードできます。

function stringToTempFileName($str)
{
    if (version_compare(PHP_VERSION, '5.1.0', '>=') && strlen($str < (1024 * 512))) {
        $file = 'data://text/plain;base64,' . base64_encode($str);
    } else {
        $file = Utils::tempFileName();
        file_put_contents($file, $str);
    }
    return $file;
}

... 次に、その「ファイル」を含めます。はい、これは opcode キャッシュも無効にしますが、動作に関しては、この「評価」をインクルードと同じにします。

于 2010-04-13T20:59:21.807 に答える