Subversion Repositories php_utils

Rev

Rev 27 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. <?php
  2.  
  3. /*
  4.  * fixed_length_microtime() for PHP
  5.  * Copyright 2022 Daniel Marschall, ViaThinkSoft
  6.  * Version 2022-03-03
  7.  *
  8.  * Licensed under the Apache License, Version 2.0 (the "License");
  9.  * you may not use this file except in compliance with the License.
  10.  * You may obtain a copy of the License at
  11.  *
  12.  *     http://www.apache.org/licenses/LICENSE-2.0
  13.  *
  14.  * Unless required by applicable law or agreed to in writing, software
  15.  * distributed under the License is distributed on an "AS IS" BASIS,
  16.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  17.  * See the License for the specific language governing permissions and
  18.  * limitations under the License.
  19.  */
  20.  
  21. function fixed_length_microtime() {
  22.         // This function outputs a fixed-length microtime (can be used for sorting)
  23.         // Additionally, it ensures that the output is always different by waiting 1 microsecond
  24.  
  25.         $ary = explode('.', (string)microtime(true));
  26.         if (!isset($ary[1])) $ary[1] = 0;
  27.         $ret = $ary[0].'_'.str_pad($ary[1], 4, '0', STR_PAD_RIGHT);
  28.  
  29.         while (true) {
  30.                 $ary = explode('.', (string)microtime(true));
  31.                 if (!isset($ary[1])) $ary[1] = 0;
  32.                 $ret2 = $ary[0].'_'.str_pad($ary[1], 4, '0', STR_PAD_RIGHT);
  33.                 // Wait until the value changes. This ensures that the microtime will never be the same
  34.                 // sleep(0.1) does not work for some reason.
  35.                 if ($ret != $ret2) break;
  36.         }
  37.  
  38.         return $ret;
  39. }
  40.