1. PHP / Говнокод #22115

    −39

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 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

    Комментарии (9) RSS

    Добавить комментарий