5

私はPHPでWebAppを開発しています。ユーザーはボタンをクリックできるようになり、PHPコードはシステムexecを呼び出すことになります。WebAppはAJAXを使用するため、ユーザーがボタンを2回クリックするか、実際に別のボタンをクリックして別のexecプロセスを開始する可能性があります。

これで、単一のイベントが完了するまでボタンを無効にする小さなJavaScriptを記述できることがわかりました。ただし、これはクライアント側の強制であり、簡単に上書きできます。

このようなことが起こらないようにするために、PHP側でできることはありますか?私の頭の中では、セッション変数を「セマフォ」として機能させることを考えています。すべてのスクリプトが実行される前に、この変数がチェックされ、スクリプトを続行する前に0を返す必要があります。

私はそれを正しい方法で行っていますか?それとも、デッドロック/競合状態のためにワームの缶を開けるだけですか?

ありがとう

更新:コンテキストに入れるために、私が開発しているシステムは、仮想プライベートサーバーの起動、停止、およびイメージの再作成に使用されます。再イメージングボタンが押された場合、PHPスクリプトはbashスクリプトを呼び出して、VPSの再イメージングを開始します。ただし、これが行われている間にユーザーがVPSを開始しようとした場合...

4

3 に答える 3

1

jQuery.ajax()このオプションを使用asyncしてfalseに設定できます。

asyncデフォルト:trueデフォルトでは、すべての要求は非同期で送信されます(つまり、これはデフォルトでtrueに設定されています)。同期リクエストが必要な場合は、このオプションをfalseに設定してください。クロスドメインリクエストとdataType:「jsonp」リクエストは同期操作をサポートしていません。同期リクエストはブラウザを一時的にロックし、リクエストがアクティブな間はアクションを無効にする可能性があることに注意してください

あなたはそれをこのように使うことができます:

$.ajax({
    type: "POST",
    url: "file.php",
    async: false,
    data: data,
    success: function(return){
        alert("Success: "+return);
    }
});

ローダーを追加する場合は、次のように適用します。

startLoader();
$.ajax({
    type: "POST",
    url: "file.php",
    async: false,
    data: data,
    success: function(return){
        alert("Success: "+return);
    }
});
endLoader();

ただし、PHPのアイデアは単に良いものではありません。セッションを開いてこの種のすべてのプロセスを実行するのは役に立たず、スクリプトの速度が低下します。あなたは自分自身に問いかける必要があります:私は本当にこれをブロックする必要がありますか?

答えが「はい」の場合は、次のようprocessesにします。データベースで呼び出されるテーブルを作成します。そのテーブル内に2つのフィールドを作成します。1つはプロセス識別子になります:process_id; 2番目はプロセスステータスになります:process_status。1つ目は、sha1(IMAGE)で定義する整数です。2番目は整数になります:1「ビジー」の場合0は「フリー」の場合。

次に、次のようなことを行うことができます。

SELECT process_status FROM vps_processes WHERE process_id = sha1(CURRENT_IMAGE);

そして、それが何である1かを確認し0ます。1その後、スクリプトをブロックする場合。その場合は、次の0クエリを実行します。

UPDATE vps_processes SET process_status = 1 WHERE process_id = sha1(CURRENT_IMAGE);

次に、実行する必要があるものを実行し、スクリプトクエリの最後に次のようにします。

UPDATE vps_processes SET process_status = 0 WHERE process_id = sha1(CURRENT_IMAGE);
于 2011-04-22T13:15:34.317 に答える
0

サーバー側のソリューションにしたいという事実から、ここのユーザーを信頼していないのではないかと思います。そうすると、明らかにセッション構造を使用できなくなります。これは、クライアントによって回避される可能性もあるためです。代わりに、単一のIPアドレスまたは同様のアプローチをロックする必要があります。たぶん、ロックファイルのあるフォルダがあり、リクエストを実行するIPにちなんで名付けられたファイルを作成します。

于 2011-04-22T13:19:01.027 に答える
0

異なるマシン間でユーザーごとの制限を適用する場合を除いて、いつでもhttp://php.net/manual/en/function.flock.phpを使用して、というファイルの操作をロックできます。lock.$username

または、とにかく同時に実行されるphpプロセスの数が限られているため、制限を適用することを気にする必要はありません。

于 2011-04-22T13:19:29.467 に答える