Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: ftp, загрузка частей файла через сокеты
 
 автор: aievengo   (21.02.2012 в 16:53)   письмо автору
 
 

Доброго времени суток. Есть необходимость написать скрипт, который подключается к серверу по 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$errstr10);
  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_sock63); 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$errstr10);
  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_sock63);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. 

&#65533;4O&#65533;&#65533;&#65533;v&#65533;8&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;F7[&#1423;>K+,|@&#65533;E&#65533;:&#65533;}&#65533;&#65533;&#65533;&#65533;a&#65533;IHZbv7&#65533;&#332;dI&#65533;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. 
&#65533; 4&#65533;^;P&#65533;&#65533;&#65533;&#65533;)c&#65533;:; p&#65533;&#65533;q&#65533; &#65533; &#65533; &#65533; &#65533; &#65533; &#65533; &#65533; &#65533;&#65533;    E&#65533;&#65533;&#65533;P

К ограничить размер загрузки??

  Ответить  
 
 автор: aievengo   (24.02.2012 в 13:55)   письмо автору
 
   для: aievengo   (21.02.2012 в 16:53)
 

up

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования