后台的测试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();