How to generate unique numeric id in php

Database systems use exclusive locking when creating numbers such as MySQL's auto_increment which takes care of concurrency and many other intricate details.

You have to approach the problem you have the same way - acquire a lock from the PHP process that's serving the request, look up the current value within some sort of persistent storage, increment it by 1, return it and release the lock.

The easiest way to do this is to use a good old file and exclusive locking.

I'll illustrate with a class [which should be debugged since it's not complete]:

class MyAutoIncrement
{
    protected $fh = null;
    protected $file_path = '';
    protected $auto_increment_offset = 1;

    public function __construct[$file_path, $offset = 1]
    {
        $this->file_path = $file_path;
        $this->auto_increment_offset = $offset;
    }

    public function autoincrement[]
    {
        if[$this->acquire[]]
        {
            $current = [int]fread[$this->fh];

            $next += $this->auto_increment_offset;

            fwrite[$this->fh, $next];

            $this->release[];

            return $next;
        }

        return null;
    }

    public function acquire[]
    {       
        $handler = $this->getFileHandler[];

        return flock[$handler, LOCK_EX];
    }

    public function release[$close = false]
    {
        $handler = $this->getFileHandler[];

        return flock[$handler, LOCK_UN];

        if[$close] 
        {
            fclose[$handler];
            $this->fh = null;
        }
    }   

    protected function acquireLock[$handler]
    {
        return flock[$handler, LOCK_EX];
    }

    protected function getFileHandler[]
    {
        if[is_null[$this->fh]]
        {
            $this->fh = fopen[$this->file_path, 'c+'];

            if[$this->fh === false]
            {
                throw new \Exception[sprintf["Unable to open the specified file: %s", $this->file_path]];
            }
        }

        return $this->fh;
    }
}

Usage:

$ai = new MyAutoIncrement['/path/to/counter/file.txt'];

try
{
    $id = $ai->autoincrement[];

    if[!is_null[$id]]
    {
        // Voila, you got your number, do stuff
    }
    else
    {
        // We went wrong somewhere
    }
}
catch[\Exception $e]
{
// Something went wrong
}

[PHP 4, PHP 5, PHP 7, PHP 8]

uniqidGenerate a unique ID

Description

uniqid[string $prefix = "", bool $more_entropy = false]: string

Warning

This function does not guarantee uniqueness of return value. Since most systems adjust system clock by NTP or like, system time is changed constantly. Therefore, it is possible that this function does not return unique ID for the process/thread. Use more_entropy to increase likelihood of uniqueness.

Parameters

prefix

Can be useful, for instance, if you generate identifiers simultaneously on several hosts that might happen to generate the identifier at the same microsecond.

With an empty prefix, the returned string will be 13 characters long. If more_entropy is true, it will be 23 characters.

more_entropy

If set to true, uniqid[] will add additional entropy [using the combined linear congruential generator] at the end of the return value, which increases the likelihood that the result will be unique.

Return Values

Returns timestamp based unique identifier as a string.

Warning

This function tries to create unique identifier, but it does not guarantee 100% uniqueness of return value.

Examples

Example #1 uniqid[] Example

Chủ Đề