Мощный многопоточный FTP-UPLOADER.

Статус
В этой теме нельзя размещать новые ответы.

ewg777

Мой дом здесь!
Регистрация
6 Авг 2007
Сообщения
764
Реакции
334
Необходим мощный многопоточный FTP-UPLOADER на PHP.

Пример простейшей фукции upload
PHP:
function do_upload($dir = 'upload')
{   
   global $conn_id, $ftp_root, $transfer_mode, $local_dir;
   $ftp_dir = preg_replace('/^'.$local_dir.'\/?/', '', $dir);
   if ($ftp_dir != '')
      echo 'Папка '. $ftp_dir . ((ftp_mkdir($conn_id, $ftp_root . $ftp_dir)) ? ' создана' : ' не создана').'<br />';
   $filelist = glob(($dir!='') ? $dir.'/*' : '*');
   if ($filelist == array())
      return 0;
   foreach ($filelist as $file)
      {
      if (is_file($file))
         {
         $transfer_mode = (preg_match('/\.(gif|jpg|png)$/', $file)) ? FTP_BINARY : FTP_ASCII;
         echo 'Файл ' . $file . ((ftp_put($conn_id, $ftp_root . preg_replace('/^'.$local_dir.'\//', '', $file), $file, $transfer_mode)) ? ' загружен' : ' не загружен').'<br />';
         }
      else    
         do_upload($file);
      }
   return 0;   
}

$conn_id = ftp_connect($ftp_server);
$login_result = ftp_login($conn_id, $ftp_login, $ftp_password);
if (!$conn_id || !$login_result)
   exit("Не удалось установить соединение с FTP сервером!\n Попытка подключения к серверу $ftp_server!");
else
   echo "Установлено соединение с FTP сервером $ftp_server<br>";
do_upload($local_dir);
ftp_close($conn_id);

Заранее спасибо.
 
Многопоточность в пхп- оч больной вопрос;)
Я недавно, с месяц назад, как раз писал многопоточный аплоад, используя курл.
 
Многопоточность в пхп- оч больной вопрос;)
Я недавно, с месяц назад, как раз писал многопоточный аплоад, используя курл.
*** скрытое содержание ***
Скрипт кончено не плохой, но ищу что-то более универсальное, без курл. ;)
 
Тогда можно заюзать сокеты. Вот класс, одновременно открывает несколько сокетов
PHP:
<? 
class HttpQueue 
{ 
    /** 
     * An array of URLs 
     * 
     * @access  private 
     * @var     array 
     */ 
    private $_urls = array();  

    /** 
     * An array of server sockets 
     * 
     * @access  private 
     * @var     array 
     */ 
    private $_sockets = array();  

    /** 
     * An array of server responses 
     * 
     * @access  private 
     * @var     array 
     */ 
    private $_response = array();  

    /** 
     * Socket timeout 
     * 
     * @access  private 
     * @var     integer 
     */ 
    private $_timeout = 30;  

    /** 
     * An array of sockets which can be received 
     * 
     * @access  private 
     * @var     array 
     */ 
    private $_read = array();  

    /** 
     * An array of sockets which can be sended 
     * 
     * @access  private 
     * @var     array 
     */ 
    private $_write = array();  

    /** 
     * Adds an URL into a tasklist 
     * 
     * @access  public 
     * @param   string  $method 
     * @param   string  $url 
     * @return  void 
     */ 
    public function add($method, $url) 
    { 
        $this->_urls[] = array(strtoupper($method), $this->_parseUrl($url)); 
    }  

    /** 
     * Parses requested URL and checks for all URL parts 
     * 
     * @access  private 
     * @param   string   $url 
     * @return  array 
     */ 
    private function _parseUrl($url) 
    { 
        $parts = parse_url($url); 
        $parts['port'] = array_key_exists(’port’, $parts) ? $parts['port'] : 80; 
        $parts['sock'] = sprintf(’%s:%s’, $parts['host'], $parts['port']); 
        $parts['request'] = sprintf(’%s?%s’, $parts['path'], $parts['query']); 
        return $parts; 
    }  

    /** 
     * Starts fetch process 
     * 
     * @access  public 
     * @param   void 
     * @return  array 
     */ 
    public function fetch() 
    { 
        $this->_create(); 
        $this->_process(); 
        return $this->toArray(); 
    }  

    /** 
     * Sets socket timeout (in seconds) 
     * 
     * @access  public 
     * @param   integer  $timeout 
     * @return  void 
     */ 
    public function setTimeout($timeout) 
    { 
        $this->_timeout = $timeout; 
    }  

    /** 
     * Returns array of server responses 
     * 
     * @access  public 
     * @param   void 
     * @return  array 
     */ 
    public function toArray() 
    { 
        return $this->_response; 
    }  

    /** 
     * Creates socket conenctions with hosts given in URL 
     * 
     * @access  private 
     * @param   void 
     * @return  void 
     */ 
    private function _create() 
    { 
        foreach ($this->_urls as $id => $connect) { 
            if ($socket = @stream_socket_client($connect[1]['sock'], $errno, 
                $errstr, $this->_timeout, 
                STREAM_CLIENT_ASYNC_CONNECT|STREAM_CLIENT_CONNECT)  ) { 
                $this->_sockets[$id] = $socket; 
                $this->_response[$id]  = ‘processing’; 
                continue; 
            }  

            $this->_response[$id] = “failed, $errno $errstr”; 
        } 
    }  

    /** 
     * Process opened sockets 
     * 
     * @access  private 
     * @param   void 
     * @return  void 
     */ 
    private function _process() 
    { 
        while (count($this->_sockets)) { 
            $this->_read  = $this->_sockets; 
            $this->_write = $this->_sockets;  

            $select = stream_select($this->_read, $this->_write, $e = null, 
                                    $this->_timeout);  

            if ($select > 0) { 
                $this->_read(); 
                $this->_write(); 
            }  

            else { 
                foreach ($this->_sockets as $id => $s) { 
                    $this->_response[$id] = ‘Timed out’; 
                }  

                break; 
            } 
        } 
    }  

    /** 
     * Receives data from readable socket 
     * 
     * @access  private 
     * @param   void 
     * @return  void 
     */ 
    private function _read() 
    { 
        foreach ($this->_read as $fp) { 
            $id = array_search($fp, $this->_sockets); 
            $data = fread($fp, 8192);  

            if (strlen($data) == 0) { 
                if ($this->_response[$id] == ‘processing’) { 
                    $this->_response[$id] = ‘failed to connect’; 
                }  

                fclose($fp); 
                unset($this->_sockets[$id]); 
            }  

            else { 
                $this->_response[$id].= $data; 
            } 
        } 
    }  

    /** 
     * Sends HTTP request into writeable socket 
     * 
     * @access  private 
     * @param   void 
     * @return  void 
     */ 
    private function _write() 
    { 
        foreach ($this->_write as $fp) { 
            $id = array_search($fp, $this->_sockets); 
            $method  = $this->_urls[$id][0]; 
            $request = $this->_urls[$id][1]['request']; 
            $host    = $this->_urls[$id][1]['host'];  

            fputs($fp, “$method $request HTTP/1.0rn”); 
            fputs($fp, “Host: $hostrnrn”);  

            $this->_response[$id] = ”; 
        } 
    } 
} 
?>
А вообще на php многопоточности нет, есть только симуляция.
 
  • Заблокирован
  • #5
а можно комментарии к скирпту с курл, заранее спасибо
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху