Я создаю счет в PHP и для номера счета я хотел бы создать последовательный номер.

Я использую gettimeofday () для генерации номера счета, но это дает мне непоследовательный номер, который выглядит примерно так: 46023913

<?php 
$new_invoice = gettimeofday(); 
$new_invoice = $new_invoice[sec]; 
$new_invoice = $new_invoice - 1509000000;
echo $new_invoice;
?>
php
1
Karim Boroumand 12 Апр 2019 в 02:27

2 ответа

Лучший ответ

Создайте текстовый файл counter.txt с номером в нем (1509000000). Прочитайте файл с помощью file_get_contents (counter.txt), затем обновите файл

Я не работал в PHP некоторое время, но это выглядит как

Согласно KIKO: заблокировать файл

<?php

$num = file_get_contents('counter.txt');

echo $num;
$handle = fopen('counter.txt','w+');

if (flock($handle,LOCK_EX)){

  $num++;
  fwrite($handle,$num);
  fclose($handle);
  // release lock
  flock($handle,LOCK_UN);
} else {
  echo "Error locking file!";
}

$num = file_get_contents('counter.txt');

echo $num;

Что-то такое.

1
richardwhitney 12 Апр 2019 в 04:58

Ричард Уитни теперь включил блокировку файла, но это сделано не очень хорошо. Если блокировка уже существует, его код выдаст ошибку. Это не практично. Код ниже будет ждать до 10 секунд для разблокировки файла.

// open the file
$handle = fopen("counter.txt","r+");
if ($handle) {
    // place an exclusive lock on the file, wait for a maximum of 10 seconds
    $tenths = 0;
    while (!flock($handle, LOCK_EX)) {
        $tenths++;
        if ($tenths == 100) die('Could not get a file lock.');
        usleep(100000);
    }
    // get old invoice number
    $oldInvoiceNo = fgets($handle);
    // create a new sequential invoice number
    $newInvoiceNo = $oldInvoiceNo++;
    // write the new invoice number to the file
    ftruncate($handle, 0);
    fwrite($handle, $newInvoiceNo);
    // unlock the file
    flock($handle, LOCK_UN);
    // close the file
    fclose($handle);
}
else die('Could not open file for reading and writing.');

При блокировке файлов всегда старайтесь делать это как можно быстрее.

Лучше всего изолировать этот код от остальной части вашего кода, например, в функции.

function getNewInvoiceNo($pathToCounter)
{
    // open the file
    $handle = fopen($pathToCounter, "r+");
    if ($handle) {
        // place an exclusive lock on the file, wait for a maximum of 10 seconds
        $tenths = 0;
        while (!flock($handle, LOCK_EX)) {
            $tenths++;
            if ($tenths == 100) die('Could not get a file lock.');
            usleep(100000);
        }
        // create a new sequential invoice number
        $newInvoiceNo = fgets($handle) + 1;
        // write the new invoice number to the file
        ftruncate($handle, 0);
        fwrite($handle, $newInvoiceNo);
        // unlock the file
        flock($handle, LOCK_UN);
        // close the file
        fclose($handle);
    }
    else die('Could not open file for reading and writing.');
}
1
KIKO Software 12 Апр 2019 в 00:24