两个文件和两个AJAX调用的并发

时间:2013-08-30 15:12:57

标签: php ajax concurrency

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

我无法使用数据库执行以下任务,只能使用这些文件

问题

我有两个文件, A B

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

我有两个AJAX来电,func_afunc_b

func_a A 中的最后一个值添加到 B ,并将 B 中的最后一个值添加到 A < / strong>

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

func_b B 中的最后一个值添加到 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调用之间工作。另外,让我们说返回&#34;抱歉,无法打开文件B&#34;不是一种选择,它必须首先尝试。

到目前为止,我想到的每个解决方案都不会起作用:

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

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

我不太习惯并发数据,我在互联网上找到的所有东西都与数据库和/或互斥量有关。

非常感谢任何帮助,也许我没有想到的简单方法?

感谢。

2 个答案:

答案 0 :(得分:2)

我真的不明白你的观点,但是如果你想锁定文件以便写入或读取使用flock在php中。 http://php.net/manual/en/function.flock.php

答案 1 :(得分:1)

您可以使用flock()来锁定文件,以便其他进程不会写入文件。

$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);