在没有数据库的情况下生成顺序发票编号

时间:2019-04-11 23:27:13

标签: php

我正在用PHP创建发票,并且要为发票号生成一个序列号。

我现在使用gettimeofday()来生成发票编号,但这给了我一个非顺序编号,看起来像这样:46023913

Iterable

2 个答案:

答案 0 :(得分:1)

创建一个带有数字的文本文件'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 :(得分:1)

Richardwhitney现在包括了文件锁,但是做得并不好。如果已经存在锁,则他的代码将产生错误。那不切实际。下面的代码将等待长达10秒钟的时间来解锁文件。

first First name
last Last name
Fullname

锁定文件时,请始终尝试在尽可能短的时间内执行此操作。

最好将此代码与其余代码隔离开来,例如在一个函数中。

// 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.');