我有一个PHP脚本,它正在读取远程CSV文件,并根据CSV文件的内容将产品添加到数据库中。目前大约有2800行产品,但该脚本在第1388行时停止。
我使用的代码如下:
那确实导致了更多的行被解析,但数据却是不正确的,即图像列变成了描述列等。我认为这与添加\r作为行结尾有关。我尝试了\n,但没有成功。最后,我也在ini中将auto_detect_line_endings设置为true。
有人能提出我的数据被截断的原因吗?
谢谢, 西蒙
编辑
我注意到了一些有趣的事情。我在上面的代码中循环遍历每一行都有一个MySQL插入。现在,我的数据库中的最后一条记录是CSV文件中的第一行,这是否意味着文件是从最后一行向上解析的?
这些似乎是在或接近断点的行:
我使用的代码如下:
while(($data = fgetcsv($fopen, 0, ",")) !== false):
//stuff is done here...
endwhile;
我已将PHP内存限制设置为64M,甚至尝试了128M。我还将max_execution_time设置为60分钟。我还尝试按照以下方式更改代码:
while(($data = fgetcsv($fopen, 1000, ",", '\r')) !== false):
//stuff is done here...
endwhile;
那确实导致了更多的行被解析,但数据却是不正确的,即图像列变成了描述列等。我认为这与添加\r作为行结尾有关。我尝试了\n,但没有成功。最后,我也在ini中将auto_detect_line_endings设置为true。
有人能提出我的数据被截断的原因吗?
谢谢, 西蒙
编辑
我注意到了一些有趣的事情。我在上面的代码中循环遍历每一行都有一个MySQL插入。现在,我的数据库中的最后一条记录是CSV文件中的第一行,这是否意味着文件是从最后一行向上解析的?
这些似乎是在或接近断点的行:
W-3066, I Love Love Cheap And Chic, Moschino, 3.4 oz,EDT Spray,Women,,"Introduced by the design house of Moschino, I love love has a blend of grapefruit, orange, lemon, red currant, tea rose, cinnamon leaves, musk, cedar and tonka wood. It is recommended for daytime wear.",http://www.perfume-worldwide.com/products/Women/Final/W-3066large.jpg,0,0,0,8011003991457
W-3070, Adidas Floral Dream, Adidas, 1.7 oz,EDT Spray,Women,,"Introduced in 2008, the notes are bergamot, lily, rose, tonka bean and vanilla.",http://www.perfume-worldwide.com/products/Women/Final/W-3070large.jpg,0,0,0,3412244310024
W-3071, Adidas Fruity Rhythm, Adidas, 1.7 oz,EDT Spray,Women,,"Introduced in 2008, the notes are black currant, raspberry, cyclamen, freesia and musk.",http://www.perfume-worldwide.com/products/Women/Final/W-3071large.jpg,0,0,0,3412244510004
解决方案
事实证明,将文件复制到我的服务器上并从副本中进行操作效果更好。我遵循的步骤如下:
- 使用
file_get_contents()
函数读取远程文件内容 - 然后使用
iconv()
函数将数据重新编码为UTF-8格式 - 使用
fopen()
、fwrite()
和fclose()
函数创建一个临时文件,文件内容是上面编码后的数据 - 使用
chmod()
函数将该文件的权限设置为0750 - 然后将
fgetcsv()
函数应用于我的临时文件 - 完成所有需要完成的操作
- 使用
unlink()
函数删除临时文件
这样就解决了问题。因此,我怀疑问题的一半实际上是远程服务器超时,另一半是编码问题。
感谢大家给予的正确指引。