如何避免php代码中的竞争条件

如何避免php代码中的竞争条件,php,race-condition,Php,Race Condition,我在Java/JavaEE方面有很好的经验,但我对PHP非常陌生。有一个小要求,我想共享变量的值(包含字符串标记) 访问不同的用户请求。现在的问题是,我想使这个变量的读写是线程安全的。一次只有一个用户可以读/写 在这个变量中 如果我要用Java实现,我只需要使用synchonized关键字锁定一个对象,就可以将代码块(读/写)放在synchronized块中 在PHP中,我已经将令牌放在了GLOBALS数组中,但是我没有任何方法可以使这个变量的读写线程安全。我在逃避 使用任何外部库以避免降级。请

我在Java/JavaEE方面有很好的经验,但我对PHP非常陌生。有一个小要求,我想共享变量的值(包含字符串标记) 访问不同的用户请求。现在的问题是,我想使这个变量的读写是线程安全的。一次只有一个用户可以读/写 在这个变量中

如果我要用Java实现,我只需要使用synchonized关键字锁定一个对象,就可以将代码块(读/写)放在synchronized块中

在PHP中,我已经将令牌放在了GLOBALS数组中,但是我没有任何方法可以使这个变量的读写线程安全。我在逃避
使用任何外部库以避免降级。请指导我如何实现这一点。

您可以使用PECL pthreads。这需要安装

您可以从以下位置检查使用情况:

或者更简单的解决方案是锁定文件

$fp = fopen("/tmp/lock.txt", "r+");

if (flock($fp, LOCK_EX)) {  // acquire an exclusive lock
    ftruncate($fp, 0);      // truncate file
    fwrite($fp, "Write something here\n");
    fflush($fp);            // flush output before releasing the lock
    flock($fp, LOCK_UN);    // release the lock
} else {
    echo "Couldn't get the lock!";
}

fclose($fp);

变量存储在何处/如何存储?当脚本完成时,PHP变量不再存在,因此您需要一个文件或数据库来存储该值。我没有在网站上使用Java,但我认为它与PHP的不同之处在于,PHP脚本是短暂的,实际上在请求结束时终止$_GLOBALS仅提供对当前运行脚本中变量的访问。该运行只有一个线程。可以有其他脚本并行运行,但它们有一个完全独立的作用域。您可以使用会话,但这是针对单个用户的后续请求。如果您想在不同用户的不同请求之间共享数据,我认为最好的选择是使用文件或数据库。如果您的系统允许,那么您也可以尝试进行进程间通信