flock() 是否只适用于当前方法?
Does flock() only apply to the current method?
flock()
函数是否只有在与代码执行相同的方法中使用时才有效?
例如下面的代码,加锁成功:
public function run()
{
$filePointerResource = fopen('/tmp/lock.txt', 'w');
if (flock($filePointerResource, LOCK_EX)) {
sleep(10);
} else {
exit('Could not get lock!');
}
}
但是,在下面的代码中,锁是不成功的:
public function run()
{
if ($this->lockFile()) {
sleep(10);
} else {
exit('Could not get lock!');
}
}
private function lockFile()
{
$filePointerResource = fopen('/tmp/lock.txt', 'w');
return flock($filePointerResource, LOCK_EX);
}
我还没有看到这方面的任何文档,所以我对这种行为感到困惑。我正在使用 php 版本 5.5.35.
我认为你基于 class 的尝试的问题是当 lockFile
方法完成时 $filePointerResource
超出范围,这可能是释放锁的原因
这项工作支持该理论
<?php
class test {
public function run()
{
$fp = fopen('lock.txt', 'w');
if ($this->lockFile($fp)) {
echo 'got a lock'.PHP_EOL;
sleep(5);
}
/*
* Not going to do anything as the attempt to lock EX will
* block until a lock can be gained
else {
exit('Could not get lock!'.PHP_EOL);
}
*/
}
private function lockFile($fp)
{
return flock($fp, LOCK_EX);
}
}
$t = new test();
$t->run();
因此,如果您想通过多次调用 class 方法来锁定文件,最好将文件句柄保留为 class 属性,然后它将只要 class 被实例化并在范围内,就保留在范围内。
<?php
class test {
private $fp;
public function run()
{
$this->fp = fopen('lock.txt', 'w');
if ($this->lockFile()) {
echo 'got a lock'.PHP_EOL;
sleep(5);
}
/*
* Not going to do anything as the attempt to lock EX will
* block until a lock can be gained
else {
exit('Could not get lock!'.PHP_EOL);
}
*/
}
private function lockFile()
{
return flock($this->fp, LOCK_EX);
}
}
$t = new test();
$t->run();
flock()
函数是否只有在与代码执行相同的方法中使用时才有效?
例如下面的代码,加锁成功:
public function run()
{
$filePointerResource = fopen('/tmp/lock.txt', 'w');
if (flock($filePointerResource, LOCK_EX)) {
sleep(10);
} else {
exit('Could not get lock!');
}
}
但是,在下面的代码中,锁是不成功的:
public function run()
{
if ($this->lockFile()) {
sleep(10);
} else {
exit('Could not get lock!');
}
}
private function lockFile()
{
$filePointerResource = fopen('/tmp/lock.txt', 'w');
return flock($filePointerResource, LOCK_EX);
}
我还没有看到这方面的任何文档,所以我对这种行为感到困惑。我正在使用 php 版本 5.5.35.
我认为你基于 class 的尝试的问题是当 lockFile
方法完成时 $filePointerResource
超出范围,这可能是释放锁的原因
这项工作支持该理论
<?php
class test {
public function run()
{
$fp = fopen('lock.txt', 'w');
if ($this->lockFile($fp)) {
echo 'got a lock'.PHP_EOL;
sleep(5);
}
/*
* Not going to do anything as the attempt to lock EX will
* block until a lock can be gained
else {
exit('Could not get lock!'.PHP_EOL);
}
*/
}
private function lockFile($fp)
{
return flock($fp, LOCK_EX);
}
}
$t = new test();
$t->run();
因此,如果您想通过多次调用 class 方法来锁定文件,最好将文件句柄保留为 class 属性,然后它将只要 class 被实例化并在范围内,就保留在范围内。
<?php
class test {
private $fp;
public function run()
{
$this->fp = fopen('lock.txt', 'w');
if ($this->lockFile()) {
echo 'got a lock'.PHP_EOL;
sleep(5);
}
/*
* Not going to do anything as the attempt to lock EX will
* block until a lock can be gained
else {
exit('Could not get lock!'.PHP_EOL);
}
*/
}
private function lockFile()
{
return flock($this->fp, LOCK_EX);
}
}
$t = new test();
$t->run();