Subversion Repositories php-qbpwcf

Rev

Rev 3 | Rev 137 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
3 liveuser 1
<?php
2
 
3
/*
4
 
5
	QBPWCF, Quick Build PHP website Component base on Fedora Linux.
6
    Copyright (C) 2015~2025 Min-Jhin,Chen
7
 
8
    This file is part of QBPWCF.
9
 
10
    QBPWCF is free software: you can redistribute it and/or modify
11
    it under the terms of the GNU General Public License as published by
12
    the Free Software Foundation, either version 3 of the License, or
13
    (at your option) any later version.
14
 
15
    QBPWCF is distributed in the hope that it will be useful,
16
    but WITHOUT ANY WARRANTY; without even the implied warranty of
17
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18
    GNU General Public License for more details.
19
 
20
    You should have received a copy of the GNU General Public License
21
    along with QBPWCF.  If not, see <http://www.gnu.org/licenses/>.
22
 
23
*/
24
namespace qbpwcf;
25
 
26
/*
27
類別說明:
28
可以取得用戶端/伺服端資訊的類別.
29
備註:
30
無.
31
*/
32
class csInformation{
33
 
34
	/*
35
	#函式說明:
36
	#當前類別被呼叫的靜態方法不存在時,將會執行該函數,回報該方法不存在.
37
	#回傳結果:
38
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
39
	#$reuslt["error"],執行不正常結束的錯訊息陣列.
40
	#$result["function"],當前執行的函式名稱.
41
	#必填參數:
42
	#$method,物件,為物件實體或類別名稱,會自動置入該參數.
43
	#$arguments,陣列,為呼叫方法時所用的參數.
44
	#參考資料:
45
	#__call=>http://php.net/manual/en/language.oop5.overloading.php#object.callstatic
46
	*/
47
	public function __call($method,$arguments){
48
 
49
		#取得當前執行的函式
50
		$result["function"]=__FUNCTION__;
51
 
52
		#設置執行不正常
53
		$result["status"]="false";
54
 
55
		#設置執行錯誤
56
		$result["error"][]=__NAMESPACE__ ."/".$method."() 不存在!";
57
 
58
		#設置所丟入的參數
59
		$result["error"][]=$arguments;
60
 
61
		#回傳結果
62
		return $result;
63
 
64
		}#function __call end
65
 
66
	/*
67
	#函式說明:
68
	#當前類別被呼叫的靜態方法不存在時,將會執行該函數,回報該方法不存在.
69
	#回傳結果:
70
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
71
	#$reuslt["error"],執行不正常結束的錯訊息陣列.
72
	#$result["function"],當前執行的函式名稱.
73
	#必填參數:
74
	#$method,物件,為物件實體或類別名稱,會自動置入該參數.
75
	#$arguments,陣列,為呼叫方法時所用的參數.
76
	#參考資料:
77
	#__call=>http://php.net/manual/en/language.oop5.overloading.php#object.callstatic
78
	*/
79
	public static function __callStatic($method,$arguments){
80
 
81
		#取得當前執行的函式
82
		$result["function"]=__FUNCTION__;
83
 
84
		#設置執行不正常
85
		$result["status"]="false";
86
 
87
		#設置執行錯誤
88
		$result["error"][]="欲呼叫的". __NAMESPACE__ ."/".$method."() 不存在!";
89
 
90
		#設置所丟入的參數
91
		$result["error"][]=$arguments;
92
 
93
		#回傳結果
94
		return $result;
95
 
96
		}#function __callStatic end
97
 
98
	/*
99
	#函式說明:
100
	#取得執行該php的帳戶名稱.
101
	#回傳結果:
102
	#$result,字串,運行該php的使用者帳戶.若為空字串則代表非使用者直接觸發.
103
	#必填參數:
104
	#無.
105
	#可省略參數:
106
	#無.
107
	#參考資料:
108
	#無.
109
	#備註:
110
	#無.
111
	*/
112
	public static function runner(){
113
 
114
		#函式說明:
115
		#取得用戶端的資訊,並依據需要寫入到資料表裡面
116
		#回傳的結果:
117
		#$result["status"],執行是否正常,"true"代表執行成功,"false"代表執行失敗.
118
		#$result["error"],錯誤訊息.
119
		#$result["function"],檔前執行的函數名稱.
120
		#$result["mode"],當前的模式是"cmd"還是"web".
121
		#$result["userBrowserType"],爲使用者的瀏覽器資訊
122
		#$result["userIp"],爲使用者的IP
123
		#$result["serverIp"],為伺服器的IP
124
		#$result["server_name"],伺服器的 domain name
125
		#$result["scheme"],通訊協定
126
		#$result["serverPort"],伺服器給對外下載網頁的port
127
		#$result["requestUri"],爲使用者要求的網址/php檔案.
128
		#$result["requestUriFull"],為使用者要求的完整網址/php檔案路徑.
129
		#$result["clientRequestIP"],用戶端要求的ip與port
130
		#$result["username"],爲使用者目前的帳戶,若爲""則表示尚未登入成功
131
		#$result["phpUser"],運行該php的使用者帳戶.若為空字串則代表非使用者直接觸發.
132
		#$result["phpUserType"],運行該php的使用者帳戶類型,可能有"regular(no wheel member)","wheel(can use sudo)","intrinsic(root)","system(qemu,apache,...)".
133
		#$result["header"],接收到的 header 陣列.
134
		#$result["body"],接收到的 body 字串.
135
		#必填參數:
136
		#$conf["getAccount"],字串,是否要取得帳號,"true"代表要;"false"代表不要.
137
		$conf["csInformation::getConnectionInfo"]["getAccount"]="true";
138
		#可省略參數:
139
		#$conf["accountVar"],字串,帳號儲存在哪個變數裏面,預設爲$_SESSION["username"].
140
		#$conf["accountVar"]=$_SESSION["username"];
141
		#$conf["saveToDb"],字串,是否要除儲存到資料庫,"true"為要儲存",預設為"false"不儲存.
142
		#$conf["saveToDb"]="true";
143
		#$conf["dbAddress"],字串,爲mysql/mariadb server的位置,若saveToDb設為"true",則該參數為必填.
144
		#$conf["dbAddress"]=$dbAddress;
145
		#$conf["dbAccount"],字串,爲用於連入mysql/mariadb server時要使用的帳號,若saveToDb設為"true",則該參數為必填.
146
		#$conf["dbAccount"]=$dbAccount;
147
		#$conf["dbName"],字串,要選取的資料庫名稱,若saveToDb設為"true",則該參數為必填.
148
		#$conf["dbName"]=$dbName;
149
		#$conf["tableName"],字串,爲要插入資料的資料表名稱,若saveToDb設為"true",則該參數為必填.
150
		#$conf["tableName"]="visitorInfo";
151
		#$conf["columnName"],字串陣列,爲資料表的項目名稱,例如:$conf["columnName"]=array("columnName1","columnName2","columnName3",...);寫入的資料依序為,使用者帳戶、瀏覽器資訊、使用者IP、觀看的網址、當時的時間.若saveToDb設為"true",則該參數為必填.
152
		#$conf["columnName"]=array("username","userWebBrowser","userIp","requestUri","systemDateAndTime");
153
		#$conf["dbPassword"],字串,爲連線到mysql/mariadb server時要使用的密碼,可省略,若省略則代表不使用密碼.
154
		#$conf["dbPassword"]=$dbPassword;
155
		#參考資料:
156
		#$_SERVER=>http://php.net/manual/zh/reserved.variables.server.php
157
		#取得伺服器名稱與IP=>http://php.net/manual/en/function.gethostname.php
158
		#備註:
159
		#無.
160
		$getConnectionInfo=csInformation::getConnectionInfo($conf["csInformation::getConnectionInfo"]);
161
		unset($conf["csInformation::getConnectionInfo"]);
162
 
163
		#如果檢查失敗
164
		if($getConnectionInfo["status"]=="false"){
165
 
166
			#設置執行失敗的識別
167
			$result["status"]="false";
168
 
169
			#設置執行失敗的訊息
170
			$result["error"]=$getConnectionInfo;
171
 
172
			#回傳結果
173
			return $result;
174
 
175
			}#if end
176
 
177
		#回傳運行該php程式的帳戶名稱
178
		return $getConnectionInfo["phpUser"];
179
 
180
		}#function runner end
181
 
182
	/*
183
	#函式說明:
184
	#判斷當前環境為web還是cmd
185
	#回傳結果:
186
	#$result,"web"或"cmd".
187
	#必填參數:
188
	#無.
189
	#可省略參數:
190
	#無.
191
	#參考資料:
192
	#無.
193
	#備註:
194
	##考慮改用php-sapi-name()來判斷.
195
	*/
196
	public static function getEnv(){
197
 
198
		#如果是在命令列環境
199
		if(!(isset($_SERVER['HTTP_USER_AGENT']))){
200
 
201
			#回傳是在 "cmd" 環境
202
			return "cmd";
203
 
204
			}#if end
205
 
206
		#反之回傳是在 "web" 環境
207
		else{
208
 
209
			return "web";
210
 
211
			}#else end
212
 
213
		}#function get Env end
214
 
215
	/*
216
	#函式說明:
217
	#取得用戶端的瀏覽器版本資訊,並回傳。
218
	#回傳結果:
219
	#$result,瀏覽器的資訊.
220
	#必填參數:
221
	#無.
222
	#可省略參數:
223
	#無.
224
	#參考資料:
225
	#無.
226
	#備註:
227
	#無.
228
	*/
229
	public static function getUserBrowserType(){
230
 
231
		#如果為命令列
232
		if(!isset($_SERVER['HTTP_USER_AGENT'])){
233
 
234
			#取得運行php的作業系統環境
235
			#參考資料:
236
			#http://php.net/manual/en/function.php-uname.php
237
			$userBrowser=php_uname();
238
 
239
			}#if end
240
 
241
		#反之為網頁
242
		else{
243
 
244
			#取得客戶端的瀏覽器資訊
245
			$userBrowser=$_SERVER['HTTP_USER_AGENT'];
246
 
247
			}#else end
248
 
249
		#回傳使用者的瀏覽器資訊
250
		return $userBrowser;
251
 
252
		}#function getUserBrowserType end
253
 
254
	/*
255
	#函式說明:
256
	#回傳用戶端的IP位置
257
	#回傳的結果:
258
	#$result,用戶端的ip,若在命令列下執行則回傳getServerIP()的結果.
259
	#必填參數:
260
	#無.
261
	#可省略參數:
262
	#無.
263
	#參考資料:
264
	#無.
265
	#備註:
266
	#無.
267
	*/
268
	public static function getClientIP(){
269
 
270
		#如果找不到 $_SERVER['REMOTE_ADDR']
271
		if(!isset($_SERVER['REMOTE_ADDR'])){
272
 
273
			#則代表是在cmd環境下執行
274
			#函式說明:
275
			#取得伺服器的IP,並回傳。
276
			#回傳的結果:
277
			#$result,伺服端的IP
278
			#備註:
279
			#伺服端必須被 localhost 以外的網址連結才會出現正確的IP
280
			return csInformation::getServerIP();
281
 
282
			}#if end
283
 
284
		#取得客戶端IP
285
		$clientIP = $_SERVER['REMOTE_ADDR'];
286
 
287
		#回傳使用者的IP
288
		return $clientIP;
289
 
290
		}#function getClientIP end
291
 
292
	/*
293
	#函式說明:
294
	#取得伺服器的IP,並回傳。
295
	#回傳的結果:
296
	#$result,伺服端的IP
297
	#必填參數:
298
	#無.
299
	#可省略參數:
300
	#無.
301
	#參考資料:
302
	#無.
303
	#備註:
304
	#伺服端必須被 localhost 以外的網址連結才會出現正確的IP
305
	*/
306
	public static function getServerIP(){
307
 
308
		#如果是命令列
309
		if(!isset($_SERVER['SERVER_ADDR'])){
310
 
311
			$serverIP = gethostbyname(gethostname());
312
 
313
			}#if end
314
 
315
		#反之是網頁
316
		else{
317
 
318
			#取得伺服端的IP
319
			$serverIP = $_SERVER['SERVER_ADDR'];
320
 
321
			}#else end
322
 
323
		#回傳伺服端IP
324
		return $serverIP;
325
 
326
		}#function getServerIP end
327
 
328
	/*
329
	#函式說明:
330
	#依據提供查詢IP服務的網站取得伺服器對外的IP.
331
	#回傳結果:
332
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
333
	#$result["function"],當前執行的函數名稱.
334
	#$result["error"],錯誤訊息陣列.
335
	#$result["content"],伺服端對外的IP.
336
	#必填參數:
337
	#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑
338
	$conf["fileArgu"]=__FILE__;
339
	#可省略參數:
340
	#無.
341
	#參考資料:
342
	#無.
343
	#備註:
344
	#需要有網站支援此服務.
345
	*/
346
	public static function getServerRealIP(&$conf){
347
 
348
		#初始化要回傳的結果
349
		$result=array();
350
 
351
		#取得當前執行的函數名稱
352
		$result["function"]=__FUNCTION__;
353
 
354
		#如果沒有參數
355
		if(func_num_args()==0){
356
 
357
			#設置執行失敗
358
			$result["status"]="false";
359
 
360
			#設置執行錯誤訊息
361
			$result["error"]="函數".$result["function"]."需要參數";
362
 
363
			#回傳結果
364
			return $result;
365
 
366
			}#if end
367
 
368
		#如果 $conf 不為陣列
369
		if(gettype($conf)!="array"){
370
 
371
			#設置執行失敗
372
			$result["status"]="false";
373
 
374
			#設置執行錯誤訊息
375
			$result["error"][]="\$conf變數須為陣列形態";
376
 
377
			#如果傳入的參數為 null
378
			if($conf==null){
379
 
380
				#設置執行錯誤訊息
381
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
382
 
383
				}#if end
384
 
385
			#回傳結果
386
			return $result;
387
 
388
			}#if end
389
 
390
		#檢查參數
391
		#函式說明:
392
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
393
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
394
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
395
		#$result["function"],當前執行的函式名稱.
396
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
397
		#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
398
		#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
399
		#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
400
		#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
401
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
402
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
403
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
404
		#必填寫的參數:
405
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
406
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
407
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
408
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("fileArgu");
409
		#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null代表不指定變數形態.
410
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string");
411
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
412
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
413
		#可以省略的參數:
414
		#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
415
		#$conf["canBeEmptyString"]="false";
416
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或集合.
417
		#$conf["skipableVariableCanNotBeEmpty"]=array();
418
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
419
		#$conf["skipableVariableName"]=array();
420
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
421
		#$conf["skipableVariableType"]=array();
422
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
423
		#$conf["skipableVarDefaultValue"]=array("");
424
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
425
		#$conf["arrayCountEqualCheck"][]=array();
426
		#參考資料來源:
427
		#array_keys=>http://php.net/manual/en/function.array-keys.php
428
		$checkResult=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
429
		unset($conf["variableCheck::checkArguments"]);
430
 
431
		#如果檢查失敗
432
		if($checkResult["status"]=="false"){
433
 
434
			#設置執行失敗的識別
435
			$result["status"]="false";
436
 
437
			#設置執行失敗的訊息
438
			$result["error"]=$checkResult;
439
 
440
			#回傳結果
441
			return $result;
442
 
443
			}#if end
444
 
445
		#如果檢查不通過
446
		if($checkResult["passed"]=="false"){
447
 
448
			#設置執行失敗的識別
449
			$result["status"]="false";
450
 
451
			#設置執行失敗的訊息
452
			$result["error"]=$checkResult;
453
 
454
			#回傳結果
455
			return $result;
456
 
457
			}#if end
458
 
459
		#嘗試取得自己IP的設定檔
460
		#函式說明:
461
		#解析PHP檔案裡面的變數.
462
		#回傳結果:
463
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
464
		#$result["error"],錯誤訊息.
465
		#$result["function"],當前執行的函數名稱.
466
		#$result["argu"],所使用的參數.	
467
		#$result["content"],找到的變數內容陣列.
468
		#$result["content"]["value"],依找到變數順序的數值.
469
		#$result["content"]["struc"],依找到變數順序的階層結構.
470
		#$result["content"]["direct"],變數名稱對應的數值內容.
471
		#必填參數:
472
		#$conf["file"],字串,檔案的路徑與名稱.
473
		$conf["fileAccess::parseVaraiableInPHPfile"]["file"]=pathinfo(__FILE__)["dirname"]."/../../../etc/qbpwcf/config.php";
474
		#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑
475
		$conf["fileAccess::parseVaraiableInPHPfile"]["fileArgu"]=$conf["fileArgu"];
476
		#$conf["varName"],字串陣列,要搜尋的變數名稱,例如要搜尋變數$email則輸入"email".
477
		$conf["fileAccess::parseVaraiableInPHPfile"]["varName"]=array("myIp","getIpUrl");
478
		#可省略參數:
479
		#$conf["web"],是要取得網路上的檔案則為"true";反之則為"false",預設為"false".
480
		$conf["fileAccess::parseVaraiableInPHPfile"]["web"]="false";
481
		#參考資料:
482
		#https://www.php.net/manual/en/function.parse-str.php
483
		#備註:
484
		#無.
485
		$parseVaraiableInPHPfile=fileAccess::parseVaraiableInPHPfile($conf["fileAccess::parseVaraiableInPHPfile"]);
486
		unset($conf["fileAccess::parseVaraiableInPHPfile"]);
487
 
488
		#如果執行失敗
489
		if($parseVaraiableInPHPfile["status"]=="false"){
490
 
491
			#設置執行失敗的識別
492
			$result["status"]="false";
493
 
494
			#設置執行失敗的訊息
495
			$result["error"]=$parseVaraiableInPHPfile;
496
 
497
			#回傳結果
498
			return $result;
499
 
500
			}#if end
501
 
502
		#如果myIp變數有設定
503
		if(isset($parseVaraiableInPHPfile["content"]["myIp"])){
504
 
505
			#如果內容不為空字串
506
			if($parseVaraiableInPHPfile["content"]["myIp"][0]!==""){
507
 
508
				#取得伺服器對外的IP
509
				$result["content"]=array($parseVaraiableInPHPfile["content"]["myIp"][0]);
510
 
511
				#設置執行正常
512
				$result["status"]="true";
513
 
514
				#回傳結果
515
				return $result;
516
 
517
				}#if end
518
 
519
			}#if end
520
 
521
		#預設用於取得自己對外ip的服務網址
522
		$getIpUrl="https://ip.qbpwcf.org";
523
 
524
		#如果變數getIpUrl有設定
525
		if(isset($parseVaraiableInPHPfile["content"]["getIpUrl"])){
526
 
527
			#如果內容不為空字串
528
			if($parseVaraiableInPHPfile["content"]["getIpUrl"][0]!==""){
529
 
530
				#更新 getIpUrl
531
				$getIpUrl=$parseVaraiableInPHPfile["content"]["getIpUrl"][0];
532
 
533
				}#if end
534
 
535
			}#if end
536
 
537
		#函式說明:
538
		#運行curl cmd
539
		#回傳結果:
540
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
541
		#$result["error"],錯誤訊息陣列.
542
		#$result["function"],當前執行的函式名稱.
543
		#$result["content"],取得的回應內容.
544
		#$result["cookie"],cookie檔案的位置與名稱.
545
		#$result["cmd"],執行的command.
546
		#$result["argu],使用的參數.
547
		#必填參數:
548
		#$conf["url"],字串,目標url.
549
		$conf["catchWebContent::curlCmd"]["url"]=$getIpUrl;
550
		#$conf["fileArgu"],字串,變數__FILE__的內容.
551
		$conf["catchWebContent::curlCmd"]["fileArgu"]=__FILE__;
552
		#可省略參數:
553
		#$conf["header"],字串陣列,要傳送的header.
554
		#$conf["header"]=array();
555
		#$conf["allowAnySSLcertificate"],字串,是否允許不可信任的SSL憑證,預設為"true".
556
		#$conf["allowAnySSLcertificate"]="";
557
		#$conf["postVar"],字串陣列,每個要傳送的post變數名稱(陣列的key值)與數值.
558
		#$conf["postVar"]=array();
559
		#$conf["rawPost"]="字串",要傳送的raw post內容.
560
		#$conf["rawPost"]="";
561
		#$conf["urlEncode"],字串,post的內容是否要url_encode,"true"代表要,預設為"false"代表不要.
562
		#$conf["urlEncode"]="false";
563
		#$conf["agent"],字串,user agent的名稱.
564
		#$conf["agent"]="";
565
		#$conf["cookie"],字串,cookie位置與檔案位置.
566
		#$conf["cookie"]="";
567
		#$conf["forceNewCookie"],字串,是否要重置cookie,"true"代表要,"false"代表不要,預設為"false".
568
		#$conf["forceNewCookie"]="";
569
		$curlCmd=catchWebContent::curlCmd($conf["catchWebContent::curlCmd"]);
570
		unset($conf["catchWebContent::curlCmd"]);
571
 
572
		#如果檢查不通過
573
		if($curlCmd["status"]=="false"){
574
 
575
			#設置執行失敗的識別
576
			$result["status"]="false";
577
 
578
			#設置執行失敗的訊息
579
			$result["error"]=$curlCmd;
580
 
581
			#回傳結果
582
			return $result;
583
 
584
			}#if end
585
 
586
		#取得伺服器對外的IP
587
		$result["content"]=$curlCmd["content"];
588
 
589
		#設置執行正常
590
		$result["status"]="true";
591
 
592
		#回傳結果
593
		return $result;
594
 
595
		}#function getServerIP end
596
 
597
	/*
598
	#函式說明:
599
	#取得主機可能的ip位址
600
	#回傳的結果:
601
	#$result["status"],執行是否正常,"true"代表執行成功,"false"代表執行失敗.
602
	#$result["error"],錯誤訊息.
603
	#$result["function"],檔前執行的函數名稱.
604
	#$result["content"],目前瀏覽的頁面的路徑.
605
	#必填參數:
606
	#$conf["fileArgu"],字串,__FILE__的內容.
607
	$conf["fileArgu"]=__FILE__;
608
	#可省略參數:
609
	#無.
610
	#參考資料:
611
	#無.
612
	#備註:
613
	#僅能在命令列執行.
614
	*/
615
	public static function getServerIPs(&$conf=array()){
616
 
617
		#初始化要回傳的結果
618
		$result=array();
619
 
620
		#取得當前執行的函數名稱
621
		$result["function"]=__FUNCTION__;
622
 
623
		#如果沒有參數
624
		if(func_num_args()==0){
625
 
626
			#設置執行失敗
627
			$result["status"]="false";
628
 
629
			#設置執行錯誤訊息
630
			$result["error"]="函數".$result["function"]."需要參數";
631
 
632
			#回傳結果
633
			return $result;
634
 
635
			}#if end
636
 
637
		#函式說明:
638
		#判斷當前環境為web還是cmd
639
		#回傳結果:
640
		#$result,"web"或"cmd"
641
		if(csInformation::getEnv()==="web"){
642
 
643
			#設置執行失敗
644
			$result["status"]="false";
645
 
646
			#設置執行錯誤訊息
647
			$result["error"][]="函數 ".$result["function"]." 僅能在命令列環境下運行!";
648
 
649
			#回傳結果
650
			return $result;
651
 
652
			}#if end
653
 
654
		#取得參數
655
		$result["argu"]=$conf;
656
 
657
		#如果 $conf 不為陣列
658
		if(gettype($conf)!=="array"){
659
 
660
			#設置執行失敗
661
			$result["status"]="false";
662
 
663
			#設置執行錯誤訊息
664
			$result["error"][]="\$conf變數須為陣列形態";
665
 
666
			#如果傳入的參數為 null
667
			if($conf===null){
668
 
669
				#設置執行錯誤訊息
670
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
671
 
672
				}#if end
673
 
674
			#回傳結果
675
			return $result;
676
 
677
			}#if end
678
 
679
		#檢查參數
680
		#函式說明:
681
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
682
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
683
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
684
		#$result["function"],當前執行的函式名稱.
685
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
686
		#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
687
		#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
688
		#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
689
		#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
690
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
691
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
692
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
693
		#必填寫的參數:
694
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
695
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
696
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
697
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("fileArgu");
698
		#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null代表不指定變數形態.
699
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string");
700
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
701
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
702
		#可以省略的參數:
703
		#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
704
		$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";
705
		#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
706
		#$conf["canNotBeEmpty"]=array();
707
		#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
708
		#$conf["canBeEmpty"]=array();
709
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
710
		#$conf["skipableVariableCanNotBeEmpty"]=array();
711
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
712
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("cmd");
713
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
714
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string");
715
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
716
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("ip addr");
717
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
718
		#$conf["variableCheck::checkArguments"]["arrayCountEqualCheck"][]=array("netType","netCard");
719
		#參考資料來源:
720
		#array_keys=>http://php.net/manual/en/function.array-keys.php
721
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
722
		unset($conf["variableCheck::checkArguments"]);
723
 
724
		#如果檢查參數失敗
725
		if($checkArguments["status"]==="false"){
726
 
727
			#設置執行失敗
728
			$result["status"]="false";
729
 
730
			#設置執行錯誤訊息
731
			$result["error"]=$checkArguments;
732
 
733
			#回傳結果
734
			return $result;
735
 
736
			}#if end
737
 
738
		#如果檢查參數不通過
739
		if($checkArguments["passed"]==="false"){
740
 
741
			#設置執行失敗
742
			$result["status"]="false";
743
 
744
			#設置執行錯誤訊息
745
			$result["error"]=$checkArguments;
746
 
747
			#回傳結果
748
			return $result;
749
 
750
			}#if end
751
 
752
		#初始化 ip 指令不存在
753
		$ipCmdExist=false;
754
 
755
		#初始化 ifconfig 指令不存在
756
		$ifconigCmdExist=false;
757
 
758
		#檢查使用的指令是否存在
759
		#函式說明:
760
		#檢查指令是否存在
761
		#回傳結果:
762
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
763
		#$result["error"],錯誤訊息.
764
		#$result["function"],當前執行的函數名稱.
765
		#$result["argu"],使用的參數.
766
		#$result["founded"],指令是否存在,"true"代表存在,"false"代表存在.
767
		#必填參數:
768
		#$conf["cmd"],"字串",要查詢的指令.
769
		$conf["cmd::checkCmdExist"]["cmd"]="ip";
770
		#可省略參數:
771
		#$conf["binPath"],字串,要搜尋的路徑,預設為"/usr/bin".
772
		$conf["cmd::checkCmdExist"]["binPath"]="/usr/sbin";
773
		#$conf["fileArgu"],字串,變數__FILE__的內容.
774
		$conf["cmd::checkCmdExist"]["fileArgu"]=$conf["fileArgu"];
775
		$checkCmdExist=cmd::checkCmdExist($conf["cmd::checkCmdExist"]);
776
		unset($conf["cmd::checkCmdExist"]);
777
 
778
		#如果檢查指令是否存在失敗
779
		if($checkCmdExist["status"]==="false"){
780
 
781
			#設置執行失敗
782
			$result["status"]="false";
783
 
784
			#設置執行錯誤訊息
785
			$result["error"]=$checkCmdExist;
786
 
787
			#回傳結果
788
			return $result;
789
 
790
			}#if end
791
 
792
		#如果指令存在
793
		if($checkCmdExist["founded"]==="true"){
794
 
795
			#設置 ip 指令存在
796
			$ipCmdExist=true;
797
 
798
			}#if end
799
 
800
		#如果 ip 指令不存在
801
		if(!($ipCmdExist)){
802
 
803
			#檢查 ifconfig 指令是否存在
804
			#函式說明:
805
			#檢查指令是否存在
806
			#回傳結果:
807
			#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
808
			#$result["error"],錯誤訊息.
809
			#$result["function"],當前執行的函數名稱.
810
			#$result["argu"],使用的參數.
811
			#$result["founded"],指令是否存在,"true"代表存在,"false"代表存在.
812
			#必填參數:
813
			#$conf["cmd"],"字串",要查詢的指令.
814
			$conf["cmd::checkCmdExist"]["cmd"]="ifconfig";
815
			#可省略參數:
816
			#$conf["binPath"],字串,要搜尋的路徑,預設為"/usr/bin".
817
			$conf["cmd::checkCmdExist"]["binPath"]="/usr/sbin";
818
			#$conf["fileArgu"],字串,變數__FILE__的內容.
819
			$conf["cmd::checkCmdExist"]["fileArgu"]=$conf["fileArgu"];
820
			$checkCmdExist=cmd::checkCmdExist($conf["cmd::checkCmdExist"]);
821
			unset($conf["cmd::checkCmdExist"]);
822
 
823
			#如果檢查指令是否存在失敗
824
			if($checkCmdExist["status"]==="false"){
825
 
826
				#設置執行失敗
827
				$result["status"]="false";
828
 
829
				#設置執行錯誤訊息
830
				$result["error"]=$checkCmdExist;
831
 
832
				#回傳結果
833
				return $result;
834
 
835
				}#if end
836
 
837
			#如果指令存在
838
			if($checkCmdExist["founded"]==="true"){
839
 
840
				#設置 ip 指令存在
841
				$ifconfigCmdExist=true;
842
 
843
				}#if end
844
 
845
			}#if end
846
 
847
		#如果存在 ip 指令
848
		if($ipCmdExist){
849
 
850
			#查看 "ip addr" 指令有無 "inet" 的輸出
851
			#函數說明:
852
			#檢查指令的輸出是否含有關鍵字
853
			#回傳結果:
854
			#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
855
			#$result["error"],錯誤訊息.
856
			#$result["function"],當前執行的函數名稱.
857
			#$result["argu"],使用的參數.
858
			#$result["founded"],是否找到關鍵字,"true"代表有,"false"代表沒有.
859
			#$result["content"],關鍵字所在列的輸出.
860
			#必填參數:
861
			#$conf["cmd"],字串,要執行的指令.
862
			$conf["cmd::searchOutPut"]["cmd"]="ip addr";
863
			#$conf["keyWord"],字串,要檢查是否有關鍵字.
864
			$conf["cmd::searchOutPut"]["keyWord"]="inet";
865
			#可省略參數:
866
			#$conf["fileArgu"],字串,變數__FILE__的內容.
867
			$conf["cmd::searchOutPut"]["fileArgu"]=$conf["fileArgu"];
868
			#$conf["binPath"],字串,要搜尋的路徑,預設為"/usr/bin".
869
			$conf["cmd::searchOutPut"]["binPath"]="/usr/sbin";
870
			$searchOutPut=cmd::searchOutPut($conf["cmd::searchOutPut"]);
871
			unset($conf["cmd::searchOutPut"]);
872
 
873
			#如果取得指令輸出的關鍵字失敗
874
			if($searchOutPut["status"]==="false"){
875
 
876
				#設置執行失敗
877
				$result["status"]="false";
878
 
879
				#設置執行錯誤訊息
880
				$result["error"]=$searchOutPut;
881
 
882
				#回傳結果
883
				return $result;
884
 
885
				}#if end
886
 
887
			#如果指令輸出含有關鍵字
888
			if($searchOutPut["founded"]==="true"){
889
 
890
				#解析輸出 $searchOutPut["content"]
891
 
892
				#檢查每列輸出有無 "inet " 前置字串
893
				#函式說明:
894
				#取得多個符合特定字首與字尾的字串.
895
				#回傳的結果:
896
				#$result["status"],若爲"true"則代表執行正常;若爲"false"則代表執行失敗。
897
				#$result["founded"],若為"true"則代表有找到符合字首條件的結果;若爲"false"則代表沒有找到。
898
				#$result["function"],當前執行的函數名稱.
899
				#$result["returnString"],爲符合字首條件的字串陣列內容。
900
				#必填的參數:
901
				#$conf["checkString"],陣列字串,要檢查的字串們.
902
				$conf["search::getMeetConditionsStringMulti"]["checkString"]=$searchOutPut["content"];#要檢查的字串陣列
903
				#可省略參數:
904
				#$conf["frontWord"],字串,用來檢查字首應該要有什麼字串,預設不指定.
905
				$conf["search::getMeetConditionsStringMulti"]["frontWord"]="    inet ";
906
				#$conf["tailWord"],字串,用來檢查字尾應該要有什麼字串,預設不指定.
907
				#$conf["search::getMeetConditionsStringMulti"]["tailWord"]="";
908
				#參考資料:
909
				#str_spilt(),可以將字串依照字母分割成一個個陣列字串。
910
				$getMeetConditionsStringMulti=search::getMeetConditionsStringMulti($conf["search::getMeetConditionsStringMulti"]);
911
				unset($conf["search::getMeetConditionsStringMulti"]);
912
 
913
				#如果搜尋失敗
914
				if($getMeetConditionsStringMulti["status"]==="false"){
915
 
916
					#設置執行失敗
917
					$result["status"]="false";
918
 
919
					#設置執行錯誤訊息
920
					$result["error"]=$getMeetConditionsStringMulti;
921
 
922
					#回傳結果
923
					return $result;
924
 
925
					}#if end
926
 
927
				#如果有符合的輸出
928
				if($getMeetConditionsStringMulti["founded"]==="true"){
929
 
930
					#用 " " 分段
931
					#函式說明:
932
					#將多個固定格式的字串分開,並回傳分開的結果
933
					#回傳的參數:
934
					#$result["status"],執行成功與否,若爲"true",代表執行成功,若爲"false"代表執失敗。
935
					#$result["error"],錯誤訊息陣列.
936
					#$result["function"],當前執行的函數名稱.
937
					#$result["spiltString"][$i]["oriStr"],爲第i個字串的原始內容
938
					#$result["spiltString"][$i]["dataArray"],爲第($i+1)個字串分割後的字串陣列
939
					#$result["spiltString"][$i]["dataArray"][$j],爲第($i+1)的分割好的字串的第($j+1)段內容
940
					#$result["spiltString"][$i]["dataCounts"],爲第($i+1)個字串分割後總共分成幾段
941
					#必填的參數:
942
					#$conf["stringIn"],字串陣列,要處理的字串陣列.
943
					$conf["stringProcess::spiltMutiString"]["stringIn"]=$getMeetConditionsStringMulti["returnString"];
944
					#$conf["spiltSymbol"],字串,爲要以哪個符號作爲分割.
945
					$conf["stringProcess::spiltMutiString"]["spiltSymbol"]=" ";
946
					$spiltMutiString=stringProcess::spiltMutiString($conf["stringProcess::spiltMutiString"]);
947
					unset($conf["stringProcess::spiltMutiString"]);
948
 
949
					#如果分割字串失敗
950
					if($spiltMutiString["status"]==="false"){
951
 
952
						#設置執行失敗
953
						$result["status"]="false";
954
 
955
						#設置執行錯誤訊息
956
						$result["error"]=$spiltMutiString;
957
 
958
						#回傳結果
959
						return $result;
960
 
961
						}#if end
962
 
963
					#針對分好的每段
964
					foreach($spiltMutiString["spiltString"] as $index => $spiltedStr){
965
 
966
						#分割第一段
967
						#函式說明:
968
						#將固定格式的字串分開,並回傳分開的結果。
969
						#回傳結果:
970
						#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
971
						#$result["error"],錯誤訊息陣列
972
						#$result["function"],當前執行的函數名稱.
973
						#$result["oriStr"],要分割的原始字串內容
974
						#$result["dataArray"],爲分割好字串的陣列內容,$result["dataArray"][$i]爲第($i+1)段的內容。
975
						#$result["dataCounts"],爲總共分成幾段
976
						#$result["found"],是否有在$conf["stringIn"]找到$conf["spiltSymbol"],"true"代表有找到,"false"代表沒有找到.
977
						#必填的參數:
978
						$conf["stringProcess::spiltString"]["stringIn"]=$spiltedStr["dataArray"][1];#要處理的字串。
979
						$conf["stringProcess::spiltString"]["spiltSymbol"]="/";#爲以哪個符號作爲分割
980
						#可省略參數:
981
						#$conf["allowEmptyStr"],是否允許分割出來空字串,預設為"false"不允許;"true"代表允許.
982
						$conf["stringProcess::spiltString"]["allowEmptyStr"]="false";
983
						$spiltString=stringProcess::spiltString($conf["stringProcess::spiltString"]);
984
						unset($conf["stringProcess::spiltString"]);
985
 
986
						#如果分割字串失敗
987
						if($spiltString["status"]==="false"){
988
 
989
							#設置執行失敗
990
							$result["status"]="false";
991
 
992
							#設置執行錯誤訊息
993
							$result["error"]=$spiltString;
994
 
995
							#回傳結果
996
							return $result;
997
 
998
							}#if end
999
 
1000
						#如果有找到分割的關鍵字
1001
						if($spiltString["found"]==="true"){
1002
 
1003
							#取得ip
1004
							$result["content"][]=$spiltString["dataArray"][0];
1005
 
1006
							}#if end
1007
 
1008
						}#foreach end
1009
 
1010
					}#if end
1011
 
1012
				}#if end
1013
 
1014
			}#if end
1015
 
1016
		#反之如果存在 ifconfig 指令
1017
		else if($ifconfigCmdExist){
1018
 
1019
			#查看 "ifconfig" 指令有無 "inet" 的輸出
1020
			#函數說明:
1021
			#檢查指令的輸出是否含有關鍵字
1022
			#回傳結果:
1023
			#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
1024
			#$result["error"],錯誤訊息.
1025
			#$result["function"],當前執行的函數名稱.
1026
			#$result["argu"],使用的參數.
1027
			#$result["founded"],是否找到關鍵字,"true"代表有,"false"代表沒有.
1028
			#$result["content"],關鍵字所在列的輸出.
1029
			#必填參數:
1030
			#$conf["cmd"],字串,要執行的指令.
1031
			$conf["cmd::searchOutPut"]["cmd"]="ifconfig";
1032
			#$conf["keyWord"],字串,要檢查是否有關鍵字.
1033
			$conf["cmd::searchOutPut"]["keyWord"]="inet";
1034
			#可省略參數:
1035
			#$conf["fileArgu"],字串,變數__FILE__的內容.
1036
			$conf["cmd::searchOutPut"]["fileArgu"]=$conf["fileArgu"];
1037
			#$conf["binPath"],字串,要搜尋的路徑,預設為"/usr/bin".
1038
			$conf["cmd::searchOutPut"]["binPath"]="/usr/sbin";
1039
			$searchOutPut=cmd::searchOutPut($conf["cmd::searchOutPut"]);
1040
			unset($conf["cmd::searchOutPut"]);
1041
 
1042
			#如果取得指令輸出的關鍵字失敗
1043
			if($searchOutPut["status"]==="false"){
1044
 
1045
				#設置執行失敗
1046
				$result["status"]="false";
1047
 
1048
				#設置執行錯誤訊息
1049
				$result["error"]=$searchOutPut;
1050
 
1051
				#回傳結果
1052
				return $result;
1053
 
1054
				}#if end
1055
 
1056
			#如果指令輸出含有關鍵字
1057
			if($searchOutPut["founded"]==="true"){
1058
 
1059
				#解析輸出 $searchOutPut["content"]
1060
 
1061
				#檢查每列輸出有無 "inet " 前置字串
1062
				#函式說明:
1063
				#取得多個符合特定字首與字尾的字串.
1064
				#回傳的結果:
1065
				#$result["status"],若爲"true"則代表執行正常;若爲"false"則代表執行失敗。
1066
				#$result["founded"],若為"true"則代表有找到符合字首條件的結果;若爲"false"則代表沒有找到。
1067
				#$result["function"],當前執行的函數名稱.
1068
				#$result["returnString"],爲符合字首條件的字串陣列內容。
1069
				#必填的參數:
1070
				#$conf["checkString"],陣列字串,要檢查的字串們.
1071
				$conf["search::getMeetConditionsStringMulti"]["checkString"]=$searchOutPut["content"];#要檢查的字串陣列
1072
				#可省略參數:
1073
				#$conf["frontWord"],字串,用來檢查字首應該要有什麼字串,預設不指定.
1074
				$conf["search::getMeetConditionsStringMulti"]["frontWord"]="        inet ";
1075
				#$conf["tailWord"],字串,用來檢查字尾應該要有什麼字串,預設不指定.
1076
				#$conf["search::getMeetConditionsStringMulti"]["tailWord"]="";
1077
				#參考資料:
1078
				#str_spilt(),可以將字串依照字母分割成一個個陣列字串。
1079
				$getMeetConditionsStringMulti=search::getMeetConditionsStringMulti($conf["search::getMeetConditionsStringMulti"]);
1080
				unset($conf["search::getMeetConditionsStringMulti"]);
1081
 
1082
				#如果搜尋失敗
1083
				if($getMeetConditionsStringMulti["status"]==="false"){
1084
 
1085
					#設置執行失敗
1086
					$result["status"]="false";
1087
 
1088
					#設置執行錯誤訊息
1089
					$result["error"]=$getMeetConditionsStringMulti;
1090
 
1091
					#回傳結果
1092
					return $result;
1093
 
1094
					}#if end
1095
 
1096
				#如果有符合的輸出
1097
				if($getMeetConditionsStringMulti["founded"]==="true"){
1098
 
1099
					#用 " " 分段
1100
					#函式說明:
1101
					#將多個固定格式的字串分開,並回傳分開的結果
1102
					#回傳的參數:
1103
					#$result["status"],執行成功與否,若爲"true",代表執行成功,若爲"false"代表執失敗。
1104
					#$result["error"],錯誤訊息陣列.
1105
					#$result["function"],當前執行的函數名稱.
1106
					#$result["spiltString"][$i]["oriStr"],爲第i個字串的原始內容
1107
					#$result["spiltString"][$i]["dataArray"],爲第($i+1)個字串分割後的字串陣列
1108
					#$result["spiltString"][$i]["dataArray"][$j],爲第($i+1)的分割好的字串的第($j+1)段內容
1109
					#$result["spiltString"][$i]["dataCounts"],爲第($i+1)個字串分割後總共分成幾段
1110
					#必填的參數:
1111
					#$conf["stringIn"],字串陣列,要處理的字串陣列.
1112
					$conf["stringProcess::spiltMutiString"]["stringIn"]=$getMeetConditionsStringMulti["returnString"];
1113
					#$conf["spiltSymbol"],字串,爲要以哪個符號作爲分割.
1114
					$conf["stringProcess::spiltMutiString"]["spiltSymbol"]=" ";
1115
					$spiltMutiString=stringProcess::spiltMutiString($conf["stringProcess::spiltMutiString"]);
1116
					unset($conf["stringProcess::spiltMutiString"]);
1117
 
1118
					#如果分割字串失敗
1119
					if($spiltMutiString["status"]==="false"){
1120
 
1121
						#設置執行失敗
1122
						$result["status"]="false";
1123
 
1124
						#設置執行錯誤訊息
1125
						$result["error"]=$spiltMutiString;
1126
 
1127
						#回傳結果
1128
						return $result;
1129
 
1130
						}#if end
1131
 
1132
					#針對分好的每段
1133
					foreach($spiltMutiString["spiltString"] as $spiltedStr){
1134
 
1135
						#取得ip
1136
						$result["content"][]=$spiltedStr["dataArray"][1];
1137
 
1138
						}#foreach end
1139
 
1140
					}#if end
1141
 
1142
				}#if end
1143
 
1144
			}#if end
1145
 
1146
		#查詢對外ip
1147
		#函式說明:
1148
		#依據提供查詢IP服務的網站取得伺服器對外的IP.
1149
		#回傳的結果:
1150
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
1151
		#$result["function"],當前執行的函數名稱.
1152
		#$result["error"],錯誤訊息陣列.
1153
		#$result["content"],伺服端對外的IP.
1154
		#必填參數:
1155
		#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑
1156
		$conf["self::getServerRealIP"]["fileArgu"]=$conf["fileArgu"];
1157
		$getServerRealIP=self::getServerRealIP($conf["self::getServerRealIP"]);
1158
		unset($conf["self::getServerRealIP"]);
1159
 
1160
		#如果查詢對外 ip 失敗
1161
		if($getServerRealIP["status"]==="false"){
1162
 
1163
			#設置執行失敗
1164
			$result["status"]="false";
1165
 
1166
			#設置執行錯誤訊息
1167
			$result["error"]=$getServerRealIP;
1168
 
1169
			#回傳結果
1170
			return $result;
1171
 
1172
			}#if end
1173
 
1174
		#取得對外ip
1175
		$result["content"][]=$getServerRealIP["content"];
1176
 
1177
		#剔除重複的ip
1178
		$result["content"]=array_unique($result["content"]);
1179
 
1180
		#如果是 ip addr | grep inet 則會輸出類似的內容
1181
		/*
1182
		inet 127.0.0.1/8 scope host lo
1183
		inet6 ::1/128 scope host
1184
		inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic enp0s5
1185
		inet6 fec0::d17d:1504:b561:1535/64 scope site noprefixroute dynamic
1186
		inet6 fe80::c85c:f113:e76c:4e2/64 scope link
1187
		inet 169.254.196.9/16 brd 169.254.255.255 scope link enp0s6
1188
		inet6 fe80::8e5f:c35f:952b:3fd1/64 scope link
1189
		inet 192.168.200.111/24 brd 192.168.200.255 scope global dynamic enp0s7
1190
		inet6 fe80::ad8d:d224:e78c:f89d/64 scope link
1191
		inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
1192
		*/
1193
 
1194
		#如果是 ifconfig | grep inet 則會輸出類似的內容
1195
		/*
1196
		inet 10.0.2.15  netmask 255.255.255.0  broadcast 10.0.2.255
1197
		inet6 fe80::c85c:f113:e76c:4e2  prefixlen 64  scopeid 0x20<link>
1198
		inet6 fec0::d17d:1504:b561:1535  prefixlen 64  scopeid 0x40<site>
1199
		inet 169.254.196.9  netmask 255.255.0.0  broadcast 169.254.255.255
1200
		inet6 fe80::8e5f:c35f:952b:3fd1  prefixlen 64  scopeid 0x20<link>
1201
		inet 192.168.200.111  netmask 255.255.255.0  broadcast 192.168.200.255
1202
		inet6 fe80::ad8d:d224:e78c:f89d  prefixlen 64  scopeid 0x20<link>
1203
		inet 127.0.0.1  netmask 255.0.0.0
1204
		inet6 ::1  prefixlen 128  scopeid 0x10<host>
1205
		inet 192.168.122.1  netmask 255.255.255.0  broadcast 192.168.122.255
1206
		*/
1207
 
1208
		#設置執行正常
1209
		$result["status"]="true";
1210
 
1211
		#回傳節果
1212
		return $result;
1213
 
1214
		}#function getServerIps end
1215
 
1216
	/*
1217
	#函式說明:
1218
	#取得目前瀏覽的頁面的路徑或執行的php程式路徑.
1219
	#回傳結果:
1220
	#$result["status"],執行是否正常,"true"代表執行成功,"false"代表執行失敗.
1221
	#$result["error"],錯誤訊息.
1222
	#$result["function"],檔前執行的函數名稱.
1223
	#$result["content"],目前瀏覽的頁面的路徑或執行的php程式路徑.
1224
	#$result["serverIp"],取得伺服器ip.
1225
	#$result["scheme"],取得與伺服器連線所使用的通訊協定,若不適用則為null.
1226
	#必填參數:
1227
	$conf["type"]="";#想要取得的路徑類型,"full"代表完整路徑,"pathOnly"代表只要路徑,"lastLayer"代表上一層目錄的名稱
1228
	#必填參數:
1229
	#無.
1230
	#可省略參數:
1231
	#無.
1232
	#參考資料:
1233
	#http://blog.longwin.com.tw/2009/01/php-get-directory-file-path-dirname-2008/
1234
	#備註:
1235
	#無.
1236
	*/
1237
	public static function getPathOfThisPhpFile($conf){
1238
 
1239
		#初始化要回傳的結果
1240
		$result=array();
1241
 
1242
		#取得當前執行的函數
1243
		$result["function"]=__FUNCTION__;
1244
 
1245
		#如果 $conf 不為陣列
1246
		if(gettype($conf)!="array"){
1247
 
1248
			#設置執行失敗
1249
			$result["status"]="false";
1250
 
1251
			#設置執行錯誤訊息
1252
			$result["error"][]="\$conf變數須為陣列形態";
1253
 
1254
			#如果傳入的參數為 null
1255
			if($conf==null){
1256
 
1257
				#設置執行錯誤訊息
1258
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
1259
 
1260
				}#if end
1261
 
1262
			#回傳結果
1263
			return $result;
1264
 
1265
			}#if end
1266
 
1267
		#函式說明:
1268
		#取得用戶端的資訊,並依據需要寫入到資料表裡面
1269
		#回傳的結果:
1270
		#$result["status"],執行是否正常,"true"代表執行成功,"false"代表執行失敗.
1271
		#$result["error"],錯誤訊息.
1272
		#$result["function"],檔前執行的函數名稱.
1273
		#$result["mode"],當前的模式是"cmd"還是"web".
1274
		#$result["userBrowserType"],爲使用者的瀏覽器資訊
1275
		#$result["userIp"],爲使用者的IP
1276
		#$result["serverIp"],為伺服器的IP
1277
		#$result["server_name"],伺服器的 domain name
1278
		#$result["scheme"],通訊協定
1279
		#$result["serverPort"],伺服器給對外下載網頁的port
1280
		#$result["requestUri"],爲使用者要求的網址/php檔案.
1281
		#$result["requestUriFull"],為使用者要求的完整網址/php檔案路徑.
1282
		#$result["clientRequestIP"],用戶端要求的ip與port
1283
		#$result["username"],爲使用者目前的帳戶,若爲""則表示尚未登入成功
1284
		#$result["phpUser"],運行該php的使用者帳戶.
1285
		#$result["header"],接收到的 header 陣列.
1286
		#$result["body"],接收到的 body 字串.
1287
		#必填的參數:
1288
		$conf["csInformation::getConnectionInfo"]["getAccount"]="true";#是否要取得帳號
1289
		#可省略的參數:
1290
		#$conf["accountVar"]=$_SESSION["username"];#帳號儲存在哪個變數裏面,預設爲$_SESSION["username"]
1291
		#$conf["saveToDb"]="true";#是否要除儲存到資料庫,"true"為要儲存",預設為不儲存
1292
		#$conf["dbAddress"]=$dbAddress;;#爲mysql-Server的位置,若#$conf["saveToDb"]設為"true",則該參數為必填。
1293
		#$conf["dbAccount"]=$dbAccount;#爲用於連入mysql-Server時要使用的帳號,若#$conf["saveToDb"]設為"true",則該參數為必填。
1294
		#$conf["dbName"]=$dbName;#要選取的資料庫名稱,若#$conf["saveToDb"]設為"true",則該參數為必填。
1295
		#$conf["tableName"]="visitorInfo";#爲要插入資料的資料表名稱,若#$conf["saveToDb"]設為"true",則該參數為必填。
1296
		#$conf["columnName"]=array("username","userWebBrowser","userIp","requestUri","systemDateAndTime");#爲資料表的項目名稱,
1297
			#例如:$conf["columnName"]=array("columnName1","columnName2","columnName3",...);
1298
			#寫入的資料依序為,使用者帳戶、瀏覽器資訊、使用者IP、觀看的網址、當時的時間
1299
			#$conf["saveToDb"]設為"true",則該參數為必填。
1300
		#$conf["dbPassword"]=$dbPassword;#爲連線到mysql-Server時要使用的密碼,可省略,若省略則代表不使用密碼
1301
		$getConnectionInfo=csInformation::getConnectionInfo($conf["csInformation::getConnectionInfo"]);
1302
		unset($conf["csInformation::getConnectionInfo"]);
1303
 
1304
		#debug
1305
		#var_dump(__LINE__,$getConnectionInfo);
1306
 
1307
		#取得連線資訊失敗
1308
		if($getConnectionInfo["status"]==="false"){
1309
 
1310
			#設置執行失敗
1311
			$result["status"]="false";
1312
 
1313
			#設置執行錯誤訊息
1314
			$result["error"]=$getConnectionInfo;
1315
 
1316
			#回傳結果
1317
			return $result;
1318
 
1319
			}#if end
1320
 
1321
		#取得伺服器ip
1322
		$result["serverIp"]=$getConnectionInfo["serverIp"];
1323
 
1324
		#取得與伺服器連線所使用的通訊協定
1325
		$result["scheme"]=$getConnectionInfo["scheme"];
1326
 
1327
		#判斷 $conf["type"]
1328
		switch($conf["type"]){
1329
 
1330
			#如果是 "full"
1331
			case "full":
1332
 
1333
				#取得目前檔案的完整路徑
1334
				$result["content"]=$getConnectionInfo["requestUri"];
1335
 
1336
				#設置執行正常
1337
				$result["status"]="true";
1338
 
1339
				#回傳結果
1340
				return $result;
1341
 
1342
				#打斷switch
1343
				break;
1344
 
1345
			#如果是 "pathOnly"
1346
			case "pathOnly":
1347
 
1348
				#如果是網頁環境
1349
				if($getConnectionInfo["mode"]==="web"){
1350
 
1351
					#用 當前檔案的名稱 來分割目前檔案的完整路徑
1352
					#函式說明:
1353
					#將固定格式的字串分開,並回傳分開的結果。
1354
					#回傳的參數:
1355
					#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
1356
					#$result["error"],錯誤訊息陣列
1357
					#$result["function"],當前執行的函數名稱.
1358
					#$result["oriStr"],要分割的原始字串內容
1359
					#$result["dataArray"],爲分割好字串的陣列內容,$result["dataArray"][$i]爲第($i+1)段的內容。
1360
					#$result["dataCounts"],爲總共分成幾段
1361
					#必填的參數:
1362
					$conf["stringProcess::spiltString"]["stringIn"]=$getConnectionInfo["requestUri"];#要處理的字串。
1363
					$conf["stringProcess::spiltString"]["spiltSymbol"]=basename(($getConnectionInfo["requestUri"]));#爲以哪個符號作爲分割
1364
					$spiltString=stringProcess::spiltString($conf["stringProcess::spiltString"]);
1365
					unset($conf["stringProcess::spiltString"]);
1366
 
1367
					#如果分割失敗
1368
					if($spiltString["status"]=="false"){
1369
 
1370
						#設置執行失敗
1371
						$result["status"]="false";
1372
 
1373
						#設置執行錯誤訊息
1374
						$result["error"]=$spiltString;
1375
 
1376
						#回傳結果
1377
						return $result;
1378
 
1379
						}#if end
1380
 
1381
					#如果分割出來少於一段
1382
					if($spiltString["dataCounts"]<1){
1383
 
1384
						#設置執行失敗
1385
						$result["status"]="false";
1386
 
1387
						#設置執行錯誤訊息
1388
						$result["error"]=$spiltString;
1389
 
1390
						#回傳結果
1391
						return $result;
1392
 
1393
						}#if end
1394
 
1395
					#取得不包含檔案名稱的路徑
1396
					$result["content"]=$spiltString["dataArray"][0];
1397
 
1398
					#設置執行正常
1399
					$result["status"]="true";
1400
 
1401
					#回傳結果
1402
					return $result;
1403
 
1404
					}#if end
1405
 
1406
				#反之如果是 cmd 環境
1407
				else if($getConnectionInfo["mode"]==="cmd"){
1408
 
1409
					#函式說明:
1410
					#將字串特定關鍵字與其後面的內容剔除
1411
					#回傳結果:
1412
					#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
1413
					#$result["error"],錯誤訊息陣列.
1414
					#$result["warning"],警告訊息鎮列.
1415
					#$result["founded"],有無找到定字串"true"代表有,"false"代表沒有.
1416
					#$result["function"],當前執行的函數名稱.
1417
					#$result["oriStr"],要處理的原始字串內容.
1418
					#$result["content"],處理好的的字串內容.
1419
					#$result["argu"],使用的參數.
1420
					#必填參數:
1421
					#$conf["stringIn"],字串,要處理的字串.
1422
					$conf["stringProcess::delStrAfterKeyWord"]["stringIn"]=$getConnectionInfo["requestUriFull"];
1423
					#$conf["keyWord"],字串,特定字串.
1424
					$conf["stringProcess::delStrAfterKeyWord"]["keyWord"]=$getConnectionInfo["requestUri"];
1425
					#可省略參數:
1426
					#$conf["deleteLastRepeatedOne"],字串,預設為"false";若為"true"則代表連續遇到同 $conf["keyWord"] 的內容,要將移除內容的起點往後移動到為後一個 $conf["keyWord"].
1427
					$conf["stringProcess::delStrAfterKeyWord"]["deleteLastRepeatedOne"]="true";
1428
					#參考資料:
1429
					#無.
1430
					#備註:
1431
					#無.
1432
					$delStrAfterKeyWord=stringProcess::delStrAfterKeyWord($conf["stringProcess::delStrAfterKeyWord"]);
1433
					unset($conf["stringProcess::delStrAfterKeyWord"]);
1434
 
1435
					#如果執行失敗
1436
					if($delStrAfterKeyWord["status"]==="false"){
1437
 
1438
						#設置執行失敗
1439
						$result["status"]="false";
1440
 
1441
						#設置執行錯誤訊息
1442
						$result["error"]=$delStrAfterKeyWord;
1443
 
1444
						#回傳結果
1445
						return $result;
1446
 
1447
						}#if end
1448
 
1449
					#如果沒有應該要有的檔案名稱
1450
					if($delStrAfterKeyWord["founded"]==="false"){
1451
 
1452
						#設置執行失敗
1453
						$result["status"]="false";
1454
 
1455
						#設置執行錯誤訊息
1456
						$result["error"]=$delStrAfterKeyWord;
1457
 
1458
						#回傳結果
1459
						return $result;
1460
 
1461
						}#if end
1462
 
1463
					#取得不包含檔案名稱的路徑
1464
					$result["content"]=$delStrAfterKeyWord["content"];
1465
 
1466
					#設置執行正常
1467
					$result["status"]="true";
1468
 
1469
					#回傳結果
1470
					return $result;
1471
 
1472
					}#if end
1473
 
1474
				#打斷switch
1475
				break;
1476
 
1477
			#如果是 "lastLayer"
1478
			case "lastLayer":
1479
 
1480
				#如果是網頁環境
1481
				if($result["mode"]==="web"){
1482
 
1483
					#取得上層目錄的名稱
1484
					$result["content"]=basename((dirname($getConnectionInfo["requestUri"])));
1485
 
1486
					}#if end
1487
 
1488
				#反之如果是 cmd 環境
1489
				else if($result["mode"]==="cmd"){
1490
 
1491
					#取得callback用的參數
1492
					$conf["csInformation::getPathOfThisPhpFile"]=$confForCallback;
1493
 
1494
					#改取得路徑就好
1495
					$conf["csInformation::getPathOfThisPhpFile"]["type"]="pathOnly";
1496
 
1497
					/*
1498
					#函式說明:
1499
					#取得目前瀏覽的頁面的路徑或執行的php程式路徑.
1500
					#回傳結果:
1501
					#$result["status"],執行是否正常,"true"代表執行成功,"false"代表執行失敗.
1502
					#$result["error"],錯誤訊息.
1503
					#$result["function"],檔前執行的函數名稱.
1504
					#$result["content"],目前瀏覽的頁面的路徑或執行的php程式路徑.
1505
					#$result["serverIp"],取得伺服器ip.
1506
					#$result["scheme"],取得與伺服器連線所使用的通訊協定.
1507
					#必填參數:
1508
					$conf["type"]="";#想要取得的路徑類型,"full"代表完整路徑,"pathOnly"代表只要路徑,"lastLayer"代表上一層目錄的名稱
1509
					#必填參數:
1510
					#無.
1511
					#可省略參數:
1512
					#無.
1513
					#參考資料:
1514
					#http://blog.longwin.com.tw/2009/01/php-get-directory-file-path-dirname-2008/
1515
					#備註:
1516
					#無.
1517
					*/
1518
					$getPathOfThisPhpFile=csInformation::getPathOfThisPhpFile($conf["csInformation::getPathOfThisPhpFile"]);
1519
					unset($conf["csInformation::getPathOfThisPhpFile"]);
1520
 
1521
					#如果執行失敗
1522
					if($getPathOfThisPhpFile["status"]==="false"){
1523
 
1524
						#設置執行失敗
1525
						$result["status"]="false";
1526
 
1527
						#設置執行錯誤訊息
1528
						$result["error"]=$getPathOfThisPhpFile;
1529
 
1530
						#回傳結果
1531
						return $result;
1532
 
1533
						}#if end
1534
 
1535
					#取得路徑
1536
					#$getPathOfThisPhpFile["content"];
1537
 
1538
					#函式說明:
1539
					#將固定格式的字串分開,並回傳分開的結果.
1540
					#回傳結果:
1541
					#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
1542
					#$result["error"],錯誤訊息陣列
1543
					#$result["function"],當前執行的函數名稱.
1544
					#$result["argu"],使用的參數.
1545
					#$result["oriStr"],要分割的原始字串內容
1546
					#$result["dataArray"],爲分割好字串的陣列內容,$result["dataArray"][$i]爲第($i+1)段的內容。
1547
					#$result["dataCounts"],爲總共分成幾段
1548
					#$result["found"],是否有在$conf["stringIn"]找到$conf["spiltSymbol"],"true"代表有找到,"false"代表沒有找到.
1549
					#必填參數:
1550
					#$conf["stringIn"],字串,要處理的字串.
1551
					$conf["stringProcess::spiltString"]["stringIn"]=$getPathOfThisPhpFile["content"];
1552
					#$conf["spiltSymbol"],字串,爲以哪個符號作爲分割.
1553
					$conf["stringProcess::spiltString"]["spiltSymbol"]="/";
1554
					#可省略參數:
1555
					#$conf["allowEmptyStr"],是否允許分割出來空字串,預設為"false"不允許;"true"代表允許.
1556
					$conf["stringProcess::spiltString"]["allowEmptyStr"]="false";
1557
					#參考資料:
1558
					#無.
1559
					#備註:
1560
					#無.
1561
					$spiltString=stringProcess::spiltString($conf["stringProcess::spiltString"]);
1562
					unset($conf["stringProcess::spiltString"]);
1563
 
1564
					#如果執行失敗
1565
					if($spiltString["status"]==="false"){
1566
 
1567
						#設置執行失敗
1568
						$result["status"]="false";
1569
 
1570
						#設置執行錯誤訊息
1571
						$result["error"]=$spiltString;
1572
 
1573
						#回傳結果
1574
						return $result;
1575
 
1576
						}#if end
1577
 
1578
					#如果沒有"/"存在
1579
					if($spiltString["found"]==="false"){
1580
 
1581
						#設置執行失敗
1582
						$result["status"]="false";
1583
 
1584
						#設置執行錯誤訊息
1585
						$result["error"]=$spiltString;
1586
 
1587
						#回傳結果
1588
						return $result;
1589
 
1590
						}#if end
1591
 
1592
					#如果沒有分出結果
1593
					if($spiltString["dataCounts"]===0){
1594
 
1595
						#設置上層目錄的名稱為"/"
1596
						$result["content"]="/";
1597
 
1598
						#設置執行正常
1599
						$result["status"]="true";
1600
 
1601
						#回傳結果
1602
						return $result;
1603
 
1604
						}#if end
1605
 
1606
					#反之
1607
					else{
1608
 
1609
						#取得上層目錄的索引
1610
						$lastLayerIndex=$spiltString["dataCounts"]-1;
1611
 
1612
						#取得上層目錄
1613
						$result["content"]=$spiltString["dataArray"][$lastLayerIndex];
1614
 
1615
						#設置執行正常
1616
						$result["status"]="true";
1617
 
1618
						#回傳結果
1619
						return $result;
1620
 
1621
						}#if end
1622
 
1623
					}#if end
1624
 
1625
				#反之為異常結果
1626
				else{
1627
 
1628
					#設置執行不正常
1629
					$result["status"]="false";
1630
 
1631
					#設置錯誤訊息
1632
					$result["error"][]="無法判別環境為web還是cmd";
1633
 
1634
					#設置錯誤訊息
1635
					$result["error"][]=$getConnectionInfo;
1636
 
1637
					#回傳結果
1638
					return $result;
1639
 
1640
					}#else end
1641
 
1642
				#設置執行正常
1643
				$result["status"]="true";
1644
 
1645
				#回傳結果
1646
				return $result;
1647
 
1648
				#打斷switch
1649
				break;
1650
 
1651
			#如果不是以上兩個內容
1652
			default :
1653
 
1654
				#設置執行失敗
1655
				$result["status"]="false";
1656
 
1657
				#設置執行錯誤訊息
1658
				$result["error"][]="\$conf[\"type\"]變數須為「full」或「pathOnly」或「lastLayer」";
1659
 
1660
				#回傳結果
1661
				return $result;
1662
 
1663
			}#switch end
1664
 
1665
		#不應該執行到這邊
1666
 
1667
		#設置執行失敗
1668
		$result["status"]="false";
1669
 
1670
		#設置執行錯誤訊息
1671
		$result["error"][]="不應該出現的例外狀況";
1672
 
1673
		#回傳結果
1674
		return $result;
1675
 
1676
		}#getFullPathOfThisPhpFile end
1677
 
1678
	/*
1679
	#函式說明:
1680
	#取得用戶端的資訊,並依據需要寫入到資料表裡面
1681
	#回傳的結果:
1682
	#$result["status"],執行是否正常,"true"代表執行成功,"false"代表執行失敗.
1683
	#$result["error"],錯誤訊息.
1684
	#$result["function"],檔前執行的函數名稱.
1685
	#$result["mode"],當前的模式是"cmd"還是"web".
1686
	#$result["userBrowserType"],爲使用者的瀏覽器資訊
1687
	#$result["userIp"],爲使用者的IP
1688
	#$result["serverIp"],為伺服器的IP
1689
	#$result["server_name"],伺服器的 domain name
1690
	#$result["scheme"],通訊協定
1691
	#$result["serverPort"],伺服器給對外下載網頁的port
1692
	#$result["requestUri"],爲使用者要求的網址/php檔案.
1693
	#$result["requestUriFull"],為使用者要求的完整網址/php檔案路徑.
1694
	#$result["clientRequestIP"],用戶端要求的ip與port
1695
	#$result["username"],爲使用者目前的帳戶,若爲""則表示尚未登入成功
1696
	#$result["phpUser"],運行該php的使用者帳戶.若為空字串則代表非使用者直接觸發.
1697
	#$result["phpUserType"],運行該php的使用者帳戶類型,可能有"regular(no wheel member)","wheel(can use sudo)","intrinsic(root)","system(qemu,apache,...)".
1698
	#$result["header"],接收到的 header 陣列.
1699
	#$result["body"],接收到的 body 字串.
1700
	#必填參數:
1701
	#$conf["getAccount"],字串,是否要取得帳號,"true"代表要;"false"代表不要.
1702
	$conf["getAccount"]="true";
1703
	#可省略參數:
1704
	#$conf["accountVar"],字串,帳號儲存在哪個變數裏面,預設爲$_SESSION["username"].
1705
	#$conf["accountVar"]=$_SESSION["username"];
1706
	#$conf["saveToDb"],字串,是否要除儲存到資料庫,"true"為要儲存",預設為"false"不儲存.
1707
	#$conf["saveToDb"]="true";
1708
	#$conf["dbAddress"],字串,爲mysql/mariadb server的位置,若saveToDb設為"true",則該參數為必填.
1709
	#$conf["dbAddress"]=$dbAddress;
1710
	#$conf["dbAccount"],字串,爲用於連入mysql/mariadb server時要使用的帳號,若saveToDb設為"true",則該參數為必填.
1711
	#$conf["dbAccount"]=$dbAccount;
1712
	#$conf["dbName"],字串,要選取的資料庫名稱,若saveToDb設為"true",則該參數為必填.
1713
	#$conf["dbName"]=$dbName;
1714
	#$conf["tableName"],字串,爲要插入資料的資料表名稱,若saveToDb設為"true",則該參數為必填.
1715
	#$conf["tableName"]="visitorInfo";
1716
	#$conf["columnName"],字串陣列,爲資料表的項目名稱,例如:$conf["columnName"]=array("columnName1","columnName2","columnName3",...);寫入的資料依序為,使用者帳戶、瀏覽器資訊、使用者IP、觀看的網址、當時的時間.若saveToDb設為"true",則該參數為必填.
1717
	#$conf["columnName"]=array("username","userWebBrowser","userIp","requestUri","systemDateAndTime");
1718
	#$conf["dbPassword"],字串,爲連線到mysql/mariadb server時要使用的密碼,可省略,若省略則代表不使用密碼.
1719
	#$conf["dbPassword"]=$dbPassword;
1720
	#參考資料:
1721
	#$_SERVER=>http://php.net/manual/zh/reserved.variables.server.php
1722
	#取得伺服器名稱與IP=>http://php.net/manual/en/function.gethostname.php
1723
	#備註:
1724
	#無.
1725
	*/
1726
	public static function getConnectionInfo(&$conf){
1727
 
1728
		#初始化要回傳的結果
1729
		$result=array();
1730
 
1731
		#取得當前執行的函數
1732
		$result["function"]=__FUNCTION__;
1733
 
1734
		#如果 $conf 不為陣列
1735
		if(gettype($conf)!="array"){
1736
 
1737
			#設置執行失敗
1738
			$result["status"]="false";
1739
 
1740
			#設置執行錯誤訊息
1741
			$result["error"][]="\$conf變數須為陣列形態";
1742
 
1743
			#如果傳入的參數為 null
1744
			if($conf==null){
1745
 
1746
				#設置執行錯誤訊息
1747
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
1748
 
1749
				}#if end
1750
 
1751
			#回傳結果
1752
			return $result;
1753
 
1754
			}#if end
1755
 
1756
		#如果 $conf["getAccount"] 沒有設定
1757
		if(!isset($conf["getAccount"])){
1758
 
1759
			#設置執行失敗
1760
			$result["status"]="false";
1761
 
1762
			#設置執行錯誤訊息
1763
			$result["error"][]="\$conf[\"getAccount\"]參數尚未設定!";
1764
 
1765
			#回傳結果
1766
			return $result;
1767
 
1768
			}#if end
1769
 
1770
		#如果 $conf["accountVar"] 沒有設定
1771
		if(!isset($conf["accountVar"])){
1772
 
1773
			#則依照預設
1774
 
1775
			#如果預設的變數不存在
1776
			if(!isset($_SESSION["username"])){
1777
 
1778
				#給與空字串
1779
				$result["username"]="";
1780
 
1781
				}#if end
1782
 
1783
			#反之存在
1784
			else{
1785
 
1786
				#取得預設值
1787
				$result["username"]=$_SESSION["username"];
1788
 
1789
				}#else end
1790
 
1791
			}#if end
1792
 
1793
		#反之有設定
1794
		else{
1795
 
1796
			#取得帳戶
1797
			$result["username"]=$conf["accountVar"];
1798
 
1799
			}#else end
1800
 
1801
		#預設使用該php程式的使用者帳號
48 liveuser 1802
		$result["phpUser"]="apache";
1803
 
1804
		#嘗試從系統變數取得使用者名稱
1805
		#函式說明:
1806
		#呼叫shell執行系統命令,並取得回傳的內容.
1807
		#回傳結果:
1808
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
1809
		#$result["error"],錯誤訊息陣列.
1810
		#$result["function"],當前執行的函數名稱.
1811
		#$result["argu"],使用的參數.
1812
		#$result["cmd"],執行的指令內容.
1813
		#$result["fullCmd"],如果參數 $conf["inBackGround"] 為 "true" 則會回傳該值.
1814
		#$result["output"],爲執行完二元碼後的輸出陣列,若 $conf["inBackGround"] 為 "true",則為當下的輸出.
1815
		#$result["tmpFileOutput"],儲存輸出的暫存檔案名稱,若 $conf["inBackGround"] 為 "true" 則會回傳該值.
1816
		#$result["running"],是否還在執行.
1817
		#$result["pid"],pid.
1818
		#$result["statusCode"],執行結束後的代碼.
1819
		#$result["escape"],陣列,儲存重新排序過且已經escape過的指令(key為"cmd")與參數(key為"argu")與兩者組合的一維陣列(key為"array").
1820
		#必填參數:
1821
		#$conf["command"],字串,要執行的指令.
1822
		$conf["external::callShell"]["command"]="env";
1823
		#$conf["fileArgu"],字串,變數__FILE__的內容.
1824
		$conf["external::callShell"]["fileArgu"]=__FILE__;
1825
		#可省略參數:
1826
		#$conf["argu"],陣列字串,指令搭配的參數,預設為空陣列.
1827
		#$conf["external::callShell"]["argu"]=array();
1828
		#$conf["arguIsAddr"],陣列字串,指令搭配的哪些參數為路徑,為路徑的參數會進行轉換以便符合呼叫當前函數的位置,預設不指定,若有3個參數,其中第3個參數為路徑,則表示為array("false","false","true").
1829
		#$conf["arguIsAddr"]=array();
1830
		#$conf["pre"],陣列,要在本指令前執行的每個指令與參數.
1831
		#$conf["pre"][$i]["cmd"],字串,要在本指令前執行的第$i+1個指令.
1832
		#$conf["pre"][$i]["param"],陣列字串,要在本指令前執行的第$i+1個指令的參數.
1833
		#$conf["enablePrintDescription"],字串,是否要印出$conf["printDescription"]的內容,"true"代表要,"false"代表不要,預設為"false".
1834
		#$conf["enablePrintDescription"]="true";
1835
		#$conf["printDescription"],字串,執行該外部程式前要印出來的的文字,預設為$conf["command"]的內容加上使用的$conf["argu"]參數.
1836
		#$conf["printDescription"]="";
1837
		#$conf["escapeshellarg"],字串,是否要啟用過濾參數,用了比較安全,但可能會出錯,"true"為啟用,"false"為不啟用,預設為"false".如果參數為"< 、<< 、> 、>> 、| 、2>&1"之一則不會過濾.
1838
		$conf["external::callShell"]["escapeshellarg"]="true";
1839
		#$conf["thereIsShellVar"],陣列字串,指令搭配的參數"argu",若含有「\'」,則取代為「"」.每個argu參數都要有對應的元素."true"代表要置換.
1840
		#$conf["thereIsShellVar"]=array();
1841
		#$conf["username"],字串,要用什麼使用者來執行,預設為執行php的使用者,該參數不適用於apache環境.
1842
		#$conf["username"]="";
1843
		#$conf["password"],字串,root的使用者密碼,預設不使用密碼,該參數不適用於apache環境.
1844
		#$conf["password"]="";
1845
		#$conf["useScript"],字串,是否要啟用Linux的script指令來記錄輸出,"true"代表要,Fedora的selinux會擋住該操作;"false"代表不要,預設為"false".
1846
		#$conf["useScript"]="";
1847
		#$conf["logFilePath"],字串,當 $conf["useScript"] 為 "true" 時,輸出的內容要暫存到哪裡,預設為 "/tmp/.qbpwcf_tmp/external/callShell/".
1848
		#$conf["logFilePath"]=".qbpwcf_tmp/external/callShell/";
1849
		#$conf["inBackGround"],字串,是否要在背景執行,且不會等待程式執行結束再執行下一個指令,"true"代表是,"false"代表不要,預設為"false",如果$conf["command"]有用「;」區隔的多個指令將會出錯.
1850
		#$conf["inBackGround"]="";
1851
		#$conf["getErr"],字串,"true"代表將錯誤輸出變成標準輸出,反之"false"為不變動.
1852
		#$conf["getErr"]="false";
1853
		#$conf["doNotRun"],字串,"true"代表不執行指令,預設為"false"會執行指令.
1854
		#$conf["doNotRun"]="false";
1855
		#參考資料:
1856
		#exec=>http://php.net/manual/en/function.exec.php
1857
		#escapeshellcmd=>http://php.net/manual/en/function.escapeshellcmd.php
1858
		#escapeshellarg=>http://php.net/manual/en/function.escapeshellarg.php
1859
		#備註:
1860
		#不是所有指令都能用apache的身份執行,目前已知java,javac指令無法執行,使用root身份可能會被selinux阻擋.
1861
		#若使用的 command、argu 參數,含有 ~ 則會被視為字串,若有需要其於 shell 中代表的家目錄位置,可用 fileAccess::tildeToPath 來進行轉換.
1862
		$callShell=external::callShell($conf["external::callShell"]);
1863
		unset($conf["external::callShell"]);
1864
 
1865
		#如果執行失敗
1866
		if($callShell["status"]==="false"){
1867
 
1868
			#設置執行失敗
1869
			$result["status"]="false";
3 liveuser 1870
 
48 liveuser 1871
			#設置執行錯誤訊息
1872
			$result["error"]=$callShell;
1873
 
1874
			#回傳結果
1875
			return $result;
1876
 
1877
			}#if end
1878
 
1879
		#函式說明:
1880
		#檢查多個字串中的每個字串是否有多個關鍵字
1881
		#回傳結果:
1882
		#$result["status"],整體來說,執行是否成功,"true"代表執行成功,"false"代表執行失敗。
1883
		#$result["function"],當前執行的函數名稱.
1884
		#$result["error"],錯誤訊息.
1885
		#$result["argu"],使用的參數.
1886
		#$result["foundedTrueKey"],結果為"true"的被搜尋元素key陣列,與其數值內容.
1887
		#$result["foundedKeyWords"],找到的關鍵字陣列.
1888
		#$result["foundedFalseKey"],結果為"false"的被搜尋元素key陣列,與其數值內容.
1889
		#$result["foundedTrueKeyWords"],二維陣列,各個字串有找到的關鍵字陣列.
1890
		#$result["foundedAll"],是否每個關鍵字都有找到,"true"代表每個都有找到,"false"代表沒有每個都找到.
1891
		#$result["keyWordsIncludeStr"],陣列,儲存有找到關鍵字的來源的索引(sourceIndex)與其內容(sourceVal)跟找到的關鍵字項目陣列(KeyWords).
1892
		#必填參數:
1893
		#$conf["keyWords"],字串陣列,想要搜尋的關鍵字.
1894
		$conf["search::findManyKeyWordsFromManyString"]["keyWords"]=array("LOGNAME=","USERNAME=","USER=","HOME=");
1895
		#$conf["stringArray"],字串陣列,要被搜尋的字串內容陣列.
1896
		$conf["search::findManyKeyWordsFromManyString"]["stringArray"]=$callShell["output"];
1897
		#可省略參數:
1898
		#$conf["completeEqual"],字串,是否內容要完全符合,不能多出任何不符合的內容,預設為"false"不需要完全符合.
1899
		#$conf["completeEqual"]="true";
1900
		#參考資料:
1901
		#無.
1902
		#備註:
1903
		#無.
1904
		$findManyKeyWordsFromManyString=search::findManyKeyWordsFromManyString($conf["search::findManyKeyWordsFromManyString"]);
1905
		unset($conf["search::findManyKeyWordsFromManyString"]);
1906
 
1907
		#debug
1908
		#var_dump(__LINE__,$findManyKeyWordsFromManyString);
1909
 
1910
		#如果執行不正常
1911
		if($findManyKeyWordsFromManyString["status"]==="false"){
1912
 
1913
			#設置執行失敗
1914
			$result["status"]="false";
1915
 
1916
			#設置執行錯誤訊息
1917
			$result["error"]=$findManyKeyWordsFromManyString;
1918
 
1919
			#回傳結果
1920
			return $result;
1921
 
1922
			}#if end
1923
 
1924
		#針對每個有找到關鍵字的來源字串
1925
		foreach($findManyKeyWordsFromManyString["keyWordsIncludeStr"] as $keyWordsIncludeStr){
1926
 
1927
			#如果有多個關鍵字
1928
			if(count($keyWordsIncludeStr["keyWords"])>1){
1929
 
1930
				#跳過
1931
				continue;
1932
 
1933
				}#if end
1934
 
1935
			#解析使用者名稱
1936
			#函式說明:
1937
			#將字串特定關鍵字與其前面的內容剔除
1938
			#回傳結果:
1939
			#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
1940
			#$result["error"],錯誤訊息陣列.
1941
			#$result["warning"],警告訊息鎮列.
1942
			#$result["founded"],有無找到定字串"true"代表有,"false"代表沒有.
1943
			#$result["function"],當前執行的函數名稱.
1944
			#$result["argu"],使用的參數.
1945
			#$result["oriStr"],要處理的原始字串內容.
1946
			#$result["content"],處理好的的字串內容.	
1947
			#必填參數:
1948
			#$conf["stringIn"],字串,要處理的字串.
1949
			$conf["stringProcess::delStrBeforeKeyWord"]["stringIn"]=$keyWordsIncludeStr["sourceVal"];
1950
			#$conf["keyWord"],字串,特定字串.
1951
			$conf["stringProcess::delStrBeforeKeyWord"]["keyWord"]=$keyWordsIncludeStr["keyWords"][0];
1952
			#可省略參數:
1953
			#$conf["recursive"],字串,預設為"false"代表找到一個關鍵字就會停止;"true"代表會即重複執行,知道沒有關鍵字為止.
1954
			$conf["stringProcess::delStrBeforeKeyWord"]["recursive"]="true";
1955
			#$conf["lastResult"],陣列,本函式前次執行的結果,若沒有找到關鍵字,則會改回傳該內容.
1956
			#$conf["lastResult"]=$delStrBeforeKeyWord;
1957
			#參考資料:
1958
			#無.
1959
			#備註:
1960
			#無.
1961
			$delStrBeforeKeyWord=stringProcess::delStrBeforeKeyWord($conf["stringProcess::delStrBeforeKeyWord"]);
1962
			unset($conf["stringProcess::delStrBeforeKeyWord"]);
1963
 
1964
			#debug
1965
			#var_dump(__LINE__,$delStrBeforeKeyWord);
1966
 
1967
			#如果執行不正常
1968
			if($delStrBeforeKeyWord["status"]==="false"){
1969
 
1970
				#設置執行失敗
1971
				$result["status"]="false";
1972
 
1973
				#設置執行錯誤訊息
1974
				$result["error"]=$delStrBeforeKeyWord;
1975
 
1976
				#回傳結果
1977
				return $result;
1978
 
1979
				}#if end
1980
 
1981
			#如果沒有關鍵字
1982
			if($delStrBeforeKeyWord["founded"]==="false"){
1983
 
1984
				#設置執行失敗
1985
				$result["status"]="false";
1986
 
1987
				#設置執行錯誤訊息
1988
				$result["error"]=$delStrBeforeKeyWord;
1989
 
1990
				#回傳結果
1991
				return $result;
1992
 
1993
				}#if end
1994
 
1995
			#如果不是空字串
1996
			if(!empty($delStrBeforeKeyWord["content"])){
1997
 
1998
				#取得使用者名稱
1999
				$result["phpUser"]=basename($delStrBeforeKeyWord["content"]);
2000
 
2001
				#結束 foreach
2002
				break;
2003
 
2004
				}#if end
2005
 
2006
			}#foreach end
2007
 
3 liveuser 2008
		#如果 $_SERVER['HTTP_USER_AGENT'] 存在
2009
		if(isset($_SERVER['HTTP_USER_AGENT'])){
2010
 
2011
			#var_dump($_SERVER["DOCUMENT_ROOT"]);
2012
 
2013
			#設置為web模式
2014
			$result["mode"]="web";
2015
 
2016
			#函式說明:
2017
			#取得用戶端的瀏覽器版本資訊,並回傳。
2018
			#回傳結果:
2019
			#$result,瀏覽器的資訊
2020
			$result["userBrowserType"]=csInformation::getUserBrowserType();
2021
 
2022
			#函式說明:
2023
			#回傳用戶端的IP位置
2024
			#回傳的結果:
2025
			#$result,用戶端的ip
2026
			$result["userIp"]=csInformation::getClientIP();
2027
 
2028
			#函式說明:
2029
			#取得伺服器的IP,並回傳。
2030
			#回傳的結果:
2031
			#$result,伺服端的IP
2032
			#備註:
2033
			#伺服端必須被 localhost 以外的網址連結才會出現正確的IP
2034
			$result["serverIp"]=csInformation::getServerIP();
2035
 
2036
			#取得通訊協定
2037
			$result["scheme"]=$_SERVER["REQUEST_SCHEME"];
2038
 
2039
			#取得伺服器給對外下載網頁的port
2040
			$result["serverPort"]=$_SERVER["SERVER_PORT"];
2041
 
2042
			#取得目前要求執行的網址爲
2043
			$result["requestUri"]=$_SERVER["REQUEST_URI"];
2044
 
2045
			#如果沒有 $_SERVER["HTTP_HOST"] 存在
2046
			if(!isset($_SERVER["HTTP_HOST"])){
2047
 
2048
				#用server端的資訊來組用戶端要求的IP與port
2049
				$result["clientRequestIP"]=$result["serverIp"].":".$result["serverPort"];
2050
 
2051
				}#if end
2052
 
2053
			#反之
2054
			else{
2055
 
2056
				#用戶端要求的IP與port
2057
				$result["clientRequestIP"]=$_SERVER["HTTP_HOST"];
2058
 
2059
				}#else end
2060
 
2061
			#$_SERVER['CONTEXT_PREFIX'], 例如 "/~qbpwcf"
2062
			#$result["CONTEXT_PREFIX"]=$_SERVER['CONTEXT_PREFIX'];
2063
 
2064
			#取得目前的系統時間
2065
			#函式說明:
2066
			#取得系統時間目前的西元年、月、日、時、分、秒
2067
			#回傳的結果:
2068
			#$result["thisWestYear"],當前西元年
2069
			#$result["thisMonth"],當前月份
2070
			#$result["thisDay"],當前日
2071
			#$result["thisHour"],當前小時
2072
			#$result["thisMin"],當前分鐘
2073
			#$result["thisSec"],當前秒數
2074
			#必填的參數
2075
			$conf["time"]["getSystemDateAndTime"]["timeZone"]="Asia/Taipei";#時區代號,可以設定的時區列表:http://www.php.net/manual/en/timezones.php
2076
			$systemDateAndTime=time::getSystemDateAndTime($conf["time"]["getSystemDateAndTime"]);
2077
			unset($conf["time"]["getSystemDateAndTime"]);
2078
 
2079
			#設置 systemDateAndTime
2080
			$result["systemDateAndTime"]=$systemDateAndTime["thisWestYear"].":".$systemDateAndTime["thisMonth"].":".$systemDateAndTime["thisDay"]." ".$systemDateAndTime["thisHour"].":".$systemDateAndTime["thisMin"].":".$systemDateAndTime["thisSec"];
2081
 
2082
			#如果有設置 $conf["saveToDb"]
2083
			if(isset($conf["saveToDb"])){
2084
 
2085
				#如果 $conf["saveToDb"] 為 "true"
2086
				if($conf["saveToDb"]=="true"){
2087
 
2088
					#將連線的資訊記錄到資料庫
2089
					#函式說明:
2090
					#插入資料到指定的資料表裡面,插入資料完畢可以選擇是否要進行轉址。
2091
					#回傳的數值:
2092
					#$result["status"],爲查詢是否成功,若爲"true"則成功,若爲"false"則表示失敗了.
2093
					#$result["error"],錯誤訊息.
2094
					#$result["sql"],執行的sql語法.
2095
					#$result["function"],當前執行的涵式
2096
					#必填的參數:
2097
					$conf["db"]["insertDataToDbBest"]["dbAddress"]=$conf["dbAddress"];#爲mysql-Server的位置
2098
					$conf["db"]["insertDataToDbBest"]["dbAccount"]=$conf["dbAccount"];#爲用於連入mysql-Server時要使用的帳號
2099
					$conf["db"]["insertDataToDbBest"]["selectedDataBaseName"]=$conf["dbName"];#要選取的資料庫名稱
2100
					$conf["db"]["insertDataToDbBest"]["tableName"]=$conf["tableName"];#爲要插入資料的資料表名稱
2101
					$conf["db"]["insertDataToDbBest"]["columnName"]=$conf["columnName"];#爲資料表的項目名稱,
2102
						#例如:$conf["columnName"]=array("columnName1","columnName2","columnName3",...);
2103
					$conf["db"]["insertDataToDbBest"]["insertValue"]=array($result["username"],$result["userBrowserType"],$result["userIp"],$result["requestUri"],$result["systemDateAndTime"]);#爲要插入度數值,
2104
						#例如:$conf["insertValue"]=array("insertValue1","insertValue2","insertValue3",...);
2105
					#可以省略的變數:
2106
 
2107
					#如果有設置資料庫連線密碼
2108
					if(isset($conf["dbPassword"])){
2109
 
2110
						#則套用設定
2111
						$conf["db"]["insertDataToDbBest"]["dbPassword"]=$conf["dbPassword"];#爲連線到mysql-Server時要使用的密碼,可省略,若省略則代表不使用密碼
2112
 
2113
						#var_dump($conf["db"]["insertDataToDbBest"]["dbPassword"]);
2114
 
2115
						}#if end
2116
 
2117
					$insertData=db::insertData($conf["db"]["insertDataToDbBest"]);
2118
					unset($conf["db"]["insertDataToDbBest"]);
2119
 
2120
					#如果寫入到資料表失敗
2121
					if($insertData["status"]=="false"){
2122
 
2123
						#設置執行失敗
2124
						$result["status"]="false";
2125
 
2126
						#設置執行錯誤訊息
2127
						$result["error"]=$insertData;
2128
 
2129
						#回傳結果
2130
						return $result;
2131
 
2132
						}#if end
2133
 
2134
					}#if end
2135
 
2136
				}#if end
2137
 
2138
			#設置伺服器的 domain name
2139
			$result["server_name"]=$_SERVER["SERVER_NAME"];
2140
 
2141
			#設置用戶端要求的完整網址
2142
			$result["requestUriFull"]=$result["scheme"]."://".$result["server_name"].$result["requestUri"];
2143
 
2144
			}#if end
2145
 
2146
		#反之代表是在command模式下
2147
		else{
2148
 
2149
			#預設為空字串,代表非使用者直接觸發
2150
			$result["phpUser"]="";
2151
 
2152
			#如果有 LOGNAME 存在
2153
			if(isset($_SERVER["LOGNAME"])){
2154
 
2155
				#取得使用該php程式的使用者帳號
2156
				$result["phpUser"]=$_SERVER["LOGNAME"];
2157
 
2158
				}#if end
2159
 
2160
			#反之
2161
			else{
2162
 
2163
				/*
2164
				LOGNAME=liveuser
2165
				USERNAME=liveuser
2166
				USER=liveuser
2167
				*/
2168
 
2169
				#嘗試從系統變數取得使用者名稱
2170
				#函式說明:
2171
				#呼叫shell執行系統命令,並取得回傳的內容.
2172
				#回傳結果:
2173
				#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
2174
				#$result["error"],錯誤訊息陣列.
2175
				#$result["function"],當前執行的函數名稱.
2176
				#$result["argu"],使用的參數.
2177
				#$result["cmd"],執行的指令內容.
2178
				#$result["fullCmd"],如果參數 $conf["inBackGround"] 為 "true" 則會回傳該值.
2179
				#$result["output"],爲執行完二元碼後的輸出陣列,若 $conf["inBackGround"] 為 "true",則為當下的輸出.
2180
				#$result["tmpFileOutput"],儲存輸出的暫存檔案名稱,若 $conf["inBackGround"] 為 "true" 則會回傳該值.
2181
				#$result["running"],是否還在執行.
2182
				#$result["pid"],pid.
2183
				#$result["statusCode"],執行結束後的代碼.
2184
				#$result["escape"],陣列,儲存重新排序過且已經escape過的指令(key為"cmd")與參數(key為"argu")與兩者組合的一維陣列(key為"array").
2185
				#必填參數:
2186
				#$conf["command"],字串,要執行的指令.
2187
				$conf["external::callShell"]["command"]="env";
2188
				#$conf["fileArgu"],字串,變數__FILE__的內容.
2189
				$conf["external::callShell"]["fileArgu"]=__FILE__;
2190
				#可省略參數:
2191
				#$conf["argu"],陣列字串,指令搭配的參數,預設為空陣列.
2192
				#$conf["external::callShell"]["argu"]=array();
2193
				#$conf["arguIsAddr"],陣列字串,指令搭配的哪些參數為路徑,為路徑的參數會進行轉換以便符合呼叫當前函數的位置,預設不指定,若有3個參數,其中第3個參數為路徑,則表示為array("false","false","true").
2194
				#$conf["arguIsAddr"]=array();
2195
				#$conf["pre"],陣列,要在本指令前執行的每個指令與參數.
2196
				#$conf["pre"][$i]["cmd"],字串,要在本指令前執行的第$i+1個指令.
2197
				#$conf["pre"][$i]["param"],陣列字串,要在本指令前執行的第$i+1個指令的參數.
2198
				#$conf["enablePrintDescription"],字串,是否要印出$conf["printDescription"]的內容,"true"代表要,"false"代表不要,預設為"false".
2199
				#$conf["enablePrintDescription"]="true";
2200
				#$conf["printDescription"],字串,執行該外部程式前要印出來的的文字,預設為$conf["command"]的內容加上使用的$conf["argu"]參數.
2201
				#$conf["printDescription"]="";
2202
				#$conf["escapeshellarg"],字串,是否要啟用過濾參數,用了比較安全,但可能會出錯,"true"為啟用,"false"為不啟用,預設為"false".如果參數為"< 、<< 、> 、>> 、| 、2>&1"之一則不會過濾.
2203
				$conf["external::callShell"]["escapeshellarg"]="true";
2204
				#$conf["thereIsShellVar"],陣列字串,指令搭配的參數"argu",若含有「\'」,則取代為「"」.每個argu參數都要有對應的元素."true"代表要置換.
2205
				#$conf["thereIsShellVar"]=array();
2206
				#$conf["username"],字串,要用什麼使用者來執行,預設為執行php的使用者,該參數不適用於apache環境.
2207
				#$conf["username"]="";
2208
				#$conf["password"],字串,root的使用者密碼,預設不使用密碼,該參數不適用於apache環境.
2209
				#$conf["password"]="";
2210
				#$conf["useScript"],字串,是否要啟用Linux的script指令來記錄輸出,"true"代表要,Fedora的selinux會擋住該操作;"false"代表不要,預設為"false".
2211
				#$conf["useScript"]="";
2212
				#$conf["logFilePath"],字串,當 $conf["useScript"] 為 "true" 時,輸出的內容要暫存到哪裡,預設為 "/tmp/.qbpwcf_tmp/external/callShell/".
2213
				#$conf["logFilePath"]=".qbpwcf_tmp/external/callShell/";
2214
				#$conf["inBackGround"],字串,是否要在背景執行,且不會等待程式執行結束再執行下一個指令,"true"代表是,"false"代表不要,預設為"false",如果$conf["command"]有用「;」區隔的多個指令將會出錯.
2215
				#$conf["inBackGround"]="";
2216
				#$conf["getErr"],字串,"true"代表將錯誤輸出變成標準輸出,反之"false"為不變動.
2217
				#$conf["getErr"]="false";
2218
				#$conf["doNotRun"],字串,"true"代表不執行指令,預設為"false"會執行指令.
2219
				#$conf["doNotRun"]="false";
2220
				#參考資料:
2221
				#exec=>http://php.net/manual/en/function.exec.php
2222
				#escapeshellcmd=>http://php.net/manual/en/function.escapeshellcmd.php
2223
				#escapeshellarg=>http://php.net/manual/en/function.escapeshellarg.php
2224
				#備註:
2225
				#不是所有指令都能用apache的身份執行,目前已知java,javac指令無法執行,使用root身份可能會被selinux阻擋.
2226
				#若使用的 command、argu 參數,含有 ~ 則會被視為字串,若有需要其於 shell 中代表的家目錄位置,可用 fileAccess::tildeToPath 來進行轉換.
2227
				$callShell=external::callShell($conf["external::callShell"]);
2228
				unset($conf["external::callShell"]);
2229
 
2230
				#如果執行失敗
2231
				if($callShell["status"]==="false"){
2232
 
2233
					#設置執行失敗
2234
					$result["status"]="false";
2235
 
2236
					#設置執行錯誤訊息
2237
					$result["error"]=$callShell;
2238
 
2239
					#回傳結果
2240
					return $result;
2241
 
2242
					}#if end
2243
 
2244
				#函式說明:
2245
				#檢查多個字串中的每個字串是否有多個關鍵字
2246
				#回傳結果:
2247
				#$result["status"],整體來說,執行是否成功,"true"代表執行成功,"false"代表執行失敗。
2248
				#$result["function"],當前執行的函數名稱.
2249
				#$result["error"],錯誤訊息.
2250
				#$result["argu"],使用的參數.
2251
				#$result["foundedTrueKey"],結果為"true"的被搜尋元素key陣列,與其數值內容.
2252
				#$result["foundedKeyWords"],找到的關鍵字陣列.
2253
				#$result["foundedFalseKey"],結果為"false"的被搜尋元素key陣列,與其數值內容.
2254
				#$result["foundedTrueKeyWords"],二維陣列,各個字串有找到的關鍵字陣列.
2255
				#$result["foundedAll"],是否每個關鍵字都有找到,"true"代表每個都有找到,"false"代表沒有每個都找到.
2256
				#$result["keyWordsIncludeStr"],陣列,儲存有找到關鍵字的來源的索引(sourceIndex)與其內容(sourceVal)跟找到的關鍵字項目陣列(KeyWords).
2257
				#必填參數:
2258
				#$conf["keyWords"],字串陣列,想要搜尋的關鍵字.
2259
				$conf["search::findManyKeyWordsFromManyString"]["keyWords"]=array("LOGNAME=","USERNAME=","USER=","HOME=");
2260
				#$conf["stringArray"],字串陣列,要被搜尋的字串內容陣列.
2261
				$conf["search::findManyKeyWordsFromManyString"]["stringArray"]=$callShell["output"];
2262
				#可省略參數:
2263
				#$conf["completeEqual"],字串,是否內容要完全符合,不能多出任何不符合的內容,預設為"false"不需要完全符合.
2264
				#$conf["completeEqual"]="true";
2265
				#參考資料:
2266
				#無.
2267
				#備註:
2268
				#無.
2269
				$findManyKeyWordsFromManyString=search::findManyKeyWordsFromManyString($conf["search::findManyKeyWordsFromManyString"]);
2270
				unset($conf["search::findManyKeyWordsFromManyString"]);
2271
 
2272
				#debug
2273
				#var_dump(__LINE__,$findManyKeyWordsFromManyString);
2274
 
2275
				#如果執行不正常
2276
				if($findManyKeyWordsFromManyString["status"]==="false"){
2277
 
2278
					#設置執行失敗
2279
					$result["status"]="false";
2280
 
2281
					#設置執行錯誤訊息
2282
					$result["error"]=$findManyKeyWordsFromManyString;
2283
 
2284
					#回傳結果
2285
					return $result;
2286
 
2287
					}#if end
2288
 
2289
				#針對每個有找到關鍵字的來源字串
2290
				foreach($findManyKeyWordsFromManyString["keyWordsIncludeStr"] as $keyWordsIncludeStr){
2291
 
2292
					#如果有多個關鍵字
2293
					if(count($keyWordsIncludeStr["keyWords"])>1){
2294
 
2295
						#跳過
2296
						continue;
2297
 
2298
						}#if end
2299
 
2300
					#解析使用者名稱
2301
					#函式說明:
2302
					#將字串特定關鍵字與其前面的內容剔除
2303
					#回傳結果:
2304
					#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
2305
					#$result["error"],錯誤訊息陣列.
2306
					#$result["warning"],警告訊息鎮列.
2307
					#$result["founded"],有無找到定字串"true"代表有,"false"代表沒有.
2308
					#$result["function"],當前執行的函數名稱.
2309
					#$result["argu"],使用的參數.
2310
					#$result["oriStr"],要處理的原始字串內容.
2311
					#$result["content"],處理好的的字串內容.	
2312
					#必填參數:
2313
					#$conf["stringIn"],字串,要處理的字串.
2314
					$conf["stringProcess::delStrBeforeKeyWord"]["stringIn"]=$keyWordsIncludeStr["sourceVal"];
2315
					#$conf["keyWord"],字串,特定字串.
2316
					$conf["stringProcess::delStrBeforeKeyWord"]["keyWord"]=$keyWordsIncludeStr["keyWords"][0];
2317
					#可省略參數:
2318
					#$conf["recursive"],字串,預設為"false"代表找到一個關鍵字就會停止;"true"代表會即重複執行,知道沒有關鍵字為止.
2319
					$conf["stringProcess::delStrBeforeKeyWord"]["recursive"]="true";
2320
					#$conf["lastResult"],陣列,本函式前次執行的結果,若沒有找到關鍵字,則會改回傳該內容.
2321
					#$conf["lastResult"]=$delStrBeforeKeyWord;
2322
					#參考資料:
2323
					#無.
2324
					#備註:
2325
					#無.
2326
					$delStrBeforeKeyWord=stringProcess::delStrBeforeKeyWord($conf["stringProcess::delStrBeforeKeyWord"]);
2327
					unset($conf["stringProcess::delStrBeforeKeyWord"]);
2328
 
2329
					#debug
2330
					#var_dump(__LINE__,$delStrBeforeKeyWord);
2331
 
2332
					#如果執行不正常
2333
					if($delStrBeforeKeyWord["status"]==="false"){
2334
 
2335
						#設置執行失敗
2336
						$result["status"]="false";
2337
 
2338
						#設置執行錯誤訊息
2339
						$result["error"]=$delStrBeforeKeyWord;
2340
 
2341
						#回傳結果
2342
						return $result;
2343
 
2344
						}#if end
2345
 
2346
					#如果沒有關鍵字
2347
					if($delStrBeforeKeyWord["founded"]==="false"){
2348
 
2349
						#設置執行失敗
2350
						$result["status"]="false";
2351
 
2352
						#設置執行錯誤訊息
2353
						$result["error"]=$delStrBeforeKeyWord;
2354
 
2355
						#回傳結果
2356
						return $result;
2357
 
2358
						}#if end
2359
 
2360
					#如果不是空字串
2361
					if(!empty($delStrBeforeKeyWord["content"])){
2362
 
2363
						#取得使用者名稱
2364
						$result["phpUser"]=basename($delStrBeforeKeyWord["content"]);
2365
 
2366
						#結束 foreach
2367
						break;
2368
 
2369
						}#if end
2370
 
2371
					}#foreach end
2372
 
2373
				#debug
2374
				#var_dump(__LINE__,$result);
2375
 
2376
				}#else
2377
 
2378
			#預設的使用者類型為 "regular"
2379
			$result["phpUserType"]="regular";
2380
 
2381
			#判斷使用者是否為管理者賬戶 - start
2382
 
2383
			#如果有抓到使用者名稱
2384
			if(!empty($result["phpUser"])){
2385
 
2386
				#如果是 root 賬號
2387
				if($result["phpUser"]==="root"){
2388
 
2389
					#設置 phpUserType 為 intrinsic
2390
					$result["phpUserType"]="intrinsic";
2391
 
2392
					}#if end
2393
 
2394
				#反之
2395
				else{
2396
 
2397
					#函式說明:
2398
					#呼叫shell執行系統命令,並取得回傳的內容.
2399
					#回傳結果:
2400
					#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
2401
					#$result["error"],錯誤訊息陣列.
2402
					#$result["function"],當前執行的函數名稱.
2403
					#$result["argu"],使用的參數.
2404
					#$result["cmd"],執行的指令內容.
2405
					#$result["fullCmd"],如果參數 $conf["inBackGround"] 為 "true" 則會回傳該值.
2406
					#$result["output"],爲執行完二元碼後的輸出陣列,若 $conf["inBackGround"] 為 "true",則為當下的輸出.
2407
					#$result["tmpFileOutput"],儲存輸出的暫存檔案名稱,若 $conf["inBackGround"] 為 "true" 則會回傳該值.
2408
					#$result["running"],是否還在執行.
2409
					#$result["pid"],pid.
2410
					#$result["statusCode"],執行結束後的代碼.
2411
					#$result["escape"],陣列,儲存重新排序過且已經escape過的指令(key為"cmd")與參數(key為"argu")與兩者組合的一維陣列(key為"array").
2412
					#必填參數:
2413
					#$conf["command"],字串,要執行的指令.
2414
					$conf["external::callShell"]["command"]="userdbctl";
2415
					#$conf["fileArgu"],字串,變數__FILE__的內容.
2416
					$conf["external::callShell"]["fileArgu"]=__FILE__;
2417
					#可省略參數:
2418
					#$conf["argu"],陣列字串,指令搭配的參數,預設為空陣列.
2419
					$conf["external::callShell"]["argu"]=array("user",$result["phpUser"]);
2420
					#$conf["arguIsAddr"],陣列字串,指令搭配的哪些參數為路徑,為路徑的參數會進行轉換以便符合呼叫當前函數的位置,預設不指定,若有3個參數,其中第3個參數為路徑,則表示為array("false","false","true").
2421
					#$conf["arguIsAddr"]=array();
2422
					#$conf["pre"],陣列,要在本指令前執行的每個指令與參數.
2423
					#$conf["pre"][$i]["cmd"],字串,要在本指令前執行的第$i+1個指令.
2424
					#$conf["pre"][$i]["param"],陣列字串,要在本指令前執行的第$i+1個指令的參數.
2425
					#$conf["enablePrintDescription"],字串,是否要印出$conf["printDescription"]的內容,"true"代表要,"false"代表不要,預設為"false".
2426
					#$conf["enablePrintDescription"]="true";
2427
					#$conf["printDescription"],字串,執行該外部程式前要印出來的的文字,預設為$conf["command"]的內容加上使用的$conf["argu"]參數.
2428
					#$conf["printDescription"]="";
2429
					#$conf["escapeshellarg"],字串,是否要啟用過濾參數,用了比較安全,但可能會出錯,"true"為啟用,"false"為不啟用,預設為"false".如果參數為"< 、<< 、> 、>> 、| 、2>&1"之一則不會過濾.
2430
					$conf["external::callShell"]["escapeshellarg"]="true";
2431
					#$conf["thereIsShellVar"],陣列字串,指令搭配的參數"argu",若含有「\'」,則取代為「"」.每個argu參數都要有對應的元素."true"代表要置換.
2432
					#$conf["thereIsShellVar"]=array();
2433
					#$conf["username"],字串,要用什麼使用者來執行,預設為執行php的使用者,該參數不適用於apache環境.
2434
					#$conf["username"]="";
2435
					#$conf["password"],字串,root的使用者密碼,預設不使用密碼,該參數不適用於apache環境.
2436
					#$conf["password"]="";
2437
					#$conf["useScript"],字串,是否要啟用Linux的script指令來記錄輸出,"true"代表要,Fedora的selinux會擋住該操作;"false"代表不要,預設為"false".
2438
					#$conf["useScript"]="";
2439
					#$conf["logFilePath"],字串,當 $conf["useScript"] 為 "true" 時,輸出的內容要暫存到哪裡,預設為 "/tmp/.qbpwcf_tmp/external/callShell/".
2440
					#$conf["logFilePath"]=".qbpwcf_tmp/external/callShell/";
2441
					#$conf["inBackGround"],字串,是否要在背景執行,且不會等待程式執行結束再執行下一個指令,"true"代表是,"false"代表不要,預設為"false",如果$conf["command"]有用「;」區隔的多個指令將會出錯.
2442
					#$conf["inBackGround"]="";
2443
					#$conf["getErr"],字串,"true"代表將錯誤輸出變成標準輸出,反之"false"為不變動.
2444
					#$conf["getErr"]="false";
2445
					#$conf["doNotRun"],字串,"true"代表不執行指令,預設為"false"會執行指令.
2446
					#$conf["doNotRun"]="false";
2447
					#參考資料:
2448
					#exec=>http://php.net/manual/en/function.exec.php
2449
					#escapeshellcmd=>http://php.net/manual/en/function.escapeshellcmd.php
2450
					#escapeshellarg=>http://php.net/manual/en/function.escapeshellarg.php
2451
					#備註:
2452
					#不是所有指令都能用apache的身份執行,目前已知java,javac指令無法執行,使用root身份可能會被selinux阻擋.
2453
					#若使用的 command、argu 參數,含有 ~ 則會被視為字串,若有需要其於 shell 中代表的家目錄位置,可用 fileAccess::tildeToPath 來進行轉換.
2454
					$callShell=external::callShell($conf["external::callShell"]);
2455
					unset($conf["external::callShell"]);
2456
 
2457
					#如果執行失敗
2458
					if($callShell["status"]==="false"){
2459
 
2460
						#設置執行失敗
2461
						$result["status"]="false";
2462
 
2463
						#設置錯誤訊息
2464
						$result["error"]=$callShell;
2465
 
2466
						#回傳結果
2467
						return $result;
2468
 
2469
						}#if end
2470
 
2471
					#範例輸出
2472
					#   User name: liveuser
2473
					# Disposition: regular
2474
					# Last Passw.: Fri 2023-09-22 08:00:00 CST
2475
					#    Login OK: yes
2476
					# Password OK: yes
2477
					#         UID: 1000
2478
					#         GID: 1000 (liveuser)
2479
					# Aux. Groups: wheel
2480
					#              mail
2481
					#              apache
2482
					#              svn
2483
					#   Directory: /var/home/liveuser
2484
					#     Storage: classic
2485
					#       Shell: /bin/bash
2486
					# Passwd Chg.: max 273y 9month 1w 4d 19h 30min/warn 1w
2487
					#Pas. Ch. Now: no
2488
					#   Passwords: 1
2489
					#     Service: io.systemd.NameServiceSwitch
2490
 
2491
					#DISPOSITION 為 intrinsic 者代表為系統賬戶 root
2492
					#DISPOSITION 為 system 者代表為系統賬戶
2493
					#DISPOSITION 為 regular 者代表為一般賬戶
2494
					#一般賬戶的 Aux. Groups 清單若有 wheel 存在,則代表要透過sudo來執行給予系統賬戶權限
2495
 
2496
					#函式說明:
2497
					#檢查多個字串中的每個字串是否有多個關鍵字
2498
					#回傳結果:
2499
					#$result["status"],整體來說,執行是否成功,"true"代表執行成功,"false"代表執行失敗。
2500
					#$result["function"],當前執行的函數名稱.
2501
					#$result["error"],錯誤訊息.
2502
					#$result["argu"],使用的參數.
2503
					#$result["foundedTrueKey"],結果為"true"的被搜尋元素key陣列,與其數值內容.
2504
					#$result["foundedKeyWords"],找到的關鍵字陣列.
2505
					#$result["foundedFalseKey"],結果為"false"的被搜尋元素key陣列,與其數值內容.
2506
					#$result["foundedTrueKeyWords"],二維陣列,各個字串有找到的關鍵字陣列.
2507
					#$result["foundedAll"],是否每個關鍵字都有找到,"true"代表每個都有找到,"false"代表沒有每個都找到.
2508
					#必填參數:
2509
					#$conf["keyWords"],字串陣列,想要搜尋的關鍵字.
2510
					$conf["search::findManyKeyWordsFromManyString"]["keyWords"]=array("Disposition: ");
2511
					#$conf["stringArray"],字串陣列,要被搜尋的字串內容陣列.
2512
					$conf["search::findManyKeyWordsFromManyString"]["stringArray"]=$callShell["output"];
2513
					#可省略參數:
2514
					#$conf["completeEqual"],字串,是否內容要完全符合,不能多出任何不符合的內容,預設為"false"不需要完全符合.
2515
					$conf["search::findManyKeyWordsFromManyString"]["completeEqual"]="false";
2516
					#參考資料:
2517
					#無.
2518
					#備註:
2519
					#無.
2520
					$findManyKeyWordsFromManyString=search::findManyKeyWordsFromManyString($conf["search::findManyKeyWordsFromManyString"]);
2521
					unset($conf["search::findManyKeyWordsFromManyString"]);
2522
 
2523
					#如果執行失敗
2524
					if($findManyKeyWordsFromManyString["status"]==="false"){
2525
 
2526
						#設置執行失敗
2527
						$result["status"]="false";
2528
 
2529
						#設置錯誤訊息
2530
						$result["error"]=$findManyKeyWordsFromManyString;
2531
 
2532
						#回傳結果
2533
						return $result;
2534
 
2535
						}#if end
2536
 
2537
					#如果沒有關鍵字
2538
					if($findManyKeyWordsFromManyString["foundedAll"]==="false"){
2539
 
2540
						#設置執行失敗
2541
						$result["status"]="false";
2542
 
2543
						#設置錯誤訊息
2544
						$result["error"]=$findManyKeyWordsFromManyString;
2545
 
2546
						#回傳結果
2547
						return $result;
2548
 
2549
						}#if end
2550
 
2551
					#針對每個找到的結果
2552
					foreach($findManyKeyWordsFromManyString["foundedTrueKey"] as $strWithKeyWord){
2553
 
2554
						#函式說明:
2555
						#將字串特定關鍵字與其前面的內容剔除
2556
						#回傳結果:
2557
						#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
2558
						#$result["error"],錯誤訊息陣列.
2559
						#$result["warning"],警告訊息鎮列.
2560
						#$result["founded"],有無找到定字串"true"代表有,"false"代表沒有.
2561
						#$result["function"],當前執行的函數名稱.
2562
						#$result["argu"],使用的參數.
2563
						#$result["oriStr"],要處理的原始字串內容.
2564
						#$result["content"],處理好的的字串內容.	
2565
						#必填參數:
2566
						#$conf["stringIn"],字串,要處理的字串.
2567
						$conf["stringProcess::delStrBeforeKeyWord"]["stringIn"]=$strWithKeyWord;
2568
						#$conf["keyWord"],字串,特定字串.
2569
						$conf["stringProcess::delStrBeforeKeyWord"]["keyWord"]="Disposition: ";
2570
						#可省略參數:
2571
						#$conf["recursive"],字串,預設為"false"代表找到一個關鍵字就會停止;"true"代表會即重複執行,知道沒有關鍵字為止.
2572
						#$conf["recursive"]="true";
2573
						#$conf["lastResult"],陣列,本函式前次執行的結果,若沒有找到關鍵字,則會改回傳該內容.
2574
						#$conf["lastResult"]=$delStrBeforeKeyWord;
2575
						#參考資料:
2576
						#無.
2577
						#備註:
2578
						#無.
2579
						$delStrBeforeKeyWord=stringProcess::delStrBeforeKeyWord($conf["stringProcess::delStrBeforeKeyWord"]);
2580
						unset($conf["stringProcess::delStrBeforeKeyWord"]);
2581
 
2582
						#如果執行失敗
2583
						if($delStrBeforeKeyWord["status"]==="false"){
2584
 
2585
							#設置執行失敗
2586
							$result["status"]="false";
2587
 
2588
							#設置錯誤訊息
2589
							$result["error"]=$delStrBeforeKeyWord;
2590
 
2591
							#回傳結果
2592
							return $result;
2593
 
2594
							}#if end
2595
 
2596
						#如果應該要存在的關鍵字不存在
2597
						if($delStrBeforeKeyWord["founded"]==="false"){
2598
 
2599
							#設置執行失敗
2600
							$result["status"]="false";
2601
 
2602
							#設置錯誤訊息
2603
							$result["error"]=$delStrBeforeKeyWord;
2604
 
2605
							#回傳結果
2606
							return $result;
2607
 
2608
							}#if end
2609
 
2610
						#判斷賬戶類型
2611
						switch($delStrBeforeKeyWord["content"]){
2612
 
2613
							#若是 root
2614
							case "intrinsic":
2615
 
2616
								break;
2617
 
2618
							#若是系統賬戶
2619
							case "system";
2620
 
2621
								break;
2622
 
2623
							#若是一般使用者
2624
							case "regular";
2625
 
2626
								#函式說明:
2627
								#檢查多個字串中的每個字串是否有多個關鍵字
2628
								#回傳結果:
2629
								#$result["status"],整體來說,執行是否成功,"true"代表執行成功,"false"代表執行失敗。
2630
								#$result["function"],當前執行的函數名稱.
2631
								#$result["error"],錯誤訊息.
2632
								#$result["argu"],使用的參數.
2633
								#$result["foundedTrueKey"],結果為"true"的被搜尋元素key陣列,與其數值內容.
2634
								#$result["foundedKeyWords"],找到的關鍵字陣列.
2635
								#$result["foundedFalseKey"],結果為"false"的被搜尋元素key陣列,與其數值內容.
2636
								#$result["foundedTrueKeyWords"],二維陣列,各個字串有找到的關鍵字陣列.
2637
								#$result["foundedAll"],是否每個關鍵字都有找到,"true"代表每個都有找到,"false"代表沒有每個都找到.
2638
								#必填參數:
2639
								#$conf["keyWords"],字串陣列,想要搜尋的關鍵字.
2640
								$conf["search::findManyKeyWordsFromManyString"]["keyWords"]=array("Aux. Groups: ");
2641
								#$conf["stringArray"],字串陣列,要被搜尋的字串內容陣列.
2642
								$conf["search::findManyKeyWordsFromManyString"]["stringArray"]=$callShell["output"];
2643
								#可省略參數:
2644
								#$conf["completeEqual"],字串,是否內容要完全符合,不能多出任何不符合的內容,預設為"false"不需要完全符合.
2645
								$conf["search::findManyKeyWordsFromManyString"]["completeEqual"]="false";
2646
								#參考資料:
2647
								#無.
2648
								#備註:
2649
								#無.
2650
								$findManyKeyWordsFromManyString=search::findManyKeyWordsFromManyString($conf["search::findManyKeyWordsFromManyString"]);
2651
								unset($conf["search::findManyKeyWordsFromManyString"]);
2652
 
2653
								#如果執行失敗
2654
								if($findManyKeyWordsFromManyString["status"]==="false"){
2655
 
2656
									#設置執行失敗
2657
									$result["status"]="false";
2658
 
2659
									#設置錯誤訊息
2660
									$result["error"]=$findManyKeyWordsFromManyString;
2661
 
2662
									#回傳結果
2663
									return $result;
2664
 
2665
									}#if end
2666
 
2667
								#初始化執行者所屬的群組
2668
								$groups=array();
2669
 
2670
								#如果沒有關鍵字
2671
								if($findManyKeyWordsFromManyString["foundedAll"]==="false"){
2672
 
2673
									#代表使用者所屬的群組只有自己
2674
									$groups[]=$result["phpUser"];
2675
 
2676
									}#if end
2677
 
2678
								#反之,代表屬於多個群組.
2679
								else{
2680
 
2681
									#針對每個找到的結果
2682
									foreach($findManyKeyWordsFromManyString["foundedTrueKey"] as $groupStartIndex=>$strWithKeyWord){
2683
 
2684
										#函式說明:
2685
										#將字串特定關鍵字與其前面的內容剔除
2686
										#回傳結果:
2687
										#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
2688
										#$result["error"],錯誤訊息陣列.
2689
										#$result["warning"],警告訊息鎮列.
2690
										#$result["founded"],有無找到定字串"true"代表有,"false"代表沒有.
2691
										#$result["function"],當前執行的函數名稱.
2692
										#$result["argu"],使用的參數.
2693
										#$result["oriStr"],要處理的原始字串內容.
2694
										#$result["content"],處理好的的字串內容.	
2695
										#必填參數:
2696
										#$conf["stringIn"],字串,要處理的字串.
2697
										$conf["stringProcess::delStrBeforeKeyWord"]["stringIn"]=$strWithKeyWord;
2698
										#$conf["keyWord"],字串,特定字串.
2699
										$conf["stringProcess::delStrBeforeKeyWord"]["keyWord"]="Aux. Groups: ";
2700
										#可省略參數:
2701
										#$conf["recursive"],字串,預設為"false"代表找到一個關鍵字就會停止;"true"代表會即重複執行,知道沒有關鍵字為止.
2702
										#$conf["recursive"]="true";
2703
										#$conf["lastResult"],陣列,本函式前次執行的結果,若沒有找到關鍵字,則會改回傳該內容.
2704
										#$conf["lastResult"]=$delStrBeforeKeyWord;
2705
										#參考資料:
2706
										#無.
2707
										#備註:
2708
										#無.
2709
										$delStrBeforeKeyWord=stringProcess::delStrBeforeKeyWord($conf["stringProcess::delStrBeforeKeyWord"]);
2710
										unset($conf["stringProcess::delStrBeforeKeyWord"]);
2711
 
2712
										#如果執行失敗
2713
										if($delStrBeforeKeyWord["status"]==="false"){
2714
 
2715
											#設置執行失敗
2716
											$result["status"]="false";
2717
 
2718
											#設置錯誤訊息
2719
											$result["error"]=$delStrBeforeKeyWord;
2720
 
2721
											#回傳結果
2722
											return $result;
2723
 
2724
											}#if end
2725
 
2726
										#如果應該要存在的關鍵字不存在
2727
										if($delStrBeforeKeyWord["founded"]==="false"){
2728
 
2729
											#設置執行失敗
2730
											$result["status"]="false";
2731
 
2732
											#設置錯誤訊息
2733
											$result["error"]=$delStrBeforeKeyWord;
2734
 
2735
											#回傳結果
2736
											return $result;
2737
 
2738
											}#if end
2739
 
2740
										#設置該用戶屬的群組之一
2741
										$groups[]=$delStrBeforeKeyWord["content"];
2742
 
2743
										#取得群組資訊之後的陣列內容
2744
										#函式說明:
2745
										#將陣列進行切割
2746
										#回傳結果:
2747
										#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
2748
										#$reuslt["error"],執行不正常結束的錯訊息陣列.
2749
										#$result["function"],當前執行的函式名稱.
2750
										#$result["content"]["get"],切割出來的陣列.
2751
										#$result["content"]["leftL"],遺留下來的陣列,左邊.
2752
										#$result["content"]["leftR"],遺留下來的陣列,右邊.
2753
										#$result["content"]["ori"],原始的陣列.
2754
										#$result["argu"],使用的參數.
2755
										#必填參數:
2756
										#$conf["array"],要進行分割的陣列.
2757
										$conf["arrays::split"]["array"]=$callShell["output"];
2758
										#$conf["length"],整數,要切幾個元素.
2759
										$conf["arrays::split"]["length"]=0;
2760
										#可省略參數:
2761
										#$conf["offset"],整數,要從第幾個元素開始切,預設為0
2762
										$conf["arrays::split"]["offset"]=$groupStartIndex;
2763
										#參考資料:
2764
										#無.
2765
										#備註:
2766
										#無.
2767
										$split=arrays::split($conf["arrays::split"]);
2768
										unset($conf["arrays::split"]);
2769
 
2770
										#如果執行失敗
2771
										if($split["status"]==="false"){
2772
 
2773
											#設置執行失敗
2774
											$result["status"]="false";
2775
 
2776
											#設置錯誤訊息
2777
											$result["error"]=$split;
2778
 
2779
											#回傳結果
2780
											return $result;
2781
 
2782
											}#if end
2783
 
2784
										#可能為第1個外的群組資訊陣列
2785
										#$split["content"]["leftR"];
2786
 
2787
										#函式說明:
2788
										#檢查多個字串中的每個字串是否有多個關鍵字
2789
										#回傳結果:
2790
										#$result["status"],整體來說,執行是否成功,"true"代表執行成功,"false"代表執行失敗。
2791
										#$result["function"],當前執行的函數名稱.
2792
										#$result["error"],錯誤訊息.
2793
										#$result["argu"],使用的參數.
2794
										#$result["foundedTrueKey"],結果為"true"的被搜尋元素key陣列,與其數值內容.
2795
										#$result["foundedKeyWords"],找到的關鍵字陣列.
2796
										#$result["foundedFalseKey"],結果為"false"的被搜尋元素key陣列,與其數值內容.
2797
										#$result["foundedTrueKeyWords"],二維陣列,各個字串有找到的關鍵字陣列.
2798
										#$result["foundedAll"],是否每個關鍵字都有找到,"true"代表每個都有找到,"false"代表沒有每個都找到.
2799
										#必填參數:
2800
										#$conf["keyWords"],字串陣列,想要搜尋的關鍵字.
2801
										$conf["search::findManyKeyWordsFromManyString"]["keyWords"]=array(":");
2802
										#$conf["stringArray"],字串陣列,要被搜尋的字串內容陣列.
2803
										$conf["search::findManyKeyWordsFromManyString"]["stringArray"]=$split["content"]["leftR"];
2804
										#可省略參數:
2805
										#$conf["completeEqual"],字串,是否內容要完全符合,不能多出任何不符合的內容,預設為"false"不需要完全符合.
2806
										$conf["search::findManyKeyWordsFromManyString"]["completeEqual"]="false";
2807
										#參考資料:
2808
										#無.
2809
										#備註:
2810
										#無.
2811
										$findManyKeyWordsFromManyString=search::findManyKeyWordsFromManyString($conf["search::findManyKeyWordsFromManyString"]);
2812
										unset($conf["search::findManyKeyWordsFromManyString"]);
2813
 
2814
										#如果執行失敗
2815
										if($findManyKeyWordsFromManyString["status"]==="false"){
2816
 
2817
											#設置執行失敗
2818
											$result["status"]="false";
2819
 
2820
											#設置錯誤訊息
2821
											$result["error"]=$findManyKeyWordsFromManyString;
2822
 
2823
											#回傳結果
2824
											return $result;
2825
 
2826
											}#if end
2827
 
2828
										#如果沒有關鍵字
2829
										if($findManyKeyWordsFromManyString["foundedAll"]==="false"){
2830
 
2831
											#設置執行失敗
2832
											$result["status"]="false";
2833
 
2834
											#設置錯誤訊息
2835
											$result["error"]=$findManyKeyWordsFromManyString;
2836
 
2837
											#回傳結果
2838
											return $result;
2839
 
2840
											}#if end
2841
 
2842
										#針對每個群組名稱
2843
										foreach($findManyKeyWordsFromManyString["foundedFalseKey"] as $group){
2844
 
2845
											#記錄group
2846
											$groups[]=trim($group);
2847
 
2848
											}#foreach end 
2849
 
2850
										#檢查有無 wheel 群組在裡面
2851
										#函式說明:
2852
										#檢查一個數值是否與陣列裏面的元素相同,找到一個相符合的元素後就會停止搜尋.
2853
										#回傳結果:
2854
										#$result["status"],"true"表示執行正確,"false"表示執行錯誤.
2855
										#$result["founded"],"true"表示有找到相同的,"false"表示沒有找到相同的.
2856
										#$result["error"],錯誤訊息
2857
										#$result["function"],當前執行的函數名稱
2858
										#$result["argv"],使用的參數
2859
										#$result["equalVarName"],相等的變數名稱或key.
2860
										#$result["equalVarValue"],相等的變數數值內容.
2861
										#必填參數:
2862
										#$conf["conditionElement"],字串,條件元素,要等於的元素內容.
2863
										$conf["cmd::getEqualVar"]["conditionElement"]="wheel";
2864
										#$conf["compareElements"],字串陣列,要比對的陣列變數內容.
2865
										$conf["cmd::getEqualVar"]["compareElements"]=$groups;
2866
										#可省略參數:
2867
										#無.
2868
										#參考資料:
2869
										#無.
2870
										#備註:
2871
										#無.
2872
										$getEqualVar=search::getEqualVar($conf["cmd::getEqualVar"]);
2873
										unset($conf["cmd::getEqualVar"]);
2874
 
2875
										#如果執行失敗
2876
										if($getEqualVar["status"]==="false"){
2877
 
2878
											#設置執行失敗
2879
											$result["status"]="false";
2880
 
2881
											#設置錯誤訊息
2882
											$result["error"]=$getEqualVar;
2883
 
2884
											#回傳結果
2885
											return $result;
2886
 
2887
											}#if end
2888
 
2889
										#如果是 可以用 sudo 的賬號
2890
										if($getEqualVar["founded"]==="true"){
2891
 
2892
											#設置為 wheel 群組的成員
2893
											$result["phpUserType"]="wheel";
2894
 
2895
											}#if end
2896
 
2897
										#只要找到一個,結束foreach
2898
										break;
2899
 
2900
										}#else end
2901
 
2902
								}#foreach end
2903
 
2904
								break;
2905
 
2906
							}#switch end
2907
 
2908
						}#foreach end
2909
 
2910
					}#else end
2911
 
2912
				}#if end
2913
 
2914
			#取得server的ip
2915
			$result["serverIp"]=gethostbyname(gethostname());
2916
 
2917
			#設置通訊協定
2918
			$result["scheme"]="file";
2919
 
2920
			#設置為cmd模式
2921
			$result["mode"]="cmd";
2922
 
2923
			#設置用戶端要求的完整網址
2924
			$result["requestUriFull"]=__FILE__;
2925
 
2926
			#函式說明:
2927
			#將字串特定關鍵字與其前面的內容剔除
2928
			#回傳結果:
2929
			#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
2930
			#$result["error"],錯誤訊息陣列.
2931
			#$result["warning"],警告訊息鎮列.
2932
			#$result["founded"],有無找到定字串"true"代表有,"false"代表沒有.
2933
			#$result["function"],當前執行的函數名稱.
2934
			#$result["argu"],使用的參數.
2935
			#$result["oriStr"],要處理的原始字串內容.
2936
			#$result["content"],處理好的的字串內容.	
2937
			#必填參數:
2938
			#$conf["stringIn"],字串,要處理的字串.
2939
			$conf["stringProcess::delStrBeforeKeyWord"]["stringIn"]=$result["requestUriFull"];
2940
			#$conf["keyWord"],字串,特定字串.
2941
			$conf["stringProcess::delStrBeforeKeyWord"]["keyWord"]="/";
2942
			#可省略參數:
2943
			#$conf["recursive"],字串,預設為"false"代表找到一個關鍵字就會停止;"true"代表會即重複執行,知道沒有關鍵字為止.
2944
			$conf["stringProcess::delStrBeforeKeyWord"]["recursive"]="true";
2945
			#$conf["lastResult"],陣列,本函式前次執行的結果,若沒有找到關鍵字,則回改回傳該內容.
2946
			#$conf["lastResult"]=$delStrBeforeKeyWord;
2947
			#參考資料:
2948
			#無.
2949
			#備註:
2950
			#無.
2951
			$delStrBeforeKeyWord=stringProcess::delStrBeforeKeyWord($conf["stringProcess::delStrBeforeKeyWord"]);
2952
			unset($conf["stringProcess::delStrBeforeKeyWord"]);
2953
 
2954
			#如果執行失敗
2955
			if($delStrBeforeKeyWord["status"]==="false"){
2956
 
2957
				#設置執行失敗
2958
				$result["status"]="false";
2959
 
2960
				#設置執行錯誤訊息
2961
				$result["error"]=$insertData;
2962
 
2963
				#回傳結果
2964
				return $result;
2965
 
2966
				}#if end
2967
 
2968
			#取得目前要求執行的網址爲
2969
			$result["requestUri"]=$delStrBeforeKeyWord["content"];
2970
 
2971
			}#else end
2972
 
2973
		#函式說明:
2974
		#取得apache接收到的header
2975
		#回傳結果:
2976
		#$result["status"],執行成功與否,"true"代表成功,"false"代表失敗.
2977
		#$result["content"],取得的header陣列.
2978
		#$result["function"],當前執行的函數名稱.
2979
		#必填參數:
2980
		#無
2981
		#可省略參數:
2982
		#無 
2983
		#參考資料:
2984
		#無.
2985
		#備註:
2986
		#無.
2987
		$getReceivedHeaders=header::getReceivedHeaders();
2988
 
2989
		#如果執行失敗
2990
		if($getReceivedHeaders["status"]=="false"){
2991
 
2992
			#設置執行失敗
2993
			$result["status"]="false";
2994
 
2995
			#設置執行錯誤訊息
2996
			$result["error"]=$getReceivedHeaders;
2997
 
2998
			#回傳結果
2999
			return $result;
3000
 
3001
			}#if end
3002
 
3003
		#設置取得的 header 陣列
3004
		$result["header"]=$getReceivedHeaders["content"];
3005
 
3006
		#取得讀取到 body 字串
3007
		$result["body"]=file_get_contents('php://input');
3008
 
3009
		#執行到這邊代表執行正常
3010
		$result["status"]="true";
3011
 
3012
		#回傳結果
3013
		return $result;
3014
 
3015
		}#function getConnectionInfo end
3016
 
3017
	/*
3018
	#函式說明:
3019
	#回傳可以連線到伺服器端網頁的port
3020
	#回傳結果:
3021
	#$result,可以連線到伺服器端網頁的port
3022
	#必填參數:
3023
	#無.
3024
	#可省略參數:
3025
	#無.
3026
	#參考資料:
3027
	#http://php.net/manual/en/reserved.variables.server.php
3028
	#備註:
3029
	#無.
3030
	*/
3031
	public static function getClientPort(){
3032
 
3033
		#取得可以連線到伺服器端網頁的port
3034
		$clientPORT = $_SERVER['SERVER_PORT'];
3035
 
3036
		#回傳使用者的IP
3037
		return $clientPORT;
3038
 
3039
		}#function getClientPORT end
3040
 
3041
	/*
3042
	#函式說明:
3043
	#取得 dns/ip 的地理位置資訊
3044
	#回傳結果:
3045
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
3046
	#$result["error"],錯誤訊息陣列.
3047
	#$result["function"],當前執行的函式名稱.
3048
	#$result["content"],取得的回應內容.
3049
	#必填參數:
3050
	#$conf["fileArgu"],字串,__FILE__的內容.
3051
	#$conf["fileArgu"]=__FILE__;
3052
	#可省略參數:
3053
	#$conf["addr"],字串,dns或ip.
3054
	#$conf["addr"]="";
3055
	#參考資料:
3056
	#無.
3057
	#備註:
3058
	#請檢查參數.
3059
	*/
3060
	public static function getIpGeo($conf=array()){
3061
 
3062
		#初始化要回傳的結果
3063
		$result=array();
3064
 
3065
		#取得當前執行的函數名稱
3066
		$result["function"]=__FUNCTION__;
3067
 
3068
		#取得參數
3069
		$result["argu"]=$conf;
3070
 
3071
		#如果 $conf 不為陣列
3072
		if(gettype($conf)!="array"){
3073
 
3074
			#設置執行失敗
3075
			$result["status"]="false";
3076
 
3077
			#設置執行錯誤訊息
3078
			$result["error"][]="\$conf變數須為陣列形態";
3079
 
3080
			#如果傳入的參數為 null
3081
			if($conf==null){
3082
 
3083
				#設置執行錯誤訊息
3084
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
3085
 
3086
				}#if end
3087
 
3088
			#回傳結果
3089
			return $result;
3090
 
3091
			}#if end
3092
 
3093
		#如果沒有變數 addr
3094
		if(!isset($conf["addr"])){
3095
 
3096
			#取得用戶端ip
3097
			#函式說明:
3098
			#回傳用戶端的IP位置
3099
			#回傳的結果:
3100
			#$result,用戶端的ip,若在命令列下執行則回傳getServerIP()的結果.
3101
			$conf["addr"]=csInformation::getClientIP();
3102
 
3103
			}#if end
3104
 
3105
		#查詢相關地理位置資訊的網址
3106
		$endPoint="https://tools.keycdn.com/geo.json?host=".$conf["addr"];
3107
 
3108
		#函式說明:
3109
		#運行curl cmd
3110
		#回傳結果:
3111
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
3112
		#$result["error"],錯誤訊息陣列.
3113
		#$result["function"],當前執行的函式名稱.
3114
		#$result["content"],取得的回應內容.
3115
		#$result["cmd"],執行的command
3116
		#必填參數:
3117
		#$conf["url"],字串,目標url.
3118
		$conf["catchWebContent::curlCmd"]["url"]=$endPoint;
3119
		#$conf["fileArgu"],字串,變數__FILE__的內容.
3120
		$conf["catchWebContent::curlCmd"]["fileArgu"]=$conf["fileArgu"];
3121
		#可省略參數:
3122
		#$conf["header"],字串陣列,要傳送的header.
3123
		$conf["catchWebContent::curlCmd"]["header"]=array("User-Agent: keycdn-tools:https://www.qbpwcf.org");
3124
		#$conf["allowAnySSLcertificate"],字串,是否允許不可信任的SSL憑證,預設為"true".
3125
		#$conf["allowAnySSLcertificate"]="";
3126
		#$conf["postVar"],字串陣列,每個要傳送的post變數名稱(陣列的key值)與數值.
3127
		#$conf["catchWebContent::curlCmd"]["postVar"]=$post;
3128
		#$conf["urlEncode"],字串,post的內容是否要url_encode,"true"代表要,預設為"false"代表不要.
3129
		#$conf["urlEncode"]="false";
3130
		#$conf["agent"],字串,user agent的名稱.
3131
		$conf["catchWebContent::curlCmd"]["agent"]="Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:85.0) Gecko/20100101 Firefox/85.0";
3132
		$curlCmd=catchWebContent::curlCmd($conf["catchWebContent::curlCmd"]);
3133
		unset($conf["catchWebContent::curlCmd"]);
3134
 
3135
		#如果運行失敗
3136
		if($curlCmd["status"]==="false"){
3137
 
3138
			#設置錯誤狀態
3139
			$result["status"]="false";
3140
 
3141
			#設置錯誤訊息
3142
			$result["error"]=$curlCmd;
3143
 
3144
			#回傳結果
3145
			return $result;
3146
 
3147
			}#if end
3148
 
3149
		#設置執行正常的識別
3150
		$result["status"]="true";
3151
 
3152
		/*
3153
		範例回傳結果:
3154
		{
3155
	 		"status":"success",
3156
	   		"description":"Data successfully received.",
3157
	   		"data":{
3158
				"geo":{
3159
					"host":"www.google.com",
3160
					"ip":"74.125.29.147",
3161
					"rdns":"qg-in-f147.1e100.net",
3162
					"asn":"AS15169",
3163
					"isp":"Google Inc. ",
3164
					"country_name":"United States",
3165
					"country_code":"US",
3166
					"region":"CA",
3167
					"city":"Mountain View",
3168
			 		"postal_code":"94043",
3169
			 		"continent_code":"NA",
3170
			 		"latitude":37.419200897217,
3171
			 		"longitude":-122.05740356445,
3172
			 		"dma_code":807,
3173
			 		"area_code":650,
3174
			 		"timezone":"America\/Los_Angeles",
3175
			 		"datetime":"2015-05-22 09:10:35"
3176
			  		}
3177
		   		}
3178
			}
3179
		}
3180
 
3181
		or
3182
 
3183
		{
3184
		   "status":"error",
3185
		   "description":"Hostname did not resolve any IP."
3186
		}
3187
		*/
3188
		#解析回應
3189
		$res=json_decode($curlCmd["content"][0]);
3190
 
3191
		#如果查詢失敗
3192
		if($res->status==="error"){
3193
 
3194
			#設置錯誤狀態
3195
			$result["status"]="false";
3196
 
3197
			#設置錯誤訊息
3198
			$result["error"]=$res;
3199
 
3200
			#回傳結果
3201
			return $result;
3202
 
3203
			}#if end
3204
 
3205
		#取得回應的內容
3206
		$result["content"]=$res->data->geo;
3207
 
3208
		#回傳結果
3209
		return $result;
3210
 
3211
		}#function getIpGeo end
3212
 
3213
	/*
3214
	#函式說明:
3215
	#將ipv4轉換成ipv6
3216
	#回傳結果:
3217
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
3218
	#$result["error"],錯誤訊息陣列.
3219
	#$result["function"],當前執行的函式名稱.
3220
	#$result["content"],取得的回應內容.
3221
	#$result["argu"],使用的參數.
3222
	#必填參數:
3223
	#$conf["ipv4"],字串,人可讀的ipv4字串.
3224
	$conf["ipv4"]="";
3225
	#可省略參數:
3226
	#無.
3227
	#參考資料:
3228
	#http://benjr.tw/17314
3229
	#https://www.ultratools.com/tools/ipv4toipv6
3230
	#備註:
3231
	#無.
3232
	*/
3233
	public static function ipv4toipv6($conf){
3234
 
3235
		#初始化要回傳的結果
3236
		$result=array();
3237
 
3238
		#取得當前執行的函數名稱
3239
		$result["function"]=__FUNCTION__;
3240
 
3241
		#取得參數
3242
		$result["argu"]=$conf;
3243
 
3244
		#如果 $conf 不為陣列
3245
		if(gettype($conf)!="array"){
3246
 
3247
			#設置執行失敗
3248
			$result["status"]="false";
3249
 
3250
			#設置執行錯誤訊息
3251
			$result["error"][]="\$conf變數須為陣列形態";
3252
 
3253
			#如果傳入的參數為 null
3254
			if($conf==null){
3255
 
3256
				#設置執行錯誤訊息
3257
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
3258
 
3259
				}#if end
3260
 
3261
			#回傳結果
3262
			return $result;
3263
 
3264
			}#if end
3265
 
3266
		#函式說明:
3267
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
3268
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
3269
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
3270
		#$result["function"],當前執行的函式名稱.
3271
		#$result["argu"],設置給予的參數.
3272
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
3273
		#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
3274
		#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
3275
		#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
3276
		#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
3277
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
3278
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
3279
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
3280
		#必填寫的參數:
3281
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
3282
		$conf["variable::checkArguments"]["varInput"]=&$conf;
3283
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
3284
		$conf["variable::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
3285
		#可以省略的參數:
3286
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
3287
		$conf["variable::checkArguments"]["mustBeFilledVariableName"]=array("ipv4");
3288
		#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null代表不指定變數形態.
3289
		$conf["variable::checkArguments"]["mustBeFilledVariableType"]=array("string");
3290
		#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
3291
		$conf["variable::checkArguments"]["canBeEmptyString"]="false";
3292
		#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
3293
		#$conf["canNotBeEmpty"]=array();
3294
		#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
3295
		#$conf["canBeEmpty"]=array();
3296
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
3297
		#$conf["skipableVariableCanNotBeEmpty"]=array();
3298
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
3299
		#$conf["skipableVariableName"]=array();
3300
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
3301
		#$conf["skipableVariableType"]=array();
3302
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
3303
		#$conf["skipableVarDefaultValue"]=array("");
3304
		#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
3305
		#$conf["disallowAllSkipableVarIsEmpty"]="";
3306
		#$conf["disallowAllSkipableVarIsEmptyArray"],字串,是否允許每個可省略參數都為空陣列,預設為"true"允許,反之為"false".
3307
		#$conf["disallowAllSkipableVarIsEmptyArray"]="";
3308
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
3309
		#$conf["arrayCountEqualCheck"][]=array();
3310
		#參考資料來源:
3311
		#array_keys=>http://php.net/manual/en/function.array-keys.php
3312
		$checkArguments=variableCheck::checkArguments($conf["variable::checkArguments"]);
3313
		unset($conf["variable::checkArguments"]);
3314
 
3315
		#如果檢查參數失敗
3316
		if($checkArguments["status"]==="false"){
3317
 
3318
			#設置執行不正常
3319
			$result["status"]="false";
3320
 
3321
			#設置錯誤訊息
3322
			$result["error"]=$checkArguments;
3323
 
3324
			#回傳結果
3325
			return $result;
3326
 
3327
			}#if end
3328
 
3329
		#分割每個ipv4的數字
3330
		#函式說明:
3331
		#將固定格式的字串分開,並回傳分開的結果。
3332
		#回傳結果:
3333
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
3334
		#$result["error"],錯誤訊息陣列
3335
		#$result["function"],當前執行的函數名稱.
3336
		#$result["argu"],使用的參數.
3337
		#$result["oriStr"],要分割的原始字串內容
3338
		#$result["dataArray"],爲分割好字串的陣列內容,$result["dataArray"][$i]爲第($i+1)段的內容。
3339
		#$result["dataCounts"],爲總共分成幾段
3340
		#$result["found"],是否有在$conf["stringIn"]找到$conf["spiltSymbol"],"true"代表有找到,"false"代表沒有找到.
3341
		#必填的參數:
3342
		$conf["stringProcess::spiltString"]["stringIn"]=$conf["ipv4"];#要處理的字串。
3343
		$conf["stringProcess::spiltString"]["spiltSymbol"]=".";#爲以哪個符號作爲分割
3344
		#可省略參數:
3345
		#$conf["allowEmptyStr"],是否允許分割出來空字串,預設為"false"不允許;"true"代表允許.
3346
		$conf["stringProcess::spiltString"]["allowEmptyStr"]="false";
3347
		$spiltString=stringProcess::spiltString($conf["stringProcess::spiltString"]);
3348
		unset($conf["stringProcess::spiltString"]);		
3349
 
3350
		#如果執行失敗
3351
		if($spiltString["status"]==="false"){
3352
 
3353
			#設置執行不正常
3354
			$result["status"]="false";
3355
 
3356
			#設置錯誤訊息
3357
			$result["error"]=$spiltString;
3358
 
3359
			#回傳結果
3360
			return $result;
3361
 
3362
			}#if end
3363
 
3364
		#如果沒有找到切割用的關鍵字
3365
		if($spiltString["found"]==="false"){
3366
 
3367
			#設置執行不正常
3368
			$result["status"]="false";
3369
 
3370
			#設置錯誤訊息
3371
			$result["error"]=$spiltString;
3372
 
3373
			#回傳結果
3374
			return $result;
3375
 
3376
			}#if end
3377
 
3378
		#如果沒有切割出4段
3379
		if($spiltString["dataCounts"]!==4){
3380
 
3381
			#設置執行不正常
3382
			$result["status"]="false";
3383
 
3384
			#設置錯誤訊息
3385
			$result["error"]=$spiltString;
3386
 
3387
			#回傳結果
3388
			return $result;
3389
 
3390
			}#if end
3391
 
3392
		#轉換每段ip位置為16進位
3393
		$ipv6="0:0:0:0:0:ffff:".sprintf('%2x',$spiltString["dataArray"][0]).sprintf('%02x',$spiltString["dataArray"][1]).":".sprintf('%2x',$spiltString["dataArray"][2]).sprintf('%02x',$spiltString["dataArray"][3]);
3394
 
3395
		#取得 ipv6
3396
		$result["content"]=$ipv6;
3397
 
3398
		#設置執行正常
3399
		$result["status"]="true";
3400
 
3401
		#回傳結果
3402
		return $result;
3403
 
3404
		}#function ipv4toipv6 end
3405
 
3406
	}#class csInformation end
3407
 
3408
?>