2

使用两个不同的 AJAX 函数访问两个不同的文件时,我遇到了并发问题。

我不能使用数据库来执行以下任务,它只能使用这些文件来完成

问题

我有两个文件,AB

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

我有两个 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 不是我想要的,因为它不能在两个 AJAX 调用之间工作。另外,假设返回“抱歉,无法打开文件 B”不是一个选项,它必须在第一次尝试时工作。

到目前为止我想到的每个解决方案都行不通:

使用mutex.lock临时文件检查是否使用了资源会导致相同的问题。

也许有一种方法可以检查 Apache 当前是否正在运行func_a,所以func_b等待?(在这种情况下,资源匮乏是不可能的)

我不太习惯并发数学,我在 Internet 上找到的所有内容都与数据库和/或互斥锁有关。

任何帮助将不胜感激,也许有一种我没有想到的简单方法?

谢谢。

4

2 回答 2

2

我真的不明白你的意思,但如果你想锁定文件以进行写入或读取,请在 php.ini 中使用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 回答