FDFS.php 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649
  1. <?php
  2. /**
  3. * Created by 上海互教教育科技有限公司.
  4. * User: 刘红伟
  5. * Date: 2016/7/20
  6. * Email: 454303753@qq.com
  7. * File:FDFS.php
  8. * copy:http://wangying.sinaapp.com/archives/586
  9. */
  10. class FDFS
  11. {
  12. static $_instance; //单例
  13. private $_fdfs; //FastDFS 类对象
  14. private $tracker_host; //tracker ip_addr
  15. private $tracker_port; //tracker port
  16. private $group = null; //storage中的组名,可以为空
  17. private $tracker; //type:array 客户端连接跟踪器(tracker)返回的tracker服务端相关信息
  18. private $storage; //type:array 客户端连接存储节点(storage)返回的storage服务端相关信息
  19. private $debug = true; //错误控制false/true
  20. /*
  21. localfile 本地文件
  22. group 组名
  23. remotefile 、 masterfile 远程文件(服务器上的文件)
  24. file_id 、 masterfile_id 文件id : file_id(masterfile_id)= group/remotefile(或masterfile)
  25. $prefixname 从文件的标识
  26. file_ext 文件的后缀名,不包含点'.'
  27. meta 文件属性列表,可以包含多个键值对
  28. */
  29. /**
  30. * 构造方法
  31. */
  32. private function __construct($config)
  33. {
  34. if (!extension_loaded('fastdfs_client')){
  35. Yii::log('系统未安装FastDFS扩展','error');
  36. die('系统未安装FastDFS扩展');
  37. }
  38. foreach ($config as $key => $val){
  39. $this->$key = $val;
  40. }
  41. $this->_fdfs = new FastDFS();
  42. $this->tracker = $this->_fdfs->connect_server($this->tracker_host,$this->tracker_port);
  43. if(is_array($this->tracker) && $this->group){
  44. $this->storage = $this->_fdfs->tracker_query_storage_store($this->group, $this->tracker);
  45. if(!is_array($this->storage)){
  46. $this->halt();
  47. }
  48. }else{
  49. if(!is_array($this->tracker)) $this->halt();
  50. }
  51. }
  52. public static function getInstance($config) {
  53. if( ! (self::$_instance instanceof self) ) {
  54. self::$_instance = new self($config);
  55. }
  56. return self::$_instance;
  57. }
  58. private function __clone(){}
  59. /**文件上传**/
  60. /**
  61. * 上传文件
  62. * @param (string)$localfile
  63. 本地文件(若文件为完整文件名+后缀的形式,$file_ext可以为空)
  64. * @param (string)$group 文件组名
  65. * @param (array) $file_ext 文件的后缀名,不包含点'.'(例:'png')
  66. * @param (array) $meta
  67. 文件的附加信息,数组格式,array('hight'=>'350px');
  68. * @return Array $file_info
  69. 返回包含文件组名和文件名的数组,array('group_name'=>'ab','localfile'=>'kajdsf');
  70. */
  71. public function upload_filename($localfile, $group = null,$file_ext = null, $meta = array())
  72. {
  73. $bool = $this->check_string($localfile);
  74. if(!$bool) return false;
  75. $file_info = $this->_fdfs->storage_upload_by_filename($localfile,$file_ext,$meta,$group,$this->tracker);
  76. if($file_info){
  77. return $file_info;
  78. }else{
  79. $this->halt();
  80. }
  81. }
  82. /**
  83. * 上传文件
  84. * @param (string)$localfile 文件存放位置(若文件为完整文件名+后缀的形式,$file_ext可以为空)
  85. * @param (string)$group 文件组名
  86. * @param (array) $file_ext 文件的后缀名,不包含点'.'
  87. * @param (array) $meta 文件的附加信息,数组格式,array('hight'=>'350px','author'=>'bobo');
  88. * @return string 返回file_id(文件组名/文件名)
  89. */
  90. public function upload_filename1($localfile, $group = null,$file_ext = null, $meta = array())
  91. {
  92. $bool = $this->check_string($localfile);
  93. if(!$bool) return false;
  94. $file_id = $this->_fdfs->storage_upload_by_filename1($localfile,$file_ext,$meta,$group,$this->tracker);
  95. if($file_id){
  96. return $file_id;
  97. }else{
  98. $this->halt();
  99. }
  100. }
  101. /**
  102. * 上传从文件
  103. * @param (string)$localfile 从文件名
  104. * @param (string)$group 主文件组名
  105. * @param (string)$masterfile 主文件名
  106. * @param (string)$prefixname 从文件的标识符; 例如,主文件为abc.jpg,从文件需要大图,添加'_b',则$prefixname = '_b';
  107. * @param (string)$file_ext 从文件后缀名
  108. * @param (array)$meta 文件的附加信息,数组格式,array('hight'=>'350px','author'=>'bobo');
  109. * @return Array 返回包含文件组名和文件名的数组,array('group_name'=>'ab','localfile'=>'kajdsf');
  110. */
  111. public function upload_slave_filename($localfile, $group, $masterfile,$prefixname,$file_ext=null,$meta=array())
  112. {
  113. $bool = $this->check_string($localfile,$group,$masterfile,$prefixname);
  114. if(!$bool) return false;
  115. if(!$file_ext) $file_ext=null;
  116. $file_info = $this->_fdfs->storage_upload_slave_by_filename($localfile,$group,$masterfile,$prefixname,$file_ext,$meta,$this->tracker);
  117. if($file_info){
  118. return $file_info;
  119. }else{
  120. $this->halt();
  121. }
  122. }
  123. /**
  124. * 上传从文件
  125. * @param (string)$localfile 从文件名
  126. * @param (string)$masterfile_id 主文件file_id
  127. * @param (string)$prefixname 从文件的标识符; 例如,主文件为abc.jpg,从文件需要大图,添加'_b',则$prefixname = '_b';
  128. * @param (string)$file_ext 从文件后缀名
  129. * @param (array)$meta 文件的附加信息,数组格式,array('hight'=>'350px','author'=>'bobo');
  130. * @return Array 返回包含文件组名和文件名的数组,array('group_name'=>'ab','localfile'=>'kajdsf');
  131. */
  132. public function upload_slave_filename1($localfile,$masterfile_id,$prefixname,$file_ext=null,$meta=array())
  133. {
  134. $bool = $this->check_string($localfile,$masterfile_id,$prefixname);
  135. if(!$bool) return false;
  136. if(!$file_ext) $file_ext=null;
  137. $file_id = $this->_fdfs->storage_upload_slave_by_filename1($localfile,$masterfile_id,$prefixname,$file_ext,$meta,$this->tracker);
  138. if($file_id){
  139. return $file_id;
  140. }else{
  141. $this->halt();
  142. }
  143. }
  144. /**
  145. * 上传文件,通过文件流的方式(未测试)
  146. * @param $filebuff 文件流
  147. * @param (string)$file_ext 文件的后缀名,不包含点'.'
  148. * @param (array) $meta 文件的附加信息,数组格式,array('hight'=>'350px','author'=>'bobo');
  149. * @param (string)$group 文件组名
  150. * @return Array 返回包含文件组名和文件名的数组,array('group_name'=>'ab','filename'=>'kajdsf');
  151. */
  152. public function upload_filebuff($filebuff,$file_ext,$group = null,$meta = array())
  153. {
  154. $bool = $this->check_string($filebuff,$file_ext);
  155. if(!$bool) return false;
  156. $file_info = $this->_fdfs->storage_upload_by_filebuff($filebuff,$file_ext,$meta,$group,$this->tracker);
  157. if($file_info){
  158. return $file_info;
  159. }else{
  160. $this->halt();
  161. }
  162. }
  163. /**
  164. * 上传从文件,通过文件流的方式(未测试)
  165. * @param $filebuff 文件流
  166. * @param (string)$file_ext 文件的后缀名,不包含点'.'
  167. * @param (array) $meta 文件的附加信息,数组格式,array('hight'=>'350px','author'=>'bobo');
  168. * @param (string)$group 文件组名
  169. * @return Array 返回包含文件组名和文件名的数组,array('group_name'=>'ab','filename'=>'kajdsf');
  170. */
  171. public function upload_slave_filebuff($filebuff,$group,$masterfile,$prefix_name=null,$file_ext=null,$meta = array())
  172. {
  173. $bool = $this->check_string($filebuff,$group,$masterfile);
  174. if(!$bool) return false;
  175. $file_info = $this->_fdfs->storage_upload_slave_by_filebuff($filebuff,$group,$masterfile,$prefix_name,$file_ext,$meta,$this->tracker);
  176. if($file_info){
  177. return $file_info;
  178. }else{
  179. $this->halt();
  180. }
  181. }
  182. /**文件删除**/
  183. /**
  184. * 删除文件
  185. * @param (string)$group 文件组名
  186. * @param (string)$remotefile 文件名
  187. * @param (string)$filename 主文件名(masterfile或file_id 两种形式)
  188. * @param (string)$prefixname 扩展后缀名
  189. * @return bool 成功返回true,失败返回false;
  190. */
  191. public function delete_filename($group,$remotefile,$prefix=null,$file_ext=null)
  192. {
  193. $bool = $this->check_string($group,$remotefile);
  194. if(!$bool) return false;
  195. if ($prefix) {
  196. $remotefile = $this->get_slave_filename($remotefile,$prefix,$file_ext);
  197. }
  198. $bool = $this->_fdfs->storage_delete_file($group, $remotefile, $this->tracker);
  199. if($bool){
  200. return true;
  201. }else{
  202. $this->halt();
  203. }
  204. }
  205. /**
  206. * 删除文件
  207. * @param (string)masterfile_id 文件id
  208. * @param (string)$filename 主文件名(masterfile或file_id 两种形式)
  209. * @param (string)$prefixname 扩展后缀名
  210. * @return bool 成功返回true,失败返回false;
  211. */
  212. public function delete_filename1($masterfile_id,$prefix=null,$file_ext=null)
  213. {
  214. $bool = $this->check_string($masterfile_id);
  215. if(!$bool) return false;
  216. if ($prefix) {
  217. $masterfile_id = $this->get_slave_filename($masterfile_id,$prefix,$file_ext);
  218. }
  219. $bool = $this->_fdfs->storage_delete_file1($masterfile_id, $this->tracker);
  220. if($bool){
  221. return true;
  222. }else{
  223. $this->halt();
  224. }
  225. }
  226. /**文件下载**/
  227. /**
  228. * 下载文件到本地服务器
  229. * @param (string)$group 文件组名
  230. * @param (string)$remotefile 文件名
  231. * @param (string)$localfile 本地文件名
  232. * @param (string)$filename 主文件名(masterfile或file_id 两种形式)
  233. * @param (string)$prefixname 扩展后缀名
  234. * @param $file_offset //file start offset, default value is 0
  235. * @param $download_bytes //0 (default value) means from the file offset to the file end
  236. * @return bool 成功返回true,失败返回false
  237. */
  238. public function download_filename($group,$remotefile,$localfile,$prefix=null,$file_ext=null,$file_offset=0,$download_bytes=0){
  239. $bool = $this->check_string($group,$remotefile,$localfile);
  240. if(!$bool) return false;
  241. if ($prefix) {
  242. $remotefile = $this->get_slave_filename($remotefile,$prefix,$file_ext);
  243. }
  244. $bool = $this->_fdfs->storage_download_file_to_file($group,$remotefile,$localfile,$file_offset,$download_bytes,$this->tracker);
  245. if($bool){
  246. return true;
  247. }else{
  248. $this->halt();
  249. }
  250. }
  251. /**
  252. * 下载文件到本地服务器
  253. * @param (string)$file_id 文件id
  254. * @param (string)$localfile 本地文件名
  255. * @param (string)$filename 主文件名(masterfile或file_id 两种形式)
  256. * @param (string)$prefixname 扩展后缀名
  257. * @param $file_offset //file start offset, default value is 0
  258. * @param $download_bytes //0 (default value) means from the file offset to the file end
  259. * @return bool 成功返回true,失败返回false
  260. */
  261. public function download_filename1($file_id,$localfile,$prefix=null,$file_ext=null,$file_offset=0,$download_bytes=0)
  262. {
  263. $bool = $this->check_string($file_id,$localfile);
  264. if(!$bool) return false;
  265. if ($prefix) {
  266. $file_id = $this->get_slave_filename($file_id,$prefix,$file_ext);
  267. }
  268. $bool = $this->_fdfs->storage_download_file_to_file1($file_id, $localfile,$file_offset,$download_bytes, $this->tracker);
  269. if($bool){
  270. return true;
  271. }else{
  272. $this->halt();
  273. }
  274. }
  275. /**
  276. * 下载文件流(未测试)
  277. * @param (string)$group 文件组名
  278. * @param (string)$remotefile 文件名
  279. * @param (string)$filename 主文件名(masterfile或file_id 两种形式)
  280. * @param (string)$prefixname 扩展后缀名
  281. * @param $file_offset //file start offset, default value is 0
  282. * @param $download_bytes //0 (default value) means from the file offset to the file end
  283. * @return 成功返回文件流,失败返回false
  284. */
  285. public function download_filebuff($group,$remotefile,$file_offset=0,$download_bytes=0)
  286. {
  287. $bool = $this->check_string($group,$remotefile);
  288. if(!$bool) return false;
  289. $bool = $this->_fdfs->storage_download_file_to_buff($group,$remotefile,$file_offset,$download_bytes,$this->tracker);
  290. if($bool){
  291. return true;
  292. }else{
  293. $this->halt();
  294. }
  295. }
  296. /**辅助方法--判断文件是否存在**/
  297. /**
  298. * 判断文件是否存在
  299. * @param (string)$remotefile 文件名
  300. * @param (string)$group 文件组名
  301. * @param (string)$filename 主文件名(masterfile或file_id 两种形式)
  302. * @param (string)$prefixname 扩展后缀名
  303. * @return Bool
  304. */
  305. public function file_exist($group, $remotefile,$prefix=null,$file_ext=null)
  306. {
  307. $bool = $this->check_string($group, $remotefile);
  308. if(!$bool) return false;
  309. if ($prefix) {
  310. $remotefile = $this->get_slave_filename($remotefile,$prefix,$file_ext);
  311. }
  312. $bool = $this->_fdfs->storage_file_exist($group, $remotefile,$this->tracker);
  313. if($bool){
  314. return true;
  315. }else{
  316. $this->halt();
  317. }
  318. }
  319. /**
  320. * 判断文件是否存在
  321. * @param (string)$file_id 文件id
  322. * @param (string)$filename 主文件名(masterfile或file_id 两种形式)
  323. * @param (string)$prefixname 扩展后缀名
  324. * @return Bool
  325. */
  326. public function file_exist1($file_id,$prefix=null,$file_ext=null)
  327. {
  328. $bool = $this->check_string($file_id);
  329. if(!$bool) return false;
  330. if ($prefix) {
  331. $file_id = $this->get_slave_filename($file_id,$prefix,$file_ext);
  332. }
  333. $bool = $this->_fdfs->storage_file_exist1($file_id,$this->tracker);
  334. if($bool){
  335. return true;
  336. }else{
  337. $this->halt();
  338. }
  339. }
  340. /**辅助方法--根扩展后缀获取从文件名**/
  341. /**
  342. * 根据扩展后缀获取从文件名(masterfile或file_id 两种形式)
  343. * @param (string)$filename 主文件名(masterfile或file_id 两种形式)
  344. * @param (string)$prefixname 扩展后缀名
  345. * @param (string)$file_ext 文件后缀名(这个后缀名替换掉原有文件后缀名)
  346. * @return string
  347. */
  348. public function get_slave_filename($filename,$prefixname,$file_ext=null)
  349. {
  350. $bool = $this->check_string($filename,$prefixname);
  351. if(!$bool) return false;
  352. if(!$file_ext) $file_ext=null;
  353. $filename = $this->_fdfs->gen_slave_filename($filename,$prefixname,$file_ext);
  354. if($filename){
  355. return $filename;
  356. }else{
  357. $this->halt();
  358. }
  359. }
  360. /**辅助方法--反解析远程文件名**/
  361. /**
  362. * 反解析远程文件名(只解析主文件名)
  363. * 通过此方法可以分析文件名的组成
  364. * @param (string)$remotefile 文件名
  365. * @param (string)$group 文件组名
  366. * @return array
  367. Array ( [create_timestamp] => 1346085049 [file_size] => 1235 [source_ip_addr] => 192.168.127.6 [crc32] => -52246624 )
  368. */
  369. public function get_file_info($group, $remotefile)
  370. {
  371. $bool = $this->check_string($group, $remotefile);
  372. if(!$bool) return false;
  373. $res = $this->_fdfs->get_file_info($group, $remotefile);
  374. if($res){
  375. return $res;
  376. }else{
  377. $this->halt();
  378. }
  379. }
  380. /**
  381. * 反解析远程文件名(只解析主文件名)
  382. * 通过此方法可以分析文件名的组成
  383. * @param (string)$file_id 文件id
  384. * @return array
  385. Array ( [create_timestamp] => 1346085049 [file_size] => 1235 [source_ip_addr] => 192.168.127.6 [crc32] => -52246624 )
  386. */
  387. public function get_file_info1($file_id)
  388. {
  389. $bool = $this->check_string($file_id);
  390. if(!$bool) return false;
  391. $res = $this->_fdfs->get_file_info1($file_id);
  392. if($res){
  393. return $res;
  394. }else{
  395. $this->halt();
  396. }
  397. }
  398. /**辅助方法--文件meta操作**/
  399. /**
  400. * 设置文件meta
  401. * @param (string)$remotefile 文件名
  402. * @param (string)$group 文件组名
  403. * @param (array)$metadata meta信息
  404. * @param (string)$filename 主文件名(masterfile或file_id 两种形式)
  405. * @param (string)$prefixname 扩展后缀名
  406. * @return bool
  407. */
  408. public function set_metadata($group, $remotefile,$metadata,$prefix=null,$file_ext=null)
  409. {
  410. $bool = $this->check_string($group, $remotefile,$metadata);
  411. if(!$bool) return false;
  412. if ($prefix) {
  413. $remotefile = $this->get_slave_filename($remotefile,$prefix,$file_ext);
  414. }
  415. $bool = $this->_fdfs->storage_set_metadata($group, $remotefile,$metadata,FDFS_STORAGE_SET_METADATA_FLAG_OVERWRITE,$this->tracker);
  416. if($bool){
  417. return true;
  418. }else{
  419. $this->halt();
  420. }
  421. }
  422. /**
  423. * 设置文件meta
  424. * @param (string)$file_id 文件id
  425. * @param (array)$metadata meta信息
  426. * @param (string)$filename 主文件名(masterfile或file_id 两种形式)
  427. * @param (string)$prefixname 扩展后缀名
  428. * @return bool
  429. */
  430. public function set_metadata1($file_id,$metadata,$prefix=null,$file_ext=null)
  431. {
  432. $bool = $this->check_string($file_id,$metadata);
  433. if(!$bool) return false;
  434. if ($prefix) {
  435. $file_id = $this->get_slave_filename($file_id,$prefix,$file_ext);
  436. }
  437. $bool = $this->_fdfs->storage_set_metadata1($file_id,$metadata,FDFS_STORAGE_SET_METADATA_FLAG_MERGE,$this->tracker);
  438. if($bool){
  439. return true;
  440. }else{
  441. $this->halt();
  442. }
  443. }
  444. /**
  445. * 得到文件meta
  446. * @param (string)$remotefile 文件名
  447. * @param (string)$group 文件组名
  448. * @param (string)$filename 主文件名(masterfile或file_id 两种形式)
  449. * @param (string)$prefixname 扩展后缀名
  450. * @return array
  451. */
  452. public function get_metadata($group, $remotefile,$prefix=null,$file_ext=null)
  453. {
  454. $bool = $this->check_string($group, $remotefile);
  455. if(!$bool) return false;
  456. if ($prefix) {
  457. $remotefile = $this->get_slave_filename($remotefile,$prefix,$file_ext);
  458. }
  459. $res = $this->_fdfs->storage_get_metadata($group, $remotefile,$this->tracker);
  460. if($res){
  461. return $res;
  462. }else{
  463. $this->halt();
  464. }
  465. }
  466. /**
  467. * 得到文件meta
  468. * @param (string)$file_id 文件id
  469. * @param (string)$filename 主文件名(masterfile或file_id 两种形式)
  470. * @param (string)$prefixname 扩展后缀名
  471. * @return array
  472. */
  473. public function get_metadata1($file_id,$prefix=null,$file_ext=null)
  474. {
  475. $bool = $this->check_string($file_id);
  476. if(!$bool) return false;
  477. if ($prefix) {
  478. $file_id = $this->get_slave_filename($file_id,$prefix,$file_ext);
  479. }
  480. $res = $this->_fdfs->storage_get_metadata1($file_id,$this->tracker);
  481. if($res){
  482. return $res;
  483. }else{
  484. $this->halt();
  485. }
  486. }
  487. /**辅助方法--获取storage server信息**/
  488. /**
  489. * 获取一个$group内的所有server信息
  490. * @param (string)$group 文件组名
  491. * @return array
  492. Array ( [0] => Array ( [ip_addr] => 192.168.127.13 [port] => 23000 [sock] => -1 [store_path_index] => 0 ) [1] => Array ( [ip_addr] => 192.168.127.14 [port] => 23000 [sock] => -1 [store_path_index] => 0 ) )
  493. */
  494. public function get_storage_store_list($group)
  495. {
  496. $bool = $this->check_string($group);
  497. if(!$bool) return false;
  498. $res = $this->_fdfs->tracker_query_storage_store_list($group,$this->tracker);
  499. if($res){
  500. return $res;
  501. }else{
  502. $this->halt();
  503. }
  504. }
  505. /**
  506. * 获取一个$group内的所有server的状态信息
  507. * @param (string/null)$group 文件组名
  508. * @return array
  509. * @说明
  510. */
  511. public function get_tracker_list_groups($group)
  512. {
  513. $bool = $this->check_string($group);
  514. if(!$bool) return false;
  515. $res = $this->_fdfs->tracker_list_groups($group,$this->tracker);
  516. if($res){
  517. return $res;
  518. }else{
  519. $this->halt();
  520. }
  521. }
  522. /**
  523. * 返回当前操作到$group/$remotefile资源的storage server信息
  524. * @param (string)$remotefile 文件名
  525. * @param (string)$group 文件组名
  526. * @return array
  527. Array ( [0] => Array ( [ip_addr] => 192.168.127.6 [port] => 23000 [sock] => -1 ) )
  528. * @说明 一个group内如果存在多台storage,每台都存在'group/remotefile'相同资源,当下载或者获取数据时此方法返回的是正在操作的资源所在的storage service信息
  529. */
  530. public function get_storage_fetch($group, $remotefile)
  531. {
  532. $bool = $this->check_string($group, $remotefile);
  533. if(!$bool) return false;
  534. $res = $this->_fdfs->tracker_query_storage_fetch($group, $remotefile,$this->tracker);
  535. if($res){
  536. return $res;
  537. }else{
  538. $this->halt();
  539. }
  540. }
  541. /**
  542. * 返回当前操作到$group/$remotefile资源的storage server信息
  543. * @param (string)$file_id 文件id
  544. * @return array
  545. Array ( [0] => Array ( [ip_addr] => 192.168.127.6 [port] => 23000 [sock] => -1 ) )
  546. * @说明 一个group内如果存在多台storage,每台都存在'group/remotefile'相同资源,当下载或者获取数据时此方法返回的是正在操作的资源所在的storage service信息
  547. */
  548. public function get_storage_fetch1($file_id)
  549. {
  550. $bool = $this->check_string($file_id);
  551. if(!$bool) return false;
  552. $res = $this->_fdfs->tracker_query_storage_fetch1($file_id,$this->tracker);
  553. if($res){
  554. return $res;
  555. }else{
  556. $this->halt();
  557. }
  558. }
  559. /**
  560. * 查找有$group/$remotefile资源的所有storage server信息
  561. * @param (string)$remotefile 文件名
  562. * @param (string)$group 文件组名
  563. * @return array
  564. Array ( [0] => Array ( [ip_addr] => 192.168.127.6 [port] => 23000 [sock] => -1 ) )
  565. * @说明 一个group内如果存在多台storage,就会返回拥有上述资源的storage 数组信息
  566. */
  567. public function get_storage_list($group, $remotefile)
  568. {
  569. $bool = $this->check_string($group, $remotefile);
  570. if(!$bool) return false;
  571. $res = $this->_fdfs->tracker_query_storage_list($group, $remotefile,$this->tracker);
  572. if($res){
  573. return $res;
  574. }else{
  575. $this->halt();
  576. }
  577. }
  578. /**
  579. * 查找有$file_id资源的所有storage server信息(返回值同上例)
  580. * @param (string)$file_id 文件id
  581. * @return array
  582. Array ( [0] => Array ( [ip_addr] => 192.168.127.6 [port] => 23000 [sock] => -1 ) )
  583. * @说明 一个group内如果存在多台storage,就会返回拥有上述资源的storage 数组信息
  584. */
  585. public function get_storage_list1($file_id)
  586. {
  587. $bool = $this->check_string($file_id);
  588. if(!$bool) return false;
  589. $res = $this->_fdfs->tracker_query_storage_list1($file_id,$this->tracker);
  590. if($res){
  591. return $res;
  592. }else{
  593. $this->halt();
  594. }
  595. }
  596. /**
  597. * 判断是否是有值的字符串
  598. * @param (array)$arr_str
  599. * @return bool
  600. */
  601. public function check_string()
  602. {
  603. $arr_str = func_get_args();
  604. foreach ($arr_str as $value)
  605. {
  606. if(empty($value))
  607. {
  608. return false;
  609. }
  610. }
  611. return true;
  612. }
  613. /**
  614. * 错误控制
  615. *
  616. */
  617. public function halt($message=null)
  618. {
  619. if($this->debug){
  620. //调试模式下优雅输出错误信息
  621. $trace = debug_backtrace();
  622. $trace_string = '';
  623. foreach ($trace as $key=>$t) {
  624. $trace_string .= '#'. $key . ' ' . $t['file'] . '('. $t['line'] . ')' . $t['class'] . $t['type'] . $t['function'] .'<br class="last">';
  625. }
  626. $errorinfo = $this->_fdfs->get_last_error_info();
  627. echo $errorinfo.''.$trace_string;
  628. Yii::log($errorinfo.''.$trace_string,'error');
  629. exit;
  630. }
  631. return false;
  632. }
  633. /**
  634. * 析构方法
  635. * 在对象被销毁前调用这个方法,对象属性所占用的内存并销毁对象相关的资源
  636. */
  637. public function __destruct()
  638. {
  639. if(is_array($this->tracker)){
  640. $this->_fdfs->disconnect_server($this->tracker);
  641. }
  642. }
  643. }