我有一个很大的csv文件,其中包含带有电子邮件的列。我需要创建一个脚本来读取此csv文件,发送电子邮件,然后删除该行。是否可以不创建临时文件而做?如果万一我将其存储在数据库中,这将是最好的方法吗?
我的代码:
if (($handle = fopen("emails.csv", "r")) !== FALSE) {
while (($line = fgetcsv($handle, 1000, ",")) !== FALSE) {
$mail->parseTextandSendMail($line);
//Need to remove the $line
$row++;
}
fclose($handle);
谢谢
在我看来,如果您从文件的末尾而不是开头读取行,则可以正常工作。我从这里得到了一些帮助,弄清楚了如何做到这一点,并将那里的答案中的一些代码合并到了一个从文件末尾到最后一行开头的函数中。
function lineStart($file) {
$position = ftell($file);
while (fgetc($file) != "\n") {
fseek($file, --$position);
if ($position == 0) break;
}
return $position;
}
使用该功能,您可以重复读取最后一行的结尾,然后将文件截断为该行开头的文件位置所指示的长度。
$file = fopen('emails.csv', 'r+'); // open for read/write
fseek($file, -1, SEEK_END); // move to end of file
while (fstat($file)['size']) {
lineStart($file); // move to beginning of line
$line = fgetcsv($file);
$mail->parseTextandSendMail($line); // do your email thing
ftruncate($file, lineStart($file)); // truncate from beginning of line
}
fclose($file);
我不知道这是否通常是一个好主意(数据库似乎更容易处理),但是我只是想弄清楚是否有一种方法可以完成它,而且这确实可以在我的有限测试中工作。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句