同时在多个FTP上进行数据操作

时间:2015-09-16 18:54:53

标签: php ftp

让我先告诉你代码,以便你能理解我在说什么:

foreach($video_ftps as $video_ftp) {
  $ftp = new FtpClient($video_ftp[0]);
  $ftp->set_writing_destination($video_ftp[1]);
  if($ftp) {

    if($ftp->create_new_dir('archive'))
      $utils->log("Created directory '/archive' on source.");

    $tmp_ftp = new FtpClient($video_ftp[1]);
    $tmp_ftp->create_new_dir('video');
    $tmp_ftp->create_new_dir('video/'.$video_ftp[2]);
    $tmp_ftp->close();

    // Check if new files arrived on ftp
    if($ftp->has_new_files())
    {
      foreach($ftp->fetch_new_file() as $file) {
        $checksum_source = "";
        $checksum_dest = "";
        if($ftp->copy(MODE_SAME_FTP, $file, 'archive'))
          $checksum_source = sha1_file($video_ftp[0].'/'.$file);
          $utils->log("Copied {$file} to {$ftp->get_writing_destination()}archive/.");

        $fileExtension = explode(".", $file)[1];
        if($fileExtension == "mp4") {
          if($ftp->rename($file , $video_ftp[1].'video/'.$video_ftp[2].'/'.$file))
            $checksum_dest = sha1_file($video_ftp[1].'video/'.$video_ftp[2].'/'.$file);
            if($checksum_source != $checksum_dest) {
              $tmp_ftp = new FtpClient($video_ftp[1]);
              $tmp_ftp->copy(MODE_DIFF_FTP, 'video/'.$video_ftp[2].'/'.$file, $video_ftp[0].'/'.$file);
              $tmp_ftp->delete('video/'.$video_ftp[2].'/'.$file);
              $tmp_ftp->close();
            } else {
              $utils->log("Moved {$file} file to {$ftp->get_writing_destination()}{$video_ftp[1]}'video/'{$video_ftp[2]}/.");
            }
        }

      }
    }

    $ftp->close();
  }
}

注意:FTPClient类与所有ftp_ *函数的作用相同。该类只删除前缀并使其面向对象。

因此。只要留下循环中发生的事情。当它正在操纵FTP并且正在从FTP和不同的FTP中删除,移动和复制文件时,可以使用它。

您需要了解的一件事是循环。我在$video_ftps中有ftp连接字符串,我按顺序对每个字符串进行操作并对其进行操作。

我想要做的是每个不同的FTP应该在不同的线程中,并且应该与其他FTP同时操作。

我读过PHP中的线程但无法找到或理解与之相关的任何内容。你能告诉我如何将这个基于循环的东西转换成基于线程的东西。

更新1:

我创建了一个单独的ftp操作部分文件:

<?php

require 'FtpClient.php';
require 'Utils.php';

$video_ftp = array($argv[0], $argv[1], $argv[2]);

$ftp = new FtpClient($video_ftp[0]);
$ftp->set_writing_destination($video_ftp[1]);
if($ftp) {

  if($ftp->create_new_dir('archive'))
    $utils->log("Created directory '/archive' on source.");

  $tmp_ftp = new FtpClient($video_ftp[1]);
  $tmp_ftp->create_new_dir('video');
  $tmp_ftp->create_new_dir('video/'.$video_ftp[2]);
  $tmp_ftp->close();

  // Check if new files arrived on ftp
  if($ftp->has_new_files())
  {
    foreach($ftp->fetch_new_file() as $file) {
      $checksum_source = "";
      $checksum_dest = "";
      if($ftp->copy(MODE_SAME_FTP, $file, 'archive'))
        $checksum_source = sha1_file($video_ftp[0].'/'.$file);
        $utils->log("Copied {$file} to {$ftp->get_writing_destination()}archive/.");

      $fileExtension = explode(".", $file)[1];
      if($fileExtension == "mp4") {
        if($ftp->rename($file , $video_ftp[1].'video/'.$video_ftp[2].'/'.$file))
          $checksum_dest = sha1_file($video_ftp[1].'video/'.$video_ftp[2].'/'.$file);
          if($checksum_source != $checksum_dest) {
            $tmp_ftp = new FtpClient($video_ftp[1]);
            $tmp_ftp->copy(MODE_DIFF_FTP, 'video/'.$video_ftp[2].'/'.$file, $video_ftp[0].'/'.$file);
            $tmp_ftp->delete('video/'.$video_ftp[2].'/'.$file);
            $tmp_ftp->close();
          } else {
            $utils->log("Moved {$file} file to {$ftp->get_writing_destination()}{$video_ftp[1]}'video/'{$video_ftp[2]}/.");
          }
      }

    }
  }

  $ftp->close();
}

&GT;

我更新了我之前的文件以运行此函数而不是我转移到单独文件的代码:

exec("php video_ftp_manipulator.php ". $video_ftp[0] . "" . $video_ftp[1] . "" . $video_ftp[2] . " > /dev/null &");

现在出现的问题是,当我运行文件时,现在什么也没发生。 FTP中没有任何变化。为什么会这样?

2 个答案:

答案 0 :(得分:3)

无需任何线程。

问题是,你对FTP的抽象很差,我建议你抛弃它并直接使用扩展名。

FTP扩展配备了非阻塞功能,以方便异步请求,使用它们:

这就是你应该需要的一切。

答案 1 :(得分:0)

虽然有很多方法可以通过在PHP中使用exec()或shell_exec()触发单独的子脚本,将参数传递给子脚本并将其输出发送到/ dev来实现模拟多线程,但是本质上并不执行异步请求。 / null,因此PHP在继续之前不会等待响应。 虽然可能,但它并不理想(我不推荐它),因为没有有效的方法从子脚本中获取有用的数据

可以在循环中使用exec()从shell命令触发另一个脚本。使用示例: exec("php child.php argument1 argument2 > /dev/null &");

这里我将child.php作为shell脚本运行,传递参数可能还有其他参数。我将输出发送到/ dev / null,因此php不会等待它。

在我的孩子PHP脚本中,我需要使用以下内容来获取参数字符串: $first_arg = $argv[1]; $second_arg = $argsv[2];

参数可以是ftp服务器和文件名,或者你可以添加参数来指定子脚本要采取的操作......