event函数 一定机率报错

运行环境

  • PHP 7.4.13 /CentOS Linux release 7.8.2003 (Core)

    问题

    event() 函数有一定机率报错,经过追踪,是生uuid4报错,偶发

  • 初步怀疑是php配置/环境哪里不对,php是手工安装的,装了opcache扩展,但关闭了.除此之外和虚拟机并没有不同.

文件位置: vendor/ramsey/uuid/src/UuidFactory.php

//是这个函数调用的
public function uuid4(): UuidInterface
{
  $bytes = $this->randomGenerator->generate(16);

  return $this->uuidFromBytesAndVersion($bytes, 4);
}

private function uuidFromBytesAndVersion(string $bytes, int $version): UuidInterface
    {
        /** @var array $unpackedTime */
        $unpackedTime = unpack('n*', substr($bytes, 6, 2));
        $timeHi = (int) $unpackedTime[1];
        $timeHiAndVersion = pack('n*', BinaryUtils::applyVersion($timeHi, $version));

        /** @var array $unpackedClockSeq */
        $unpackedClockSeq = unpack('n*', substr($bytes, 8, 2));
        $clockSeqHi = (int) $unpackedClockSeq[1];//就是这里报错
        $clockSeqHiAndReserved = pack('n*', BinaryUtils::applyVariant($clockSeqHi));

        $bytes = substr_replace($bytes, $timeHiAndVersion, 6, 2);
        $bytes = substr_replace($bytes, $clockSeqHiAndReserved, 8, 2);

        if ($this->isDefaultFeatureSet) {
            return LazyUuidFromString::fromBytes($bytes);
        }
        return $this->uuid($bytes);
    }

错误日志

  • Undefined offset: 1
  • #0 /home/www/ec/vendor/ramsey/uuid/src/UuidFactory.php(481): Illuminate\Foundation\Bootstrap\HandleExceptions->handleError()
  • #1 /home/www/ec/vendor/ramsey/uuid/src/UuidFactory.php(387): Ramsey\Uuid\UuidFactory->uuidFromBytesAndVersion()

    update

  • 如有进展,我会更新
    第一次更新
  • 安装虚拟机试了下,每次都是成功,没有这个问题虚拟机是centos8/php7.4/laravel8
    结束
  • 新机器同样的代码没有问题,出问题的机器是因为开始的php是通过宝塔安装的,后来又删除,手动编译安装,把环境搞坏了.
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

怀疑出现问题,这个生成的数据有问题

$bytes = $this->randomGenerator->generate(16);
2年前 评论
讨论数量: 3

n 是无符号两个字节序, $bytes 的数据结构应该是这样的

aaaaaa + '2个字节长度的二进制字符'  + '2个字节长度的二进制字符'

对第一个二进制字符,进行 unpack('n*', substr($bytes, 6, 2));,应该数据是 array(1=>'1202')$timeHi 的字面意思。 出错的地方在对 第二个二进制字符 进行解压过程的出错,可能截取两个长度的字符并非是二进制字符,或者压根不存在

2年前 评论

怀疑出现问题,这个生成的数据有问题

$bytes = $this->randomGenerator->generate(16);
2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!