PHP百万数据导出Excel

背景 公司业务部门经常会需要导出各种数据进行分析,因为需要的数据模板多变,产品一直没有将其规划成系统功能,每次需要的数据都是手写 SQL 语句进行导出。在写了上万行 SQL 语句以后,我对这种体力劳动感觉到了厌烦,于是和领导申请,自己利用空闲时间规划开发了一个灵活配置、适用性强的导表系统。 使用技术 API 框架 Hyperf Web 框架 Ant Design Pro Excel 扩展 xlsWriter 优化 为了尽快实现功能,导出 Excel 功能是做的同步导出,但在我的设计中应该是异步导出,因此在后续的优化中引入了 RabbitMQ 消息队列实现异步导出功能。 因为不能将 Db 对象投递到消息队列中,所以投递过去的是 SQL 的预处理语句以及对应的变量,使用Db::select($sql, $bindings);执行 SQL 。然后尝试查询百万条数据,直接就内存溢出了。 vendor/hyperf/database/src/Connection.php 271 行 /** * Run a select statement against the database. */ public function select(string $query, array $bindings = [], bool $useReadPdo = true): array { return $this->run($query, $bindings, function ($query, $bindings) use ($useReadPdo) { if ($this->pretending()) { return []; } // For select statements, we'll simply execute the query and return an array // of the database result set....

2022-05-19 · 4 分钟

使用docker-compose构建PHP8.0 + Swoole + Redis + MongoDB环境

最近公司考虑使用 PHP8 + swoole 进行项目的重构,所以要搭建一个环境进行开发学习。swoole 只能运行在 Linux 系统下,考虑到统一团队的开发环境,避免别的小伙伴在环境问题上浪费太多时间,所以选择使用 docker 来构建一个开发环境。 首先创建我们的工作目录Docker,然后在DockerHub上查找 PHP8.0 最新版本的镜像目前为PHP8.0.12,在Docker目录下创建php目录,因为以后可能会使用别的版本的 PHP,所以在php目录下在创建一个php8.0.12的目录,并在目录中创建Dockerfile文件。 目录结构为 Docker ├─ php │ ├─ php8.0.12 │ │ └─ Dockerfile │ ├─ ... 构建自己的 PHP 镜像 Dockerfile # 因为要使用swoole直接使用cli版本FROMphp:8.0.12-cli# 更新依赖RUN apt-get update \ && apt-get install -y \ unixodbc-dev \ zlib1g-dev \ libzip-dev# 创建`/usr/src/php/ext`目录RUN docker-php-source extract# 下载redis扩展# printf "" | 是为了跳过扩展安装过程中弹出让我们选择的yes noRUN printf "" | pecl install redis-5.3.4# 下载mongodb扩展RUN printf "" | pecl install mongodb-1....

2021-11-24 · 3 分钟