Created
July 18, 2014 10:32
-
-
Save arvenil/a1d273f5287ce8e1f4df to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
// Let's create /tmp/ninja-lock1.txt ... | |
$fp0 = fopen('/tmp/ninja-lock1.txt', 'c'); | |
// ... and close it imiedietly | |
fclose($fp0); | |
// File handler $fp0 was closed so flock() | |
// is unable to use it to gain lock. | |
// It will fail with wouldblock set to 0 | |
// as it doesn't make sense to wait on unusable file handle. | |
// | |
// BTW flock() throws in such case warning "x is not a valid stream resource". | |
// Just for the purpose of clear output from this example | |
// I've suppressed it with @ - don't use @ in production | |
$flockResult = @flock($fp0, LOCK_EX | LOCK_NB, $wouldblock); | |
printf("flock=%b; wouldblock=%d (Acquire lock: %s)\n", $flockResult, $wouldblock, "failure, broken file handle"); | |
// Two handlers for /tmp/ninja-lock2.txt | |
// to show flock() blocking result. | |
$fp1 = fopen('/tmp/ninja-lock2.txt', 'c'); | |
$fp2 = fopen('/tmp/ninja-lock2.txt', 'c'); | |
// Nobody is locking on /tmp/ninja-lock2.txt, | |
// so it will acquire lock and wouldblock will be 0 | |
$flockResult = flock($fp1, LOCK_EX | LOCK_NB, $wouldblock); | |
printf("flock=%b; wouldblock=%d (Acquire lock: %s)\n", $flockResult, $wouldblock, "success"); | |
// File is locked on $fp1 handle so flock won't acquire lock | |
// and wouldblock will be 1 | |
$flockResult = flock($fp2, LOCK_EX | LOCK_NB, $wouldblock); | |
printf("flock=%b; wouldblock=%d (Acquire lock: %s)\n", $flockResult, $wouldblock, "failure, already acquired somewhere else"); | |
// Result: | |
// $ php flock.php | |
// flock=0; wouldblock=0 (Acquire lock: failure, broken file handle) | |
// flock=1; wouldblock=0 (Acquire lock: success) | |
// flock=0; wouldblock=1 (Acquire lock: failure, already acquired somewhere else) | |
?> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment