1

次の質問があります。php スクリプトを 1 回だけ実行するにはどうすればよいですか? これは確かに類似の質問または重複した質問であると人々が返信し始める前に、読み続けてください...

状況は次のとおりです。現在、独自の MVC フレームワークを作成しており、フレームワークに新しい機能を簡単に追加できるモジュール ベースのシステムを考え出しました。そのために/ROOT/modules、新しいモジュールを追加できるディレクトリを作成しました。

ご想像のとおり、スクリプトはディレクトリを読み取り、すべての php ファイルを読み取り、それらを解析してから、新しい機能を実行できるようにする必要がありますが、すべての Web ブラウザーの要求に対してこれを行う必要があります。これにより、O(nAmountOfRequests * nAmountOfModules) に関するこのタスクが作成されます。これは、毎秒大量のユーザー リクエストがある Web サイトではかなり大きくなります。

次に、次のようなセッション変数を導入するとどうなるかを考え、$_SESSION['modulesLoaded']それが設定されているかどうかを確認するだけです。これにより、負荷が O(nUniqueAmountOfRequests * nAmountOfModules) に削減されますが、ディレクトリを 1 回読み取るだけの場合、これは依然として大きな大きな O です。

私が今持っているものは次のとおりです。

/** Load the modules */
require_once(ROOT . DIRECTORY_SEPARATOR . 'modules' . DIRECTORY_SEPARATOR . 'module_bootloader.php');

次のコードのどれが存在します:

<?php
//TODO: Make sure that the foreach only executes once for all the requests instead of every request.
if (!array_key_exists('modulesLoaded', $_SESSION)) {
    foreach (glob('*.php') as $module) {
        require_once($module);
    }
    $_SESSION['modulesLoaded'] = '1';
}

そこで質問なのですが、スーパーグローバル変数のように、アクセスでき、すべてのリクエストに対して存在する解決策はありますか?以前の Big O の代わりに、nAmountOfModules のみが存在する Big O を作成できますか? または、モジュールファイルを一度だけ簡単に読み取る別の方法はありますか?

何かのようなもの:

if(isFirstRequest){
    foreach (glob('*.php') as $module) {
        require_once($module);
    }
}
4

3 に答える 3

1

最も基本的な形式で、一度だけ (ユーザーごとではなく、インストールごとに) 実行したい場合は、集中的なスクリプトでサーバーの状態を変更します (ファイルの追加、ファイルの変更、レコードの変更)。データベース)、それを実行する要求が発行されるたびにそれに対してチェックします。

一致が見つかった場合は、スクリプトが既に実行されていることを意味し、再度実行することなくプロセスを続行できます。

于 2012-10-24T11:57:53.163 に答える
0

呼び出されたときにファイルをロックし、スクリプトの最後でファイルを削除します。一度だけ呼び出されます。そして、もはや必要がなくなったので、涅槃に消えました。

これは当然、逆方向にも機能します。

<?php

$checkfile = __DIR__ . '/.checkfile';

clearstatcache(false, $checkfile);

if (is_file($checkfile)) {
    return; // script did run already
}
touch($checkfile);

// run the rest of your script.
于 2012-10-24T11:56:49.683 に答える
0

array()をファイルにキャッシュするだけで、新しいモジュールをアップロードするときにファイルを削除するだけです。それ自体を再作成する必要があり、その後、すべてが再び設定されます。

// If $cache file does not exist or unserialize fails, rebuild it and save it
if(!is_file($cache) or (($cached = unserialize(file_get_contents($cache))) === false)){
    // rebuild your array here into $cached
    $cached = call_user_func(function(){
        // rebuild your array here and return it
    });
    // store the $cached data into the $cache file
    file_put_contents($cache, $cached, LOCK_EX);
}
// Now you have $cached file that holds your $cached data
// Keep using the $cached variable now as it should hold your data

これでうまくいくはずです。

PS : 私は現在、自分のフレームワークを書き直しており、そのようなデータを保存するために同じことを行っています。また、 SQLite DBを使用して、フレームワークが必要とするすべてのデータを格納することもできますが、パフォーマンスをテストして、ニーズに合っているかどうかを確認してください。適切なインデックスを使用すると、SQLite は高速になります。

于 2012-10-24T12:55:25.643 に答える