−39
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
private function removeLock($storageFile) {
// suppress all warnings, if some other process removed it that's ok too
@unlink($storageFile . '.lock');
}
private function waitForLock($storageFile) {
// 20 x 250 = 5 seconds
$tries = 20;
$cnt = 0;
do {
// make sure PHP picks up on file changes. This is an expensive action but really can't be avoided
clearstatcache();
// 250 ms is a long time to sleep, but it does stop the server from burning all resources on polling locks..
usleep(250);
$cnt ++;
} while ($cnt <= $tries && $this->isLocked($storageFile));
if ($this->isLocked($storageFile)) {
// 5 seconds passed, assume the owning process died off and remove it
$this->removeLock($storageFile);
}
}
если за пять секунд не удалось залочить файл, мы его вообще нахуй выкидываем, потому что значит занявший его процесс умер
то, что эти пять секунд лок мог быть нарасхват между разными процессами, не учитывается вообще
отдельное достижение - использовать usleep, подавая ему на вход миллисекунды, когда он работает с микросекундами (т.е. весь процесс займет не пять секунд, а около пяти миллисекунд)
https://github.com/Exercise/google-api-php-client/blob/master/src/cache/apiFileCache.php#L58
Запостил: Fike,
03 Февраля 2017
Steve_Brown 03.02.2017 13:58 # 0
huest 03.02.2017 14:15 # −63
guest 03.02.2017 19:02 # 0
huesto 03.02.2017 18:58 # 0
Fike 03.02.2017 19:42 # 0
http://man7.org/linux/man-pages/man3/usleep.3.html
roman-kashitsyn 03.02.2017 23:01 # 0
Fike 04.02.2017 14:17 # 0
ANYS 04.02.2017 00:23 # −2
guest 04.02.2017 20:59 # 0