PHP多线程【处理文件】

后台的测试demo,实现了多线程拷贝文件,多线程上传文件至七牛
代码可能比较乱···············只是自己测试用的,特地留了一下,毕竟用Pthreads的实在太少,你要是找个资料真心不容易,用Pthreads有个坑就是
千万别和框架混着用,特别容易出问题,个人建议还是使用原生的PHP来实现最好,如果能用其他语言来实现那是最好的,PHP的多线程这一块还是比较弱的·················

以下代码 只是提供一个实现思路·····

<?php
/**
 * Created by PhpStorm.
 * User: E450
 * Date: 2017/11/16
 * Time: 11:25
 */
//require_once './vendor/autoload.php';
namespace Thread;
require 'qiniu/autoload.php';
use Qiniu\Auth;
use Qiniu\Storage\UploadManager;

class FileUp extends \Thread{

    //线程名
    protected $name;
    //文件来源
    protected $files;
    //文件目的地
    protected $to;

    public function __construct($name,$files,$to)
    {
        $this->name = $name;
        $this->files = $files;
        $this->to = $to;
    }

    public function run(){
        foreach($this->files as $v){
//            $isSuccess = copy('./file/'.$v,$this->to.$v);
            $this->qiniu($v,'/test/'.$v);
            var_dump($v);
        }
    }

    public function qiniu($key,$filePath){
            $accessKey = "xxxxxxxxx";
            $secretKey = "xxxxxxxxxxx";
            $bucket = "xxxxxxxx";
            // 初始化Auth状态
            $auth = new Auth($accessKey, $secretKey);
            $token = $auth->uploadToken($bucket);
            $upManger = new UploadManager();
            list($ret, $error) = $upManger->putFile($token, $key, $filePath);
            var_dump($ret);
    }
}


class test {

    public function doMove(){

        $path = './file';
        $file = scandir('./file');
        $files  = [];
        foreach($file as $v){
            if(is_file($path.'/'.$v)){
                $files[] = $v;
            }
        }
        $threadNum = 2;
        $avgNum = $this->avgChunk($files,$threadNum);

        $threads = [];
        for($i=0;$i<$threadNum;$i++){

            $fileup = new FileUp($i,$avgNum[$i],'./dir/');
            $threads[] = $fileup;
        }

        foreach($threads as $v){
            $v->start();
        }

        foreach($threads as $v){
            $v->join();
        }

    }


    /**
     * [平均分割数组]
     * @autor rjj
     */
    public function avgChunk($list, $num)
    {
        $temp = [];
        //判断数组
        if (!is_array($list)) {
            return false;
        }
        //判断数量是否小于列数   小于 直接返回第一列
        if (count($list) < $num) {
            return $temp[] = $list;
        }
        //向上取整
        $argv = ceil(count($list) / $num);
        //循环切片
        for ($i = 0; $i < $num; $i++) {
            $temp[$i] = array_slice($list, $argv * ($i - 1), $argv);
            //去除多余的
            if(empty($temp[$i])){
                unset($temp[$i]);
            }
        }
        return $temp;
    }
}
$test = new Test();

$test->doMove();


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值