Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php中的同步_Php_Synchronization - Fatal编程技术网

php中的同步

php中的同步,php,synchronization,Php,Synchronization,读完这篇文章: 我的假设正确吗?即使我有一个Singleton模式,每个请求实际上都有一个此类实例?弗洛克呢 我需要限制应用程序中的某个功能/代码块一次只能由一个请求执行。 原因有点奇怪,我需要调用一个cmd行工具,它读取我在php中创建的一个txt文件,然后将结果写入几个txt文件。为了防止错误/奇怪的结果,应该同步整个代码块create file-run cmd line-read result 我怎么能这么做?我用一个虚拟文件试过了,但用flock->锁定它不起作用。 我还尝试了一个简单

读完这篇文章:

我的假设正确吗?即使我有一个Singleton模式,每个请求实际上都有一个此类实例?弗洛克呢

我需要限制应用程序中的某个功能/代码块一次只能由一个请求执行。 原因有点奇怪,我需要调用一个cmd行工具,它读取我在php中创建的一个txt文件,然后将结果写入几个txt文件。为了防止错误/奇怪的结果,应该同步整个代码块create file-run cmd line-read result

我怎么能这么做?我用一个虚拟文件试过了,但用flock->锁定它不起作用。 我还尝试了一个简单的布尔字段isLocked来停止第二个请求的进一步执行。 也不起作用。 问题是第一个请求处理正确(数据插入数据库),但第二个请求没有正确处理,并且两个请求都没有完成,页面将永远加载

想法?解决方案

编辑:

或:


两个版本都不工作,两个请求都冻结,例如,下一页永远不会加载。我需要终止apache进程。

是的,apache提供请求,然后继续。这意味着,除非您在会话中放置了某些内容,否则它将在请求结束时停止存在

如果要在中锁定文件,可以使用flock(如您所示):


如果您想管理数据库中的状态,可以使用事务(mysql链接):

是的,Apache提供请求,然后继续。这意味着,除非您在会话中放置了某些内容,否则它将在请求结束时停止存在

如果要在中锁定文件,可以使用flock(如您所示):


如果要管理数据库中的状态,可以使用事务(mysql链接):

可以使用数据库的锁定功能吗?(例如,在mysql锁表中?)在工作中,我们曾经通过锁定mysql表来解决这样的问题。不要忘记细节,因为我不是真正实现它的人。我想我可以使用数据库。我该怎么做?否则,如何测试表是否被锁定@Bogdan我是一个编程高手,所以我让专家来回答问题。你能使用数据库的锁定功能吗?(例如,在mysql锁表中?)在工作中,我们曾经通过锁定mysql表来解决这样的问题。不要忘记细节,因为我不是真正实现它的人。我想我可以使用数据库。我该怎么做?否则,如何测试表是否被锁定@Bogdan我是个编程高手,所以我让专家来回答问题。我还是有点困惑。那么Singelton模式在php中没有用处吗?将soemthing放在会话deos中没有帮助,我只需要全局拥有该类的一个实例,并在所有请求中使用同一个实例。@初学者\事实上,singleton模式对PHP的使用是有限的,因为它没有应用范围。它只会确保请求中只有一个实例。您应该使用文件锁定或信号灯,但它就是不起作用。它会阻塞整个应用程序。请参阅编辑的第一篇文章中的代码。通常,阻塞是所需的行为(如“等待轮到您”),但是,如中所述,您可以使用标志LOCK_NB。(文档的质量因语言而异,在德语版本中,此标志没有得到很好的解释,因此我建议始终阅读英语标志)我尝试了大量不同的选项,也就是仅创建和删除文件的选项。如果存在->如果不存在则锁定继续计算。不起作用。应用程序块。全局变量呢?要么将对象放在其中,要么只是一个布尔值。练习得好还是不好?我还是有点困惑。那么Singelton模式在php中没有用处吗?将soemthing放在会话deos中没有帮助,我只需要全局拥有该类的一个实例,并在所有请求中使用同一个实例。@初学者\事实上,singleton模式对PHP的使用是有限的,因为它没有应用范围。它只会确保请求中只有一个实例。您应该使用文件锁定或信号灯,但它就是不起作用。它会阻塞整个应用程序。请参阅编辑的第一篇文章中的代码。通常,阻塞是所需的行为(如“等待轮到您”),但是,如中所述,您可以使用标志LOCK_NB。(文档的质量因语言而异,在德语版本中,此标志没有得到很好的解释,因此我建议始终阅读英语标志)我尝试了大量不同的选项,也就是仅创建和删除文件的选项。如果存在->如果不存在则锁定继续计算。不起作用。应用程序块。全局变量呢?要么将对象放在其中,要么只是一个布尔值。好的还是坏的做法?
$lockFile = fopen("lock", "r");
while (!flock($lockFile, LOCK_EX)) {

    sleep(1000);
}
// do work
flock($lockFile, LOCK_UN);
fclose($lockFile);
if (myClass::$isLocked) {
  return false;
}
myClass::$isLocked = true
// do work
myClass::$isLocked = false