Я сталкиваюсь с проблемой, и я не совсем уверен, что это правильный способ сделать это. Мне нужно скопировать файл с удаленного сервера на мой сервер с помощью php.
Я использую следующий скрипт:
public function download($file_source, $file_target) {
$rh = fopen($file_source, 'rb');
$wh = fopen($file_target, 'w+b');
if (!$rh || !$wh) {
return false;
}
while (!feof($rh)) {
if (fwrite($wh, fread($rh, 4096)) === FALSE) {
return false;
}
echo ' ';
flush();
}
fclose($rh);
fclose($wh);
return true;
}
но в итоге размер файла остается равным 0.
РЕДАКТИРОВАТЬ: Я обновляю свой вопрос, потому что есть еще некоторые вещи, которые я не понял:
Про фред я использовал 2048мб. Но это не сработало.
Я нашел скрипт выше, который использует 4096mb.
Мой вопрос: Как определить, какой объем памяти (?) Использовать, чтобы не загружать файл в любое время? Потому что этот работает на определенной машине (выделенной), но будет ли он на общем хосте, если я не смогу изменить php.ini?
еще раз спасибо
filesize()
ожидает имя файла / путь. Вы передаете файловый дескриптор, что означает, что fileize будет FAIL и вернет логическое значение false.
Затем вы используете это ложное значение в качестве аргумента размера для своего фреда, который переводится в целое число 0. Поэтому, по сути, вы сидите и говорите php о чтении файла, 0 байт за раз.
В любом случае вы не можете надежно получить размер удаленного файла, поэтому просто перечитайте некоторое фиксированное число байтов, например 2048, за один раз.
while(!feof($handle)) {
$contents = fread($handle, 2048);
fwrite($f, $contents);
}
и если этот файл не слишком большой и / или ваш PHP может с этим справиться:
file_put_contents('local.mp4', file_get_contents('http://whatever/foo.mp4'));
Других решений пока нет …