Tôi đang cố gắng sử dụng một máy chủ để tải nội dung lên máy chủ khác qua FTP.
"Tôi sẽ không mở kết nối tới 172.xxx.xxx.xxx (chỉ tới 54.xxx.xxx.xxx)" thậm chí còn không liên quan vì tôi chưa kết nối với máy chủ đó. Đó là địa chỉ IP của máy chủ lưu trữ tập lệnh. Nhưng đó không phải là máy chủ được truy cập qua FTP.
$conn_id = ftp_connect('50.xxx.xxx.xxx');
ftp_pasv($conn_id, true);
$login_result = ftp_login($conn_id, 'người dùng', 'vượt qua');
$file = "http://example.com/filelocation.swf";
if (ftp_put($conn_id, "test.swf", $file, FTP_BINARY)) {
echo 'Tệp đã tải lên';
}
khác {
echo 'Có vấn đề khi tải lên';
}
ftp_put() Tôi sẽ không mở kết nối tới 172.xxx.xxx.xxx (chỉ với 54.xxx.xxx.xxx)
Địa chỉ IP trong lỗi này không đến được máy chủ mà tôi đang cố gắng kết nối. ftp_login
Đã kết nối, không có vấn đề gì. (Tôi thậm chí còn không muốn nó kết nối với những địa chỉ IP đó, vậy tại sao nó lại nghĩ như vậy?)
我可以使用 ftp_mkdir
Thêm một thư mục trên máy chủ. Tuy nhiên, khi tôi sử dụng ftp_put
, nó báo lỗi này.
Thông báo lỗi thực sự khá có liên quan.
điều này đúng CẢNG
Phản hồi lỗi Pure-FTPd đối với lệnh khi máy khách yêu cầu máy chủ mở kết nối dữ liệu bằng địa chỉ IP khác với máy khách (như máy chủ nhìn thấy). Vì vậy, đây là thông báo lỗi từ xa do máy chủ gửi chứ không phải thông báo lỗi cục bộ do PHP tạo ra.
Sự cố thường xảy ra do máy khách chỉ biết địa chỉ IP cục bộ của mình chứ không biết địa chỉ IP bên ngoài.
Bây giờ, vấn đề là khi bạn yêu cầu PHP sử dụng chế độ thụ động (ftp_pasv
) khi kết nối, tại sao PHP lại sử dụng CẢNG
.
Điều này rõ ràng là bởi vì trước khi bạn đăng nhập, bạn đã gọi ftp_pasv
.
Vì vậy máy chủ từ chối PASV
Gọi:
530 Bạn chưa đăng nhập
Thật không may, PHP không truyền tải thông điệp từ PASV
Thông báo lỗi cho cuộc gọi. Nó sẽ âm thầm quay trở lại chế độ sự kiện mặc định. Bạn có thể biết rằng cuộc gọi không thành công dựa trên giá trị trả về của nó (mà bạn không kiểm tra).
Chỉ cần thay đổi ftp_pasv
Cuộc gọi chuyển đến ftp_login
之后。
$conn_id = ftp_connect('50.xx.xx.xx');
ftp_login($conn_id, 'người dùng', 'vượt qua');
ftp_pasv($conn_id, true);
The documentationHãy làm rõ:
Xin lưu ý rằng ftp_pasv() chỉ có thể được gọi sau khi đăng nhập thành công, nếu không nó sẽ thất bại.
Tất nhiên bạn nên kiểm tra lỗi tốt hơn.
Đối với các câu hỏi tương tự (chỉ dành cho ProFTPd), hãy xem:
PHP ftp_put trả về "Không thể xây dựng kết nối dữ liệu: Kết nối bị từ chối"
Tôi là một lập trình viên xuất sắc, rất giỏi!