【发布时间】:2016-09-04 19:33:38
【问题描述】:
我有一个目录,其中可以包含来自我需要导入数据库的服务的 CSV 文件。这些 CSV 文件每个有 1000 行,可以是 10 到 150 个文件。
我想将所有这些 CSV 文件的数据插入数据库。问题是 PHP 因超时问题而死,因为即使我使用set_time_limit(0),服务器 (siteground.com) 也会施加其限制。代码如下:
// just in case even though console script should not have problem
ini_set('memory_limit', '-1');
ini_set('max_input_time', '-1');
ini_set('max_execution_time', '0');
set_time_limit(0);
ignore_user_abort(1);
///////////////////////////////////////////////////////////////////
function getRow()
{
$files = glob('someFolder/*.csv');
foreach ($files as $csvFile) {
$fh = fopen($csvFile, 'r');
$count = 0;
while ($row = fgetcsv($fh)) {
$count++;
// skip header
if ($count === 1) {
continue;
}
// make sure count of header and actual row is same
if (count($this->headerRow) !== count($row)) {
continue;
}
$rowWithHeader = array_combine($this->headerRow, $row);
yield $rowWithHeader;
}
}
}
foreach(getRow() as $row) {
// fix row
// now insert in database
}
这实际上是一个通过artisan 运行的命令(我使用的是 Laravel)。我知道 CLI 没有时间限制,但由于某种原因,并非所有 CSV 文件都被导入并且进程在某个时间点结束。
所以我的问题是有没有办法为目录中存在的每个 CSV 文件调用单独的 PHP 进程?或者其他一些方法,这样我就可以导入所有 CSV 文件,而不会出现任何问题,例如 PHP 的 generator, 等
【问题讨论】:
-
如果托管服务提供商希望脚本只运行有限的时间,那么他可以这样做。即使通过 CLI 运行 PHP 也无济于事。他可以直接杀死进程。
-
为什么在连接到远程数据库时不从 localhost 运行 PHP 脚本?在本地,您可以为脚本设置没有时间限制。
-
@RobertTrzebiński:它实际上必须在服务器上运行。
-
丢人,所以你需要一次处理一个文件,或者如果这还不够,请更改托管计划。
-
请记住:如果运行时间过长,您可以在 Web 服务器(nginx、Apache)或 PHP 池(fpm、fastcgi)中设置超时,这也会杀死 PHP。不跑过
cli,不只是php.ini。
标签: php performance laravel csv