【问题标题】:PHP. Transferring downloaded csv to mysql database - how can I store downloaded csv file in php memoryphp。将下载的 csv 传输到 mysql 数据库 - 如何将下载的 csv 文件存储在 php 内存中
【发布时间】:2014-12-29 04:59:20
【问题描述】:

我想将从网站下载的数据存储到我的 mysql 数据库中。

我使用我的函数 "CallAPI("GET", $url, $data = false)" 使用诸如 "http://www.xflow1.com/xGlobalHist.csv/" 之类的 url 访问数据库...

所以我的调用 $results = CallAPI($method, $url, $data = false);返回一个逗号分隔的数组,该数组保存在变量“$results”中。我可以在网页中回显 $results,它会向我显示数据,所有数据均以逗号分隔。一切顺利,直到这里。

要将 csv 上传到我的 mysql 数据库,我想使用“LOAD DATA INFILE”功能:

$upload = <<<eof
LOAD DATA INFILE $results
INTO TABLE X_Adjusted_All
FIELDS TERMINATED BY '|' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(Cusip, Date, Price)
 eof;  

出现问题是因为“LOAD DATA INFILE $results”不起作用,因为 LOAD DATA INFILE 只需要一个文件名,所以我想将 $results 作为 csv 文件存储在内存中,以避免一直创建和删除文件.我认为这可能有效:

$fp = fopen('php://memory', 'w');
fputcsv($fp, $results);

唉,不。有谁知道如何获取下载的 csv 文件并将其作为 csv 文件保存到 phps 内存中,以便在 LOAD DATA INFILE 函数中使用?

【问题讨论】:

  • 不使用普通文件有什么原因吗?
  • 您不能使用 PHP 分配一部分内存,然后让 MySQL 使用 LOAD DATA INFILE 读取它。如果您达到该级别的性能,您可以做什么 - 创建一个 ram 驱动器并将 csv 文件保存在那里。然后让 MySQL 读取它。
  • @Andy 反思我认为我的问题是当我在行中调用函数时我可以很好地下载数据:$results = CallAPI("GET", $url, $data = false) ,但我无法对变量 $results 中的后续数据做任何事情。我只是不知道如何将 $results 保存为 csv 文件。
  • 如 tempnam() 示例所示,请参阅更新后的答案。

标签: php mysql csv


【解决方案1】:

MySQL 不能直接从 PHP 的内存中读取。您需要使用tempnam() 创建一个外部文件。然后 MySQL 可以读取该文件。您还可以创建一个临时文件并找出this question 中提到的文件名。

tempnam() 的示例显示了如何写入该文件:

<?php
$tmpfname = tempnam("/tmp", "FOO");

$handle = fopen($tmpfname, "w");
fwrite($handle, $results);
fclose($handle);

// do something

unlink($tmpfname);

这会将$results 的内容存储到一个名为$tmpfname 的文件中,您可以使用LOAD DATA INFILE $tmpfname 将其存储在mysql 中。

如 cmets 中所述,如果性能存在问题,您可以创建一个 ram 驱动器来存储该文件。

【讨论】:

    猜你喜欢
    • 2013-01-03
    • 1970-01-01
    • 2021-04-16
    • 2015-11-12
    • 2014-10-07
    • 2021-03-06
    • 2012-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多