/**
  * 
  * 针对一个服务器,调用Rsync将项目发布到线上,然后回写Server的版本和更新结果
  * @link http://www.cnblogs.com/mchina/p/2829944.html Rsync的配置
  */
 private function _runRsync($task)
 {
     $current_dir = getcwd();
     $server = \Server::find($task->server_id);
     $pj_dir = \Project::getTempDir($server->project_id);
     chdir($pj_dir);
     $excludes = '';
     $exclude_files = explode("\n", $server->project->ignore_files);
     foreach ($exclude_files as $_file) {
         $_file = trim($_file);
         if ($_file) {
             $excludes .= ' --exclude ' . escapeshellarg($_file);
         }
     }
     $rsync_cmd = sprintf("rsync -azc --delete %s . %s::%s", $excludes, $server->ip, $server->rsync_name);
     file_put_contents(app_path() . "/storage/rsync.log", $rsync_cmd . "\n", FILE_APPEND);
     exec($rsync_cmd, $output, $return_var);
     if ($return_var == 0) {
         $server->current_version = $this->get_dir_version('.');
         $server->save();
     }
     chdir($current_dir);
     return array('result' => true, 'output' => implode("\n", $output) . " code {$return_var}");
 }