| Доброго времени суток. Есть необходимость написать скрипт, который подключается к серверу по ftp, использую функцию fsockopen() и скачивает первые и последние 64 байта файла. С маленькими файлами все работает прекрасно, а с большими выясняется, что файл скачивается целиком и скрипт зависает естественно.
<?php
// Открытие серверного сокета для передачи команд 21 порт
$sock1 = fsockopen("***************", "21");
if (!$sock1) echo 'socket error';
// Вывод отвтета сервера
echo $result = fgets($sock1);
// Аутетнификация на сервере
fputs($sock1, "USER ******\r\n");
echo $result = "<br>USER *******<br>";
// Запись результата в массив
echo $result = fgets($sock1);
fputs($sock1, "PASS ********\r\n");
echo $result = "<br>PASS ********<br>";
echo $result = fgets($sock1);
// Задание кодировки соединения
fputs($sock1, "OPTS UTF8 ON\r\n");
echo $result = '<br>OPTS UTF8 ON<br>';
echo $result = fgets($sock1);
// Задание типа соединения
fputs($sock1, "TYPE I\r\n");
echo $result = '<br>TYPE I<br>';
echo $result = fgets($sock1).'<br>';
// Вход в пассивный режим
fputs($sock1, "PASV\r\n");
$result = fgets($sock1);
echo $result.'<br>';
// Выделение порта
list($tmp1,
$tmp2,
$tmp3,
$tmp4,
$port1,
$port2) = explode(",", $result);
// Расчет порта для клиентского подлкючения
$port = $port1*256 + $port2; echo $port.'<br>';
// Открытие сокета для передачи данных
$data_sock = fsockopen("*************", $port, $errno, $errstr, 10);
if (!$data_sock) {echo $errno.' '.$errstr;}
// Скачивание первых 64кб
fputs($sock1, "RETR /scaner/test/test.tar.gz\r\n"); // вероятно проблема вот здесь. Происходит скачивание всего файла целиком.
echo $result = fgets($sock1).'<br>'; // Так же даже при работе с мелкими файлами скрипт зависает если убрать один из выводов
echo $result = fgets($sock1).'<br>'; // результата, то есть удалить одну из этих строк.
$first = fread($data_sock, 63); echo $result.'<br>';
echo $first.'<br>';
// Вход в пассивный режим
fputs($sock1, "PASV\r\n");
$result = fgets($sock1);
echo $result.'<br>';
// Выделение порта
list($tmp1,
$tmp2,
$tmp3,
$tmp4,
$port1,
$port2) = explode(",", $result);
// Расчет порта для клиентского подлкючения
$port = $port1*256 + $port2; echo $port.'<br>';
// Открытие сокета для передачи данных
$data_sock = fsockopen("**************", $port, $errno, $errstr, 10);
if (!$data_sock) {echo $errno.' '.$errstr;}
// Вычисление точки начала загрузки
$point = 1117 - 64;
echo "<br>".$point."<br>";
// Установка точки начала загрузки
fputs($sock1, "REST $point\r\n");
$result = fgets($sock1); echo $result.'<br>';
// Начало загрузки
fputs($sock1, "RETR /scaner/test/test.tar.gz\r\n");
$result = fgets($sock1);echo $result.'<br>';
$result = fgets($sock1);echo $result.'<br>';
$last = fread($data_sock, 63);echo $last.'<br>';
?>
|
Вывод на экране выгдядит следующим образом
220 ProFTPD Server
USER
331 Please specify the password.
PASS
230 Login successful.
OPTS UTF8 ON
200 Always in UTF8 mode.
TYPE I
200 Switching to Binary mode.
227 Entering Passive Mode (0,0,0,0,82,45). // нули из-за того, что код и скачиваемый файл лежат на одном сервере, но на разных
//аккаунтах.
21037 // вывод порта для подключения
150 Opening BINARY mode data connection for /scaner/test/test.tar.gz (1117 bytes).
226 Transfer complete.
226 Transfer complete.
�4O���v�8������F7[֏>K+,|@�E�:�}����a�IHZbv7�ŌdI�an
227 Entering Passive Mode (0,0,0,0,131,14).
33550
1053
350 Restart position accepted (1053).
150 Opening BINARY mode data connection for /scaner/test/test.tar.gz (1117 bytes).
226 Transfer complete.
� 4�^;P����)c�:; p��q� � � � � � � � �� E���P
|
К ограничить размер загрузки?? | |