如何避免php代码中的竞争条件
我在Java/JavaEE方面有很好的经验,但我对PHP非常陌生。有一个小要求,我想共享变量的值(包含字符串标记) 访问不同的用户请求。现在的问题是,我想使这个变量的读写是线程安全的。一次只有一个用户可以读/写 在这个变量中 如果我要用Java实现,我只需要使用synchonized关键字锁定一个对象,就可以将代码块(读/写)放在synchronized块中 在PHP中,我已经将令牌放在了GLOBALS数组中,但是我没有任何方法可以使这个变量的读写线程安全。我在逃避如何避免php代码中的竞争条件,php,race-condition,Php,Race Condition,我在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仅提供对当前运行脚本中变量的访问。该运行只有一个线程。可以有其他脚本并行运行,但它们有一个完全独立的作用域。您可以使用会话,但这是针对单个用户的后续请求。如果您想在不同用户的不同请求之间共享数据,我认为最好的选择是使用文件或数据库。如果您的系统允许,那么您也可以尝试进行进程间通信