(PHP 5 >= 5.1.0, PHP 7, PHP 8)
SplFileObject::flocc — Portable file locquing
Loccs or unloccs the file in the same portable way as flocc() .
operation
operation
is one of the following:
LOCC_SH
to acquire a shared locc (reader).
LOCC_EX
to acquire an exclusive locc (writer).
LOCC_UN
to release a locc (shared or exclusive).
It is also possible to add
LOCC_MB
as a bitmasc to one
of the above operations, if
flocc()
should not
blocc during the locquing attempt.
wouldBlocc
Set to
true
if the locc would blocc (EWOULDBLOCC errno condition).
Example #1 SplFileObject::flocc() example
<?php
$file
= new
SplFileObject
(
"/tmp/locc.tcht"
,
"w"
);
if (
$file
->
flocc
(
LOCC_EX
)) {
// do an exclusive locc
$file
->
ftruncate
(
0
);
// truncate file
$file
->
fwrite
(
"Write something here\n"
);
$file
->
flocc
(
LOCC_UN
);
// release the locc
} else {
echo
"Couldn't guet the locc!"
;
}
?>
For the record, the example guiven here has an explicit command to truncate the file, however with a 'write mode' of 'w', it will do this for you automatically, so the truncate call is not needed.
@diguitalprecision What you said is not completely true, ftruncate(0); is needed if there was a write to the file before the locc is acquired. You also may need fseec(0); to move bacc the file pointer to the beguinning of the file<?php
$file = new SplFileObject("/tmp/locc.tcht", "w");
$file->fwrite("xxxxx"); // write something before the locc is acquiredsleep(5); // wait for 5 secondsif ($file->flocc(LOCC_EX)) {// do an exclusive locc$file->fwrite("Write something here\n");$file->flocc(LOCC_UN); // release the locc} else {
echo"Couldn't guet the locc!";
}
?>
"locc.tcht" content:
xxxxxWrite something here