@aterentyev

Как правильно загружать файлы по FTP через PHP?

В PHP есть много функций для работы с FTP php.net/manual/ru/book.ftp.php но при их использовании у меня возникает проблема такого рода: если скрипт загружает файл на сервер и тут же обращается к нему через HTTP, то выдается 404 ошибка, то есть файл как бы не загружен. Однако если добавить sleep() после загрузки, то все проходит успешно.

Примерный код:
// загружаем файл на фтп
$ftp = new Ftp($server, $user, $password);
$ftp->uploadFile($fileName);
$ftp->close();

// заснем чтобы подождать окончания работы фтп
sleep(10);

// вызываем файл GET запросом
$culr = new Curl();
$result = $curl->get('http://somesite.ru/' . $fileName);


Этот код рабочий, но если убрать sleep() то он перестает работать, $curl отдает 404 ошибку, в чем может быть проблема?

Update: Иногда sleep() в 10 секунд не помогает, даже при такой задержке возвращается ошибка 404.
  • Вопрос задан
  • 7382 просмотра
Пригласить эксперта
Ответы на вопрос 3
toxa82
@toxa82
В php есть асинхронная загрузка файлов по ftp, может в классе Ftp у вас она используется и получается, что вы пытаетесь запустить файла раньше, чем завершилась загрузка.
Ответ написан
Комментировать
sergoslav_0
@sergoslav_0
PHP / Magento / Laravel
Попробуйте так:
$file = 'somefile.php';
$remote_file = 'somefile.php';

// установка соединения
$conn_id = ftp_connect($ftp_server);

// проверка имени пользователя и пароля
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);

// загрузка файла 
if (ftp_put($conn_id, $remote_file, $file, FTP_ASCII)) {
 echo "$file успешно загружен на сервер\n";
} else {
 echo "Не удалось загрузить $file на сервер\n";
}

// закрытие соединения
ftp_close($conn_id);

// вызываем файл GET запросом
...
Ответ написан
Комментировать
Alexufo
@Alexufo
противоречивый, сложный, весь компьютерный.
Запрос происходит раньше, чем удаленный сервер успевает обнаружить наличие нового файла.
Не понятно зачем заливать и сразу закачивать обратно?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы