将网站移至新主机时,我们从PHP5(我认为)改为了PHP7。我们还首次将SSL添加到该站点。自从移动站点以来,将图像文件复制到FTP的功能一直随机失败。
进行了一些研究之后,我知道没有办法获得更详细的错误信息,“ ftp_put失败”。
$dir = 'path/to/folder';
$a = scandir($dir);
$ftp_server = "ftp.server.com";
$ftp_conn = ftp_connect($ftp_server);
$ftp_username = 'myuser';
$ftp_userpass = 'mypass';
$login = ftp_login($ftp_conn, $ftp_username, $ftp_userpass);
ftp_pasv($ftp_conn, true);
foreach ($a as $value) {
if(strlen($value) > 4){
$file = $dir.$value;
$name = $value;
if (ftp_put($ftp_conn, $name, $file, FTP_BINARY)){
echo "<br><br><span style='color: green'>Successfully uploaded $file.</span><br><br>";
}
else{
echo "<br><br><span style='color: green'>Error uploading $file.</span><br><br>";
}
}
}
以上代码的输出为:
已成功上传../../img/bil/AAA123/AAA123-1.jpg。
已成功上传../../img/bil/AAA123/AAA123-2.jpg。
成功上传../../img/bil/AAA123/AAA123-3.jpg。
上传../../img/bil/AAA123/AAA123-4.jpg时出错。
上传../../img/bil/AAA123/AAA123-5.jpg时出错。
已成功上传../../img/bil/AAA123/AAA123-6.jpg。
上传../../img/bil/AAA123/AAA123-7.jpg错误。
已成功上传../../img/bil/AAA123/AAA123-8.jpg。
此输出不同,再次运行将成功上传其他图像,而失败。
我尝试剥离代码,删除scandir和foreach部分,并使用指向一个图像文件的直接路径作为$ file,结果相同。
我不知道有什么问题。我怀疑迁移到PHP7可能是SSL的问题,因为这一切始于那时。无法获得详细的错误消息,为什么ftp_put失败使我完全陷入困境。
我有什么办法找出错误之处吗?
编辑:
添加error_reporting(-1)并打印出error_get_last()给了我这个:
数组(
[类型] => 2
[消息] => ftp_put():类型设置为I
[file] => path / to / file.php
[line] => 51
)
答案 0 :(得分:0)
任何网络通信都可能失败。
上传大量文件而不先通过FTP将其压缩,是确保某些上传失败的好方法。如果您不想将它们压缩到单个请求中,那么一个更好的选择是重试失败的响应,在重试之间添加延迟,但不要造成无限循环。重试3次,如果仍然失败,则说明您的问题比较小的网络问题或FTP服务器错误大得多,最好跳过该文件并尝试下一个。另外,不要忘记关闭您打开的任何连接。
$dir = 'path/to/folder';
$a = scandir($dir);
foreach ($a as $value) {
if(strlen($value) > 4){
for($retry = 0; $retry < 3; $retry++) {
$ftp_server = "ftp.server.com";
$ftp_conn = ftp_connect($ftp_server);
$ftp_username = 'myuser';
$ftp_userpass = 'mypass';
$login = ftp_login($ftp_conn, $ftp_username, $ftp_userpass);
ftp_pasv($ftp_conn, true);
$file = $dir.$value;
$name = $value;
if (ftp_put($ftp_conn, $name, $file, FTP_BINARY)){
echo "<br><br><span style='color: green'>Successfully uploaded $file.</span><br><br>";
break;
} else {
if ($retry < 2) {
echo "<br><br><span style='color: green'>Error uploading $file Will retry....</span><br><br>";
sleep(2);
} else {
echo "<br><br><span style='color: green'>Error uploading $file.</span><br><br>";
}
}
ftp_close($ftp_conn);
}
}
}