php - PHP ftp_put 随机失败
问题描述
在将我们的网站移动到新主机时,我们从 PHP5(我认为)转到了 PHP7。我们还首次将 SSL 添加到该站点。自从移动站点以来,将图像文件复制到 FTP 的功能一直随机失败。
在做了一些研究之后,我了解到没有办法获得更详细的错误消息“ftp_put has failed”。
$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() 给我这个:
Array (
[type] => 2
[message] => ftp_put(): Type set to I
[file] => path/to/file. php
[行] => 51
)
解决方案
任何网络通信都可能失败。
上传大量文件而不先通过 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);
}
}
}
推荐阅读
- javascript - 有没有办法改变按键上按钮的css?
- python - 如何使用 Python 中已定义函数的打印语句
- stripe-payments - 使用 Stripe Billing API 自动生成付款和计划
- c++ - 给定岛的外围标记其在矩阵中的内部(算法)
- javascript - 更新 Mongo DB 中的嵌套数组元素值
- linux - 在EC2上运行大数据集,担心存储
- java - 如果我使用 @Produces(MediaType.APPLICATION_XML) 在 Jersey Web 应用程序中面临 NullPointerException
- sql - 如何根据日期计算查询中的总数?
- java - 如果需要子类型引用,如何处理基类的集合,而不保存两次?
- elasticsearch - 如何在我的文档中在 elasticsearch 中创建复合主键