2

2 つの異なるファイルにアクセスする 2 つの異なる AJAX 関数を使用すると、同時実行の問題が発生します。

データベースを使用して次のタスクを実行できません。これらのファイルのみを使用して実行する必要があります

問題

ABの2 つのファイルがあります。

// A content :
1 2 3 4
// B content :
5 6 7 8

2 つの AJAX 呼び出しがfunc_aあり、func_b

func_aAからBに最後の値を追加し、BからAに最後の値を追加します

// Result after func_a 
A : 1 2 3 4 8
B : 5 6 7 8 4

func_bBからAに最後の値を追加し、AからBに最後の値を追加します

並行性について考えましたが、いずれにしても問題が発生します。まず、次のファイルを開く前に各ファイルを読み取って閉じ、func_a+func_bを同時に使用すると、次の結果が得られます。

A : 1 2 3 4 8 8
B : 5 6 7 8 4 4

しかし、望ましい結果は次のようになります。

A : 1 2 3 4 8 4
B : 5 6 7 8 4 8

さらに、プロセス全体でファイルを開いたままにできないか、デッドロックが発生する可能性があると思います。

func_a open A;
func_b open B;
func_a can't open B, waits forever;
func_b can't open A, waits forever;

PhP Mutex は、2 つの AJAX 呼び出し間で機能しなかったため、私が探しているものではないと確信しています。また、「申し訳ありませんが、ファイル B を開けませんでした」を返すことはオプションではなく、最初の試行で機能する必要があるとしましょう。

これまでに考えたすべてのソリューションは機能しません。

一時ファイルを使用してmutex.lock、リソースが使用されているかどうかを確認すると、同じ問題が発生します。

Apacheが現在実行されているかどうかを確認する方法があるfunc_aので、func_b待っていますか?(その場合、リソースの枯渇はあり得ません)

私は同時並行性数学にあまり慣れておらず、インターネットで見つけたものはすべてデータベースやミューテックスに関連していました。

私が考えていなかった簡単な方法があるかもしれません。

ありがとう。

4

2 に答える 2

2

私はあなたの主張を本当に理解していませんが、書き込みまたは読み取りのためにファイルをロックしたい場合は、php で flock を使用します。http://php.net/manual/en/function.flock.php

于 2013-08-30T15:22:23.487 に答える
1

flock()他のプロセスがファイルに書き込めないように、ファイルをロックする which を使用できます。

$fp = fopen("file.txt", "r+");

while(!flock($fp, LOCK_EX)) {  // acquire an exclusive lock
    // waiting to lock the file
}

// your code here

flock($fp, LOCK_UN);    // release the lock

fclose($fp);
于 2013-08-30T15:25:50.850 に答える