Subversion Repositories php-qbpwcf

Rev

Rev 383 | 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.
239 liveuser 6
    Copyright (C) 2014~2026 MIN ZHI, CHEN
3 liveuser 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
https://www.php.net/manual/en/book.parallel.php
31
備註:
32
建構中
33
*/
34
class threads{
35
 
36
	/*
37
	#函式說明:
38
	#當前類別被呼叫的靜態方法不存在時,將會執行該函數,回報該方法不存在.
39
	#回傳結果:
40
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
41
	#$reuslt["error"],執行不正常結束的錯訊息陣列.
42
	#$result["function"],當前執行的函式名稱.
43
	#必填參數:
44
	#$method,物件,為物件實體或類別名稱,會自動置入該參數.
45
	#$arguments,陣列,為呼叫方法時所用的參數.
46
	#可省略參數:
47
	#無.
48
	#參考資料:
49
	#__call=>http://php.net/manual/en/language.oop5.overloading.php#object.callstatic
50
	#備註:
51
	#無.
52
	*/
53
	public function __call($method,$arguments){
54
 
55
		#取得當前執行的函式
56
		$result["function"]=__FUNCTION__;
57
 
58
		#設置執行不正常
59
		$result["status"]="false";
60
 
61
		#設置執行錯誤
62
		$result["error"][]=__NAMESPACE__ ."/".$method."() 不存在!";
63
 
64
		#設置所丟入的參數
65
		$result["error"][]=$arguments;
66
 
67
		#回傳結果
68
		return $result;
69
 
70
		}#function __call end
71
 
72
	/*
73
	#函式說明:
74
	#當前類別被呼叫的靜態方法不存在時,將會執行該函數,回報該方法不存在.
75
	#回傳結果:
76
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
77
	#$reuslt["error"],執行不正常結束的錯訊息陣列.
78
	#$result["function"],當前執行的函式名稱.
79
	#必填參數:
80
	#$method,物件,為物件實體或類別名稱,會自動置入該參數.
81
	#$arguments,陣列,為呼叫方法時所用的參數.
82
	#可省略參數:
83
	#無.
84
	#參考資料:
85
	#__call=>http://php.net/manual/en/language.oop5.overloading.php#object.callstatic
86
	#備註:
87
	#無.
88
	*/
89
	public static function __callStatic($method,$arguments){
90
 
91
		#取得當前執行的函式
92
		$result["function"]=__FUNCTION__;
93
 
94
		#設置執行不正常
95
		$result["status"]="false";
96
 
97
		#設置執行錯誤
98
		$result["error"][]="欲呼叫的". __NAMESPACE__ ."/".$method."() 不存在!";
99
 
100
		#設置所丟入的參數
101
		$result["error"][]=$arguments;
102
 
103
		#回傳結果
104
		return $result;
105
 
106
		}#function __callStatic end
107
 
108
	/*
109
	#函式說明:
110
	#展示多執行序運作.
111
	#回傳結果:
112
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
113
	#$reuslt["error"],執行不正常結束的錯訊息陣列.
114
	#$result["function"],當前執行的函式名稱.
115
	#必填參數:
116
	#無.
117
	#可省略參數:
118
	#無.
119
	#參考資料:
120
	#無.
121
	#備註:
122
	#無.
123
	改用 proc 試試 https://www.php.net/manual/en/function.proc-open.php
124
	*/
125
	public static function demo(){
226 liveuser 126
 
3 liveuser 127
		#執行demo
128
		var_dump(self::proc_demo());
226 liveuser 129
 
3 liveuser 130
		}#function demo end
131
 
132
	/*
133
	#函式說明:
134
	#透過proc展示多執行序運作.
135
	#回傳結果:
136
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
137
	#$reuslt["error"],執行不正常結束的錯訊息陣列.
138
	#$result["function"],當前執行的函式名稱.
139
	#必填參數:
140
	#無.
141
	#可省略參數:
142
	#無.
143
	#參考資料:
144
	#https://www.php.net/manual/en/function.proc-open.php
145
	#備註:
146
	#無.
147
	*/
148
	public static function proc_demo(){
226 liveuser 149
 
3 liveuser 150
		#初始化 descriptorspec
151
		$descriptorspec = array();
226 liveuser 152
 
3 liveuser 153
		#stdin is a pipe that the child will read from
154
		$descriptorspec[]=array("pipe", "r");
226 liveuser 155
 
3 liveuser 156
		#stdout is a pipe that the child will write to
157
		$descriptorspec[]=array("pipe", "w");
226 liveuser 158
 
3 liveuser 159
		#stderr is a pipe that the child will write to
160
		$descriptorspec[]=array("pipe", "w");
226 liveuser 161
 
162
		#The initial working dir for the command. This must be an absolute directory path, or null if you want to use the default value (the working dir of the current PHP process)
3 liveuser 163
		$cwd = null;
226 liveuser 164
 
165
		#An array with the environment variables for the command that will be run, or null to use the same environment as the current PHP process
3 liveuser 166
		$env = array("QBPWCF" => "Quick Build PHP Website Componment base on Fedora Linux");
226 liveuser 167
 
3 liveuser 168
		#初始化儲存要多執行序執行的程式
169
		$codes=array();
226 liveuser 170
 
3 liveuser 171
		#初始化要demo用的url
172
		$demoUrl="https://qbpwc.sourceforge.io/";
226 liveuser 173
 
3 liveuser 174
		#要多執行序執行的程式1
175
		$codes[]=array("bash","curl -v -L --ssl-reqd ".$demoUrl);
226 liveuser 176
 
3 liveuser 177
		#要多執行序執行的程式2
178
		$codes[]=array("bash","curl -v -L --ssl-reqd ".$demoUrl);
226 liveuser 179
 
3 liveuser 180
		#要多執行序執行的程式3
181
		$codes[]=array("bash","curl -v -L --ssl-reqd ".$demoUrl);
226 liveuser 182
 
3 liveuser 183
		#debug
184
		#var_dump(__LINE__,$codes);
226 liveuser 185
 
3 liveuser 186
		#儲存每個要執行的程式資訊
187
		$process=array();
226 liveuser 188
 
3 liveuser 189
		#針對每個要執行的程式內容
190
		foreach($codes as $index=>$code){
226 liveuser 191
 
3 liveuser 192
			#取得要用什麼程式執行
193
			$executeBy=$code[0];
226 liveuser 194
 
3 liveuser 195
			#取得要執行的程式內容
196
			$code=$code[1];
226 liveuser 197
 
3 liveuser 198
			#運行 php 程式,並儲存 resource
199
			$process[$index]["resource"] = proc_open($executeBy, $descriptorspec, $pipes, $cwd, $env);
226 liveuser 200
 
3 liveuser 201
			#儲存對應的 pipes
202
			$process[$index]["pipes"]=$pipes;
226 liveuser 203
 
3 liveuser 204
			#debug
205
			#var_dump(__LINE__,$process[$index]);
226 liveuser 206
 
3 liveuser 207
			#如果有成功執行
208
			if(is_resource($process[$index]["resource"])){
226 liveuser 209
 
3 liveuser 210
				#$pipes now looks like this:
211
				#0 => writeable handle connected to child stdin
212
				#1 => readable handle connected to child stdout
213
				#2 => readable handle connected to child stdin
226 liveuser 214
 
3 liveuser 215
				#寫入內容作為 $executeBy 的輸入
216
				$bytes2write=fwrite($process[$index]["pipes"][0], $code);
226 liveuser 217
 
3 liveuser 218
				#debug
219
				#var_dump(__LINE__,$bytes2write);
226 liveuser 220
 
3 liveuser 221
				#結束輸入
222
				fclose($process[$index]["pipes"][0]);
226 liveuser 223
 
3 liveuser 224
				}#if end
226 liveuser 225
 
3 liveuser 226
			#反之,代表運行 php 失敗
227
			else{
226 liveuser 228
 
3 liveuser 229
				#初始化暫存執行結果的變數
230
				$cmdRes=array();
226 liveuser 231
 
3 liveuser 232
				#設置執行失敗
233
				$cmdRes["status"]="false";
226 liveuser 234
 
3 liveuser 235
				#設置執行錯誤訊息
236
				$cmdRes["error"]="execute program by \"".$executeBy."\" failed!";
226 liveuser 237
 
3 liveuser 238
				#設置執行結果
239
				$result["content"][]=$cmdRes;
226 liveuser 240
 
3 liveuser 241
				}#else end
226 liveuser 242
 
3 liveuser 243
			}#foreach end
226 liveuser 244
 
3 liveuser 245
		#debug
246
		#var_dump(__LINE__,$process);
226 liveuser 247
 
3 liveuser 248
		#針對每個回饋
249
		foreach($process as $index => $ps){
226 liveuser 250
 
3 liveuser 251
			#取得 proc resource
252
			$resource=$ps["resource"];
226 liveuser 253
 
3 liveuser 254
			#取得標準輸出
255
			$stdout=stream_get_contents($process[$index]["pipes"][1]);
226 liveuser 256
 
3 liveuser 257
			#取得錯誤輸出
258
			$stderr=stream_get_contents($process[$index]["pipes"][2]);
226 liveuser 259
 
3 liveuser 260
			#debug
261
			#var_dump($stdout);
226 liveuser 262
 
3 liveuser 263
			#初始化暫存執行狀況的變數
264
			$cmdRes=array();
226 liveuser 265
 
3 liveuser 266
			#設置執行失敗訊息
267
			$cmdRes["error"]=$stderr;
226 liveuser 268
 
3 liveuser 269
			#設置執行結果
270
			$cmdRes["content"]=$stdout;
226 liveuser 271
 
3 liveuser 272
			#debug
273
			#var_dump($cmdRes);
226 liveuser 274
 
3 liveuser 275
			#結束讀取標準輸出
276
			fclose($process[$index]["pipes"][1]);
226 liveuser 277
 
3 liveuser 278
			#結束讀取錯誤輸出
279
			fclose($process[$index]["pipes"][2]);
226 liveuser 280
 
3 liveuser 281
			#It is important that you close any pipes before calling proc_close in order to avoid a deadlock
282
			$cmdRes["statusCode"] = proc_close($resource);
226 liveuser 283
 
3 liveuser 284
			#debug
285
			#var_dump($cmdRes["statusCode"]);
226 liveuser 286
 
3 liveuser 287
			#預設執行不正常
288
			$cmdRes["status"]="false";
226 liveuser 289
 
3 liveuser 290
			#如果執行正常
291
			if($cmdRes["statusCode"]===0){
226 liveuser 292
 
3 liveuser 293
				#設置執行正常
294
				$cmdRes["status"]="true";
226 liveuser 295
 
3 liveuser 296
				}#if end
226 liveuser 297
 
3 liveuser 298
			#保存結果
299
			$result["content"][]=$cmdRes;
226 liveuser 300
 
3 liveuser 301
			#debug
302
			#var_dump($result);
226 liveuser 303
 
3 liveuser 304
			}#foreach end
226 liveuser 305
 
3 liveuser 306
		#設置執行正常
307
		$result["status"]="true";
226 liveuser 308
 
3 liveuser 309
		#debug
310
		#var_dump($result);
226 liveuser 311
 
3 liveuser 312
		#回傳結果
313
		return $result;
226 liveuser 314
 
3 liveuser 315
		}#function proc_demo end
316
 
317
	/*
318
	#函式說明:
319
	#透過proc來多執行序運作.
320
	#回傳結果:
321
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
322
	#$reuslt["error"],執行不正常結束的錯訊息陣列.
323
	#$result["function"],當前執行的函式名稱.
324
	#$result["argu"],使用的參數.
293 liveuser 325
	#$result["content"],陣列,每個元素為其指令執行的結果訊息陣列,key為"status"代表執行是否正常的識別;key為"statusCode"代表程式結束後回傳給對應executeBy程式的數值,若為"?"則代表程序尚未結束,若為整數0,則代表順利執行結束,可透過proc_update函式進行資訊的更新與取得;key為"content"代表標準輸出,若為resource,則代表為pipe;key為"error"代表非標準輸出,若為resource,則代表為pipe;key為"input"代表成功輸入的指令;key為"process"代表該程序經proc_open後的process source;key為"proc_get_status"代表程序的資訊.
3 liveuser 326
	#必填參數:
66 liveuser 327
	#$conf["cmds"],字串陣列,每個元素代表單一程序要執行的指令與參數.
3 liveuser 328
	#$conf["cmds"]=array();
329
	#可省略參數:
330
	#$conf["wait"],字串,是否需要等待所有程序結束,預設為"true"要等待;反之為"false"不要等待.
331
	#$conf["wait"]="false";
140 liveuser 332
	#$conf["timeout"],字串陣列,每個元素代表單一程序執行的最大等待秒數,超過後將會強迫停止執行,僅當wait參數為"true"時生效.
333
	#$conf["timeout"]=array("10");
3 liveuser 334
	#$conf["workingDir"],字串陣列,個別程式執行時的家目錄,預設不指定.
335
	#$conf["workingDir"]=array("path");
336
	#$conf["envs"],2維字串陣列,每個元素代表個別程式執行時的指定環境變數,key變數名稱;value為變數內容.預設為array("QBPWCF" => "Quick Build PHP Website Componment base on Fedora Linux");
337
	#$conf["envs"]=array(array("key"=>"value"));
338
	#$conf["executeBy"],字串陣列,每個元素代表個別指令要用什麼程式執行,預設為"bash".
339
	#$conf["executeBy"]=array("bash");
340
	#參考資料:
341
	#https://www.php.net/manual/en/function.proc-open.php
342
	#https://www.php.net/manual/en/function.proc-get-status.php
140 liveuser 343
	#https://www.php.net/manual/en/function.proc-terminate.php
3 liveuser 344
	#備註:
249 liveuser 345
	#當wait參數為"true"時,會自動解析stdout與stderr,因此不用再透過 self::proc_update 來更新.
346
	#當wait參數不為"true"時,若需要取得當下的執行狀況,請使用 self::proc_update 來更新.
3 liveuser 347
	*/
348
	public static function proc(&$conf){
226 liveuser 349
 
3 liveuser 350
		#初始化要回傳的變數
351
		$result=array();
352
 
353
		#初始化當前執行的函數名稱
354
		$result["function"]=__FUNCTION__;
355
 
356
		#如果 $conf 不為陣列
66 liveuser 357
		if(gettype($conf)!=="array"){
226 liveuser 358
 
3 liveuser 359
			#設置執行失敗
360
			$result["status"]="false";
226 liveuser 361
 
3 liveuser 362
			#設置執行錯誤訊息
363
			$result["error"][]="\$conf變數須為陣列形態";
364
 
365
			#如果傳入的參數為 null
66 liveuser 366
			if($conf===null){
226 liveuser 367
 
3 liveuser 368
				#設置執行錯誤訊息
369
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
226 liveuser 370
 
3 liveuser 371
				}#if end
372
 
373
			#回傳結果
374
			return $result;
226 liveuser 375
 
3 liveuser 376
			}#if end
226 liveuser 377
 
3 liveuser 378
		#取得使用的參數
379
		$result["argu"]=$conf;
226 liveuser 380
 
3 liveuser 381
		#函式說明:
382
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容.
383
		#回傳結果:
384
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
385
		#$result["error"],執行不正常結束的錯訊息陣列.
386
		#$result["simpleError"],簡單表示的錯誤訊息.
387
		#$result["function"],當前執行的函式名稱.
388
		#$result["argu"],設置給予的參數.
389
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
390
		#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
391
		#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
392
		#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
393
		#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
394
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
395
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
396
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
397
		#必填參數:
398
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
399
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
400
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
401
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
402
		#可省略參數:
403
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
404
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("cmds");
405
		#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null代表不指定變數形態.
406
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("array");
407
		#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
408
		#$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";
409
		#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
410
		#$conf["canNotBeEmpty"]=array();
411
		#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
412
		#$conf["canBeEmpty"]=array();
413
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
140 liveuser 414
		$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("wait","workingDir","envs","executeBy","timeout");
3 liveuser 415
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
140 liveuser 416
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("wait","workingDir","envs","executeBy","timeout");
3 liveuser 417
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
140 liveuser 418
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","array","array","array","array");
3 liveuser 419
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
140 liveuser 420
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("true",null,null,null,null);
3 liveuser 421
		#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
422
		#$conf["disallowAllSkipableVarIsEmpty"]="";
423
		#$conf["disallowAllSkipableVarIsEmptyArray"],字串,是否允許每個可省略參數都為空陣列,預設為"true"允許,反之為"false".
424
		#$conf["disallowAllSkipableVarIsEmptyArray"]="";
425
		#$conf["disallowAllSkipableVarNotExist"],字串,是否不允許每個可省略參數都不存在,預設為"false"代表允許,反之為"true".
426
		#$conf["disallowAllSkipableVarNotExist"]="";
427
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
428
		#$conf["variableCheck::checkArguments"]["arrayCountEqualCheck"][]=array("");
429
		#參考資料:
430
		#array_keys=>http://php.net/manual/en/function.array-keys.php
431
		#備註:
432
		#無.
433
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
434
		unset($conf["variableCheck::checkArguments"]);
226 liveuser 435
 
3 liveuser 436
		#如果 $checkArguments["status"] 等於 "false"
437
		if($checkArguments["status"]==="false"){
226 liveuser 438
 
3 liveuser 439
			#設置錯誤識別
440
			$result["status"]="false";
226 liveuser 441
 
3 liveuser 442
			#設置錯誤訊息
443
			$result["error"]=$checkArguments;
226 liveuser 444
 
3 liveuser 445
			#回傳結果
446
			return $result;
226 liveuser 447
 
3 liveuser 448
			}#if end
226 liveuser 449
 
3 liveuser 450
		#如果 $checkArguments["passed"] 等於 "false"
451
		if($checkArguments["passed"]==="false"){
226 liveuser 452
 
3 liveuser 453
			#設置錯誤識別
454
			$result["status"]="false";
226 liveuser 455
 
3 liveuser 456
			#設置錯誤訊息
457
			$result["error"]=$checkArguments;
226 liveuser 458
 
3 liveuser 459
			#回傳結果
460
			return $result;
226 liveuser 461
 
3 liveuser 462
			}#if end
226 liveuser 463
 
3 liveuser 464
		#初始化 descriptorspec
465
		$descriptorspec = array();
226 liveuser 466
 
3 liveuser 467
		#stdin is a pipe that the child will read from
468
		$descriptorspec[]=array("pipe", "r");
226 liveuser 469
 
3 liveuser 470
		#stdout is a pipe that the child will write to
471
		$descriptorspec[]=array("pipe", "w");
226 liveuser 472
 
3 liveuser 473
		#stderr is a pipe that the child will write to
474
		$descriptorspec[]=array("pipe", "w");
226 liveuser 475
 
476
		#The initial working dir for the command. This must be an absolute directory path, or null if you want to use the default value (the working dir of the current PHP process)
3 liveuser 477
		$defaultCWD = null;
226 liveuser 478
 
3 liveuser 479
		#初始化儲存每個指令的working dir.
480
		$cwds=array();
226 liveuser 481
 
3 liveuser 482
		#有幾個指令就執行幾次
483
		for($i=0;$i<count($conf["cmds"]);$i++){
226 liveuser 484
 
3 liveuser 485
			#設置預設working dir
486
			$cwds[]=$defaultCWD;
226 liveuser 487
 
3 liveuser 488
			}#for end
226 liveuser 489
 
3 liveuser 490
		#如果有設置 workingDir
491
		if(isset($conf["workingDir"])){
226 liveuser 492
 
3 liveuser 493
			#如果數量符合
494
			if(count($conf["cmds"])===count($conf["workingDir"])){
226 liveuser 495
 
3 liveuser 496
				#有幾個指令就執行幾次
497
				for($i=0;$i<count($conf["cmds"]);$i++){
226 liveuser 498
 
3 liveuser 499
					#預設為指定數值
340 liveuser 500
					$cwds[$i]=$conf["workingDir"][$i];
226 liveuser 501
 
3 liveuser 502
					}#for end
226 liveuser 503
 
3 liveuser 504
				}#if end
226 liveuser 505
 
3 liveuser 506
			}#if end
226 liveuser 507
 
508
		#An array with the environment variables for the command that will be run, or null to use the same environment as the current PHP process
3 liveuser 509
		$defaultENV = array("QBPWCF" => "Quick Build PHP Website Componment base on Fedora Linux");
226 liveuser 510
 
3 liveuser 511
		#初始化儲存每個指令的環境變數.
512
		$envs=array();
226 liveuser 513
 
3 liveuser 514
		#有幾個指令就執行幾次
515
		for($i=0;$i<count($conf["cmds"]);$i++){
226 liveuser 516
 
3 liveuser 517
			#設置預設環境變數
518
			$envs[]=$defaultENV;
226 liveuser 519
 
3 liveuser 520
			}#for end
226 liveuser 521
 
3 liveuser 522
		#如果有設置 envs
523
		if(isset($conf["envs"])){
226 liveuser 524
 
3 liveuser 525
			#如果數量符合
526
			if(count($conf["cmds"])===count($conf["envs"])){
226 liveuser 527
 
3 liveuser 528
				#有幾個指令就執行幾次
529
				for($i=0;$i<count($conf["cmds"]);$i++){
226 liveuser 530
 
3 liveuser 531
					#預設為指定數值
532
					$envs[]=$conf["envs"][$i];
226 liveuser 533
 
3 liveuser 534
					}#for end
226 liveuser 535
 
3 liveuser 536
				}#if end
226 liveuser 537
 
3 liveuser 538
			}#if end
226 liveuser 539
 
3 liveuser 540
		#預設程式都透過 bash 來執行
541
		$defaultExecBy="bash";
226 liveuser 542
 
3 liveuser 543
		#初始化儲存每個指令要透過什麼程式執行
544
		$executeBys=array();
226 liveuser 545
 
3 liveuser 546
		#有幾個指令就執行幾次
547
		for($i=0;$i<count($conf["cmds"]);$i++){
226 liveuser 548
 
3 liveuser 549
			#設置預設環境變數
550
			$executeBys[]=$defaultExecBy;
226 liveuser 551
 
3 liveuser 552
			}#for end
226 liveuser 553
 
3 liveuser 554
		#如果有設置 executeBy
555
		if(isset($conf["executeBy"])){
226 liveuser 556
 
3 liveuser 557
			#如果數量符合
558
			if(count($conf["cmds"])===count($conf["executeBy"])){
226 liveuser 559
 
3 liveuser 560
				#初始化儲存每個指令要透過什麼程式執行
561
				$executeBys=array();
226 liveuser 562
 
3 liveuser 563
				#有幾個指令就執行幾次
564
				for($i=0;$i<count($conf["cmds"]);$i++){
226 liveuser 565
 
3 liveuser 566
					#預設為指定數值
567
					$executeBys[]=$conf["executeBy"][$i];
226 liveuser 568
 
3 liveuser 569
					}#for end
226 liveuser 570
 
3 liveuser 571
				}#if end
226 liveuser 572
 
3 liveuser 573
			}#if end
226 liveuser 574
 
3 liveuser 575
		#儲存每個要執行的程式資訊
576
		$process=array();
226 liveuser 577
 
3 liveuser 578
		#debug
579
		#var_dump(__LINE__,$executeBys);
226 liveuser 580
 
3 liveuser 581
		#針對每個指令與參數字串
582
		foreach($conf["cmds"] as $index=>$cmdAndArguStr){
226 liveuser 583
 
3 liveuser 584
			#debug
585
			#var_dump(__LINE__,$executeBys[$index]);
226 liveuser 586
 
340 liveuser 587
			#debug
588
			#var_dump(__LINE__,$cwds[$index]);
589
 
3 liveuser 590
			#運行 php 程式,並儲存 resource
591
			$process[$index]["resource"] = proc_open($executeBys[$index], $descriptorspec, $pipes, $cwds[$index], $envs[$index]);
226 liveuser 592
 
3 liveuser 593
			#儲存對應的 pipes
594
			$process[$index]["pipes"]=$pipes;
226 liveuser 595
 
3 liveuser 596
			#如果有成功執行
597
			if(is_resource($process[$index]["resource"])){
226 liveuser 598
 
3 liveuser 599
				#$pipes now looks like this:
600
				#0 => writeable handle connected to child stdin
601
				#1 => readable handle connected to child stdout
602
				#2 => readable handle connected to child stdin
226 liveuser 603
 
3 liveuser 604
				#寫入內容作為 $executeBy 的輸入
605
				$bytes2write=fwrite($process[$index]["pipes"][0], $cmdAndArguStr);
226 liveuser 606
 
3 liveuser 607
				#如果有完整寫入指令
608
				if($bytes2write===strlen($cmdAndArguStr)){
226 liveuser 609
 
3 liveuser 610
					#記錄輸入的指令
611
					$process[$index]["input"]=$cmdAndArguStr;
226 liveuser 612
 
3 liveuser 613
					}#if end
226 liveuser 614
 
3 liveuser 615
				#反之
616
				else{
226 liveuser 617
 
3 liveuser 618
					#設置錯誤識別
619
					$result["status"]="false";
226 liveuser 620
 
3 liveuser 621
					#設置錯誤訊息
622
					$result["error"][]="將指令(".$cmdAndArguStr.")輸入(".$executeBys[$index].")失敗";
226 liveuser 623
 
3 liveuser 624
					#回傳結果
625
					return $result;
226 liveuser 626
 
3 liveuser 627
					}#else end
226 liveuser 628
 
3 liveuser 629
				}#if end
226 liveuser 630
 
3 liveuser 631
			#反之,代表運行 $executeBys[$index] 失敗
632
			else{
226 liveuser 633
 
3 liveuser 634
				#初始化暫存執行結果的變數
635
				$cmdRes=array();
226 liveuser 636
 
3 liveuser 637
				#設置執行失敗
638
				$cmdRes["status"]="false";
226 liveuser 639
 
3 liveuser 640
				#設置執行錯誤訊息
641
				$cmdRes["error"]="execute program by \"".$executeBys[$index]."\" failed!";
226 liveuser 642
 
3 liveuser 643
				#設置執行結果
644
				$result["content"][]=$cmdRes;
226 liveuser 645
 
3 liveuser 646
				}#else end
396 liveuser 647
 
648
			#結束輸入
649
			fclose($process[$index]["pipes"][0]);
226 liveuser 650
 
3 liveuser 651
			}#foreach end
226 liveuser 652
 
3 liveuser 653
		#針對每個回饋
654
		foreach($process as $index => $ps){
226 liveuser 655
 
3 liveuser 656
			#取得 proc resource
657
			$resource=&$ps["resource"];
226 liveuser 658
 
3 liveuser 659
			#取得標準輸出的pipe
660
			$stdout=$process[$index]["pipes"][1];
226 liveuser 661
 
3 liveuser 662
			#取得非標準輸出的pipe
663
			$stderr=$process[$index]["pipes"][2];
226 liveuser 664
 
3 liveuser 665
			#如果需要等待程序執行完
666
			if($conf["wait"]==="true"){
226 liveuser 667
 
140 liveuser 668
				#如果有設置  timeout
669
				if(isset($conf["timeout"])){
226 liveuser 670
 
140 liveuser 671
					#如果有設置該程序的 timeout
672
					if(isset($conf["timeout"][$index])){
226 liveuser 673
 
140 liveuser 674
						#避免 timeout 仍然會等待程序結束 - start
226 liveuser 675
 
140 liveuser 676
						#不讓標準輸出會阻擋程式執行
677
						stream_set_blocking($stdout,false);
226 liveuser 678
 
140 liveuser 679
						#不讓錯誤輸出會阻擋程式執行
680
						stream_set_blocking($stderr,false);
226 liveuser 681
 
140 liveuser 682
						#避免 timeout 仍然會等待程序結束 - end
226 liveuser 683
 
140 liveuser 684
						}#if end
226 liveuser 685
 
140 liveuser 686
					}#if end
226 liveuser 687
 
3 liveuser 688
				}#if end
226 liveuser 689
 
3 liveuser 690
			#反之
691
			else{
226 liveuser 692
 
3 liveuser 693
				#不讓標準輸出會阻擋程式執行
694
				stream_set_blocking($stdout,false);
226 liveuser 695
 
3 liveuser 696
				#不讓錯誤輸出會阻擋程式執行
697
				stream_set_blocking($stderr,false);
226 liveuser 698
 
3 liveuser 699
				}#else end
226 liveuser 700
 
3 liveuser 701
			#初始化暫存執行狀況的變數
702
			$cmdRes=array();
326 liveuser 703
 
704
			#初始化標準輸出預設為空
705
			$cmdRes["content"]="";
706
 
707
			#初始化標準錯誤輸出預設為空
708
			$cmdRes["error"]="";
226 liveuser 709
 
3 liveuser 710
			#取得 proc_open 後的 process resource
711
			$cmdRes["process"]=$resource;
226 liveuser 712
 
3 liveuser 713
			#取得 process 的狀態,包含 pid 等資訊,若程式已經結束,則會自動將pipes關閉,再proc_close.
714
			$cmdRes["proc_get_status"]=proc_get_status($resource);
226 liveuser 715
 
3 liveuser 716
			#預設 statusCode 為 "?" 代表尚未 proc_close
717
			$cmdRes["statusCode"]="?";
226 liveuser 718
 
3 liveuser 719
			#如果執行已經結束,有回傳exitcode
720
			if($cmdRes["proc_get_status"]["exitcode"]!==-1){
226 liveuser 721
 
3 liveuser 722
				#設置 statusCode
723
				$cmdRes["statusCode"]=&$cmdRes["proc_get_status"]["exitcode"];
226 liveuser 724
 
312 liveuser 725
				#當有標準輸出時
726
				while(!feof($stdout)){
727
 
728
					#取得標準輸出
326 liveuser 729
					$cmdRes["content"]=$cmdRes["content"].fread($stdout,2048);
312 liveuser 730
 
731
					}#while end
732
 
733
				#當有錯誤輸出時
734
				while(!feof($stderr)){
735
 
326 liveuser 736
					$cmdRes["error"]=$cmdRes["content"].fread($stderr,2048);
312 liveuser 737
 
738
					}#while end
739
 
740
				#關閉其 proc 的運行 - start
741
 
742
				#關閉標準輸出的pipe
743
				fclose($stdout);
744
 
745
				#關閉標準錯誤的pipe
746
				fclose($stderr);
747
 
748
				#強制結束程序
749
				proc_terminate($resource);
750
 
751
				#結束proc.
752
				proc_close($resource);
753
 
754
				#關閉其 proc 的運行 - end
755
 
3 liveuser 756
				}#if end
226 liveuser 757
 
3 liveuser 758
			#反之未執行完畢,且需要等待程序執行完
759
			else if($conf["wait"]==="true"){
226 liveuser 760
 
140 liveuser 761
				#預設已經執行0秒
762
				$runtime=0;
226 liveuser 763
 
3 liveuser 764
				#無窮迴圈
765
				while(true){
226 liveuser 766
 
140 liveuser 767
					#debug
768
					#var_dump(__LINE__,$runtime,$conf["timeout"]);
226 liveuser 769
 
140 liveuser 770
					#如果有設置  timeout
771
					if(isset($conf["timeout"])){
226 liveuser 772
 
140 liveuser 773
						#如果有設置該程序的 timeout
774
						if(isset($conf["timeout"][$index])){
226 liveuser 775
 
140 liveuser 776
							#如果執行秒數逾時了
777
							if( $runtime > (int)($conf["timeout"][$index]) ){
226 liveuser 778
 
140 liveuser 779
								#debug
780
								#var_dump(__LINE__,"timeout!");
226 liveuser 781
 
140 liveuser 782
								#關閉標準輸出的pipe
783
								fclose($stdout);
226 liveuser 784
 
140 liveuser 785
								#關閉標準錯誤的pipe
786
								fclose($stderr);
226 liveuser 787
 
140 liveuser 788
								#強制結束程序
789
								proc_terminate($resource);
226 liveuser 790
 
140 liveuser 791
								#結束proc.
792
								proc_close($resource);
226 liveuser 793
 
159 liveuser 794
								#結束無窮迴圈
795
								break;
226 liveuser 796
 
140 liveuser 797
								}#if end
226 liveuser 798
 
140 liveuser 799
							}#if end
226 liveuser 800
 
140 liveuser 801
						}#if end
226 liveuser 802
 
3 liveuser 803
					#取得 process 的狀態,包含 pid 等資訊,若程式已經結束,則會自動將pipes關閉,再proc_close.
804
					$cmdRes["proc_get_status"]=proc_get_status($resource);
226 liveuser 805
 
3 liveuser 806
					#如果執行已經結束,有回傳exitcode
807
					if($cmdRes["proc_get_status"]["exitcode"]!==-1){
226 liveuser 808
 
3 liveuser 809
						#設置 statusCode
810
						$cmdRes["statusCode"]=&$cmdRes["proc_get_status"]["exitcode"];
249 liveuser 811
 
159 liveuser 812
						#結束無窮迴圈
3 liveuser 813
						break;
226 liveuser 814
 
3 liveuser 815
						}#if end
226 liveuser 816
 
3 liveuser 817
					#等待1秒鐘
818
					sleep(1);
226 liveuser 819
 
140 liveuser 820
					#執行秒數+1
821
					$runtime++;
226 liveuser 822
 
3 liveuser 823
					}#while end
226 liveuser 824
 
3 liveuser 825
				}#if end
226 liveuser 826
 
3 liveuser 827
			#設置執行失敗訊息
828
			$cmdRes["error"]=$stderr;
226 liveuser 829
 
3 liveuser 830
			#設置執行結果
831
			$cmdRes["content"]=$stdout;
226 liveuser 832
 
3 liveuser 833
			#如果有成功輸入指令
834
			if(isset($process[$index]["input"])){
226 liveuser 835
 
3 liveuser 836
				#設置有輸入的指令
837
				$cmdRes["input"]=$process[$index]["input"];
226 liveuser 838
 
3 liveuser 839
				}#if end
226 liveuser 840
 
3 liveuser 841
			#預設執行不正常
842
			$cmdRes["status"]="false";
226 liveuser 843
 
3 liveuser 844
			#如果執行正常 或 等於"?"(代表尚未 proc_close)
845
			if($cmdRes["statusCode"]===0 || $cmdRes["statusCode"]==="?"){
226 liveuser 846
 
3 liveuser 847
				#設置執行正常
848
				$cmdRes["status"]="true";
226 liveuser 849
 
3 liveuser 850
				}#if end
226 liveuser 851
 
3 liveuser 852
			#保存結果
853
			$result["content"][]=$cmdRes;
226 liveuser 854
 
3 liveuser 855
			}#foreach end
226 liveuser 856
 
249 liveuser 857
		#如果要等待程序執行結束
858
		if($conf["wait"]==="true"){
859
 
860
			#函式說明:
861
			#更新透過proc執行的多程序資訊.
862
			#回傳結果:
863
			#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
864
			#$reuslt["error"],執行不正常結束的錯訊息陣列.
865
			#$result["function"],當前執行的函式名稱.
866
			#$result["argu"],使用的參數.
867
			#$result["content"],陣列,每個元素為其指令執行的結果訊息陣列,key為"status"代表執行是否正常的識別;key為"statusCode"代表程式結束後回傳給對應executeBy程式的數值,若為"?"則代表程序尚未結束,可透過proc_update函式進行資訊的更新與取得;key為"output"代表標準輸出,若為resource,則代表為pipe;key為"error"代表非標準輸出,若為resource,則代表為pipe;key為"input"代表成功輸入的指令;key為"process"代表該程序經proc_open後的process source;key為"proc_get_status"代表程序的資訊.
868
			#必填參數:
869
			#$conf["procs"],陣列,運行self::proc後回傳的content.
870
			$conf["threads::proc_update"]["procs"]=$result["content"];
871
			#可省略參數:
872
			#無.
873
			#參考資料:
874
			#無.
875
			#備註:
876
			#無.
877
			$proc_update=threads::proc_update($conf["threads::proc_update"]);
878
			unset($conf["threads::proc_update"]);
879
 
880
			#如果執行異常
881
			if($proc_update["status"]==="false"){
882
 
883
				#設置錯誤識別
884
				$result["status"]="false";
885
 
886
				#設置錯誤訊息
887
				$result["error"]=$proc_update;
888
 
889
				#回傳結果
890
				return $result;
891
 
892
				}#if end
893
 
894
			#debug
895
			#var_dump(__LINE__,$proc_update);exit;
896
 
897
			#取得執行後的標準輸出
898
			$result["content"]=$proc_update["content"];
899
 
900
			}#if end
901
 
3 liveuser 902
		#設置執行正常
903
		$result["status"]="true";
226 liveuser 904
 
3 liveuser 905
		#回傳結果
906
		return $result;
226 liveuser 907
 
3 liveuser 908
		}#function proc end
909
 
910
	/*
911
	#函式說明:
912
	#更新透過proc執行的多程序資訊.
913
	#回傳結果:
914
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
915
	#$reuslt["error"],執行不正常結束的錯訊息陣列.
916
	#$result["function"],當前執行的函式名稱.
917
	#$result["argu"],使用的參數.
66 liveuser 918
	#$result["content"],陣列,每個元素為其指令執行的結果訊息陣列,key為"status"代表執行是否正常的識別;key為"statusCode"代表程式結束後回傳給對應executeBy程式的數值,若為"?"則代表程序尚未結束,可透過proc_update函式進行資訊的更新與取得;key為"output"代表標準輸出,若為resource,則代表為pipe;key為"error"代表非標準輸出,若為resource,則代表為pipe;key為"input"代表成功輸入的指令;key為"process"代表該程序經proc_open後的process source;key為"proc_get_status"代表程序的資訊.
3 liveuser 919
	#必填參數:
920
	#$conf["procs"],陣列,運行self::proc後回傳的content.
921
	$conf["procs"]=$procs;
922
	#可省略參數:
923
	#無.
924
	#參考資料:
925
	#無.
926
	#備註:
927
	#無.
928
	*/
929
	public static function proc_update(&$conf){
226 liveuser 930
 
3 liveuser 931
		#初始化要回傳的變數
932
		$result=array();
933
 
934
		#初始化當前執行的函數名稱
935
		$result["function"]=__FUNCTION__;
936
 
937
		#如果 $conf 不為陣列
938
		if(gettype($conf)!="array"){
226 liveuser 939
 
3 liveuser 940
			#設置執行失敗
941
			$result["status"]="false";
226 liveuser 942
 
3 liveuser 943
			#設置執行錯誤訊息
944
			$result["error"][]="\$conf變數須為陣列形態";
945
 
946
			#如果傳入的參數為 null
947
			if($conf==null){
226 liveuser 948
 
3 liveuser 949
				#設置執行錯誤訊息
950
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
226 liveuser 951
 
3 liveuser 952
				}#if end
953
 
954
			#回傳結果
955
			return $result;
226 liveuser 956
 
3 liveuser 957
			}#if end
226 liveuser 958
 
3 liveuser 959
		#取得使用的參數
960
		$result["argu"]=$conf;
226 liveuser 961
 
3 liveuser 962
		#函式說明:
963
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容.
964
		#回傳結果:
965
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
966
		#$result["error"],執行不正常結束的錯訊息陣列.
967
		#$result["simpleError"],簡單表示的錯誤訊息.
968
		#$result["function"],當前執行的函式名稱.
969
		#$result["argu"],設置給予的參數.
970
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
971
		#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
972
		#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
973
		#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
974
		#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
975
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
976
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
977
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
978
		#必填參數:
979
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
980
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
981
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
982
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
983
		#可省略參數:
984
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
985
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("procs");
986
		#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null代表不指定變數形態.
987
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("array");
988
		#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
989
		#$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";
990
		#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
991
		$conf["variableCheck::checkArguments"]["canNotBeEmpty"]=array("procs");
992
		#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
993
		#$conf["canBeEmpty"]=array();
994
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
995
		#$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("wait","workingDir","envs","executeBy");
996
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
997
		#$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("wait","workingDir","envs","executeBy");
998
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
999
		#$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","array","array","array");
1000
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
1001
		#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("true",null,null,null);
1002
		#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
1003
		#$conf["disallowAllSkipableVarIsEmpty"]="";
1004
		#$conf["disallowAllSkipableVarIsEmptyArray"],字串,是否允許每個可省略參數都為空陣列,預設為"true"允許,反之為"false".
1005
		#$conf["disallowAllSkipableVarIsEmptyArray"]="";
1006
		#$conf["disallowAllSkipableVarNotExist"],字串,是否不允許每個可省略參數都不存在,預設為"false"代表允許,反之為"true".
1007
		#$conf["disallowAllSkipableVarNotExist"]="";
1008
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
1009
		#$conf["variableCheck::checkArguments"]["arrayCountEqualCheck"][]=array("");
1010
		#參考資料:
1011
		#array_keys=>http://php.net/manual/en/function.array-keys.php
1012
		#備註:
1013
		#無.
1014
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
1015
		unset($conf["variableCheck::checkArguments"]);
226 liveuser 1016
 
3 liveuser 1017
		#如果 $checkArguments["status"] 等於 "false"
1018
		if($checkArguments["status"]==="false"){
226 liveuser 1019
 
3 liveuser 1020
			#設置錯誤識別
1021
			$result["status"]="false";
226 liveuser 1022
 
3 liveuser 1023
			#設置錯誤訊息
1024
			$result["error"]=$checkArguments;
226 liveuser 1025
 
3 liveuser 1026
			#回傳結果
1027
			return $result;
226 liveuser 1028
 
3 liveuser 1029
			}#if end
226 liveuser 1030
 
3 liveuser 1031
		#如果 $checkArguments["passed"] 等於 "false"
1032
		if($checkArguments["passed"]==="false"){
226 liveuser 1033
 
3 liveuser 1034
			#設置錯誤識別
1035
			$result["status"]="false";
226 liveuser 1036
 
3 liveuser 1037
			#設置錯誤訊息
1038
			$result["error"]=$checkArguments;
226 liveuser 1039
 
3 liveuser 1040
			#回傳結果
1041
			return $result;
226 liveuser 1042
 
3 liveuser 1043
			}#if end
226 liveuser 1044
 
3 liveuser 1045
		#檢查 content
1046
		/*
1047
		#$result["content"],陣列,每個元素為其指令執行的結果訊息陣列,key為"status"代表執行是否正常的識別;key為"statusCode"代表程式結束後回傳給對應executeBy程式的數值;key為"output"代表標準輸出,若為resource,則代表為pipe;key為"error"代表非標準輸出,若為resource,則代表為pipe;key為"input"代表成功輸入的指令;key為"process"代表該程序經proc_open後的process source;key為"proc_get_status"代表程序的資訊.
1048
		*/
226 liveuser 1049
 
3 liveuser 1050
		#針對每個程序
1051
		foreach($conf["procs"] as $index => $proc){
226 liveuser 1052
 
3 liveuser 1053
			#函式說明:
1054
			#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容.
1055
			#回傳結果:
1056
			#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
1057
			#$result["error"],執行不正常結束的錯訊息陣列.
1058
			#$result["simpleError"],簡單表示的錯誤訊息.
1059
			#$result["function"],當前執行的函式名稱.
1060
			#$result["argu"],設置給予的參數.
1061
			#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
1062
			#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
1063
			#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
1064
			#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
1065
			#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
1066
			#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
1067
			#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
1068
			#$result["notNeedVar"],字串陣列,多餘的參數名稱.
1069
			#必填參數:
1070
			#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
1071
			$conf["variableCheck::checkArguments"]["varInput"]=&$proc;
1072
			#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
1073
			$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
1074
			#可省略參數:
1075
			#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
1076
			$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("status","statusCode","content","error","input","process","proc_get_status");
1077
			#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null代表不指定變數形態.
1078
			$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string",null,null,null,"string","resource","array");
1079
			#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
1080
			#$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";
1081
			#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
1082
			#$conf["variableCheck::checkArguments"]["canNotBeEmpty"]=array("procs");
1083
			#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
1084
			#$conf["variableCheck::checkArguments"]["canBeEmpty"]=array();
1085
			#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
1086
			#$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("wait","workingDir","envs","executeBy");
1087
			#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
1088
			#$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("error");
1089
			#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
1090
			#$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("array");
1091
			#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
1092
			#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("true",null,null,null);
1093
			#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
1094
			#$conf["disallowAllSkipableVarIsEmpty"]="";
1095
			#$conf["disallowAllSkipableVarIsEmptyArray"],字串,是否允許每個可省略參數都為空陣列,預設為"true"允許,反之為"false".
1096
			#$conf["disallowAllSkipableVarIsEmptyArray"]="";
1097
			#$conf["disallowAllSkipableVarNotExist"],字串,是否不允許每個可省略參數都不存在,預設為"false"代表允許,反之為"true".
1098
			#$conf["disallowAllSkipableVarNotExist"]="";
1099
			#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
1100
			#$conf["variableCheck::checkArguments"]["arrayCountEqualCheck"][]=array("");
1101
			#參考資料:
1102
			#array_keys=>http://php.net/manual/en/function.array-keys.php
1103
			#備註:
1104
			#無.
1105
			$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
1106
			unset($conf["variableCheck::checkArguments"]);
226 liveuser 1107
 
3 liveuser 1108
			#如果 $checkArguments["status"] 等於 "false"
1109
			if($checkArguments["status"]==="false"){
226 liveuser 1110
 
3 liveuser 1111
				#設置錯誤識別
1112
				$result["status"]="false";
226 liveuser 1113
 
3 liveuser 1114
				#設置錯誤訊息
1115
				$result["error"]=$checkArguments;
226 liveuser 1116
 
3 liveuser 1117
				#回傳結果
1118
				return $result;
226 liveuser 1119
 
3 liveuser 1120
				}#if end
226 liveuser 1121
 
3 liveuser 1122
			#如果 $checkArguments["passed"] 等於 "false"
1123
			if($checkArguments["passed"]==="false"){
226 liveuser 1124
 
3 liveuser 1125
				#設置錯誤識別
1126
				$result["status"]="false";
226 liveuser 1127
 
3 liveuser 1128
				#設置錯誤訊息
1129
				$result["error"]=$checkArguments;
226 liveuser 1130
 
3 liveuser 1131
				#回傳結果
1132
				return $result;
226 liveuser 1133
 
3 liveuser 1134
				}#if end
226 liveuser 1135
 
3 liveuser 1136
			#如果可能尚在執行中
1137
			if($proc["statusCode"]==="?"){
226 liveuser 1138
 
3 liveuser 1139
				#取得當下的狀態
1140
				$proc_get_status=proc_get_status($proc["process"]);
226 liveuser 1141
 
3 liveuser 1142
				#如果執行已經結束,有回傳exitcode
1143
				if($proc_get_status["exitcode"]!==-1){
226 liveuser 1144
 
3 liveuser 1145
					#設置 statusCode
1146
					$conf["procs"][$index]["statusCode"]=$proc_get_status["exitcode"];
226 liveuser 1147
 
3 liveuser 1148
					#取得標準輸出
1149
					$stdout=stream_get_contents($proc["content"]);
226 liveuser 1150
 
3 liveuser 1151
					#取得錯誤輸出
1152
					$stderr=stream_get_contents($proc["error"]);
226 liveuser 1153
 
396 liveuser 1154
					#關閉 pipe
1155
					fclose($proc["error"]);
226 liveuser 1156
 
396 liveuser 1157
					#關閉 pipe
1158
					fclose($proc["content"]);
1159
 
1160
					#關閉程序
1161
					proc_close($proc["process"]);
226 liveuser 1162
 
3 liveuser 1163
					}#if end
396 liveuser 1164
 
1165
				#反之
1166
				else{
1167
 
1168
					#取得標準輸出的 streams
1169
					$stdout=$proc["content"];
1170
 
1171
					#取得錯誤輸出的 streams
1172
					$stderr=$proc["error"];
1173
 
1174
					}#else end
1175
 
1176
				#設置執行結果
1177
				$conf["procs"][$index]["content"]=$stdout;
1178
 
1179
				#設置執行失敗訊息
1180
				$conf["procs"][$index]["error"]=$stderr;
226 liveuser 1181
 
3 liveuser 1182
				}#if end
249 liveuser 1183
 
1184
			#反之已經執行完畢
1185
			else{
1186
 
1187
				#如果標準輸出依然為 resource
1188
				if(gettype($proc["content"])==="resource"){
1189
 
1190
					#取得標準輸出
1191
					$stdout=stream_get_contents($proc["content"]);
226 liveuser 1192
 
249 liveuser 1193
					#設置執行結果
1194
					$conf["procs"][$index]["content"]=$stdout;
1195
 
396 liveuser 1196
					#關閉 pipe
1197
					fclose($proc["content"]);
1198
 
249 liveuser 1199
					}#if end
1200
 
1201
				#如果錯誤輸出依然為 resource
1202
				if(gettype($proc["error"])==="resource"){
1203
 
1204
					#取得錯誤輸出
1205
					$stderr=stream_get_contents($proc["error"]);
1206
 
1207
					#設置執行失敗訊息
1208
					$conf["procs"][$index]["error"]=$stderr;
396 liveuser 1209
 
1210
					#關閉 pipe
1211
					fclose($proc["error"]);
249 liveuser 1212
 
1213
					}#if end
396 liveuser 1214
 
1215
				#關閉程序
1216
				proc_close($proc["process"]);
249 liveuser 1217
 
1218
				}#else end
1219
 
3 liveuser 1220
			}#foreach end
226 liveuser 1221
 
3 liveuser 1222
		#設置要回傳的結果
1223
		$result["content"]=$conf["procs"];
226 liveuser 1224
 
3 liveuser 1225
		#設置執行正常
1226
		$result["status"]="true";
226 liveuser 1227
 
3 liveuser 1228
		#回傳結果
1229
		return $result;
226 liveuser 1230
 
3 liveuser 1231
		}#function proc_update end
383 liveuser 1232
 
1233
	/*
1234
	#函式說明:
1235
	#類似stream_select的替代方案, 用來檢查透過proc運行的多執行序其標準輸出、錯誤輸出是否有訊息,程序是否已經結束.
1236
	#回傳結果:
1237
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
1238
	#$reuslt["error"],執行不正常結束的錯訊息陣列.
1239
	#$result["function"],當前執行的函式名稱.
1240
	#$result["argu"],使用的參數.
1241
	#$result["content"],陣列,每個元素的key代表有訊息的channel名稱,數值為陣列.
1242
	#$result["content"][$channel],陣列,$channel為通道的名稱亦即streams參數陣列中的key.陣列的key有"content",代表得到的訊息;"alive"則代表通道是否還處於開啟的狀態.
1243
	#$result["streams"],陣列,依然開啟的通道(運行中),元素的key為該channel的名稱;數值為channel.
1244
	#$result["allChannelClosed"],字串,"true"代表streams參數的通道已經全部關閉;反之為"false".
1245
	#必填參數:
1246
	#$conf["streams"],陣列,每個元素為threads::proc回傳結果content中每個元素的content跟error,key為該stream的名稱,例如:"client_1_std"、"client_1_err".
1247
	$conf["streams"]=array();
1248
	#可省略參數:
1249
	#$conf["periodToWait"],整數,要等待多少秒來嘗試取得訊息,預設為1秒鐘.
1250
	#$conf["periodToWait"]=1;
1251
	#參考資料:
1252
	#https://www.php.net/manual/en/function.proc-open.php
1253
	#https://www.php.net/manual/en/function.proc-get-status.php
1254
	#https://www.php.net/manual/en/function.proc-terminate.php
1255
	#備註:
396 liveuser 1256
	#目前會有子程序不會結束的問題.
383 liveuser 1257
	*/
1258
	public static function proc_stream_select(&$conf){
1259
 
1260
		#初始化要回傳的結果
1261
		$result=array();
3 liveuser 1262
 
383 liveuser 1263
		#取得當前執行的函數名稱
1264
		$result["function"]=__FUNCTION__;
1265
 
1266
		#如果沒有參數
1267
		if(func_num_args()==0){
1268
 
1269
			#設置執行失敗
1270
			$result["status"]="false";
1271
 
1272
			#設置執行錯誤訊息
1273
			$result["error"]="函數".$result["function"]."需要參數";
1274
 
1275
			#回傳結果
1276
			return $result;
1277
 
1278
			}#if end
1279
 
1280
		#涵式說明:
1281
		#判斷當前環境為web還是cmd
1282
		#回傳結果:
1283
		#$result,"web"或"cmd"
1284
		if(csInformation::getEnv()==="web"){
1285
 
1286
			#設置執行失敗
1287
			$result["status"]="false";
1288
 
1289
			#設置執行錯誤訊息
1290
			$result["error"][]="函數 ".$result["function"]." 僅能在命令列環境下運行!";
1291
 
1292
			#回傳結果
1293
			return $result;
1294
 
1295
			}#if end
1296
 
1297
		#取得參數
1298
		$result["argu"]=$conf;
1299
 
1300
		#如果 $conf 不為陣列
1301
		if(gettype($conf)!=="array"){
1302
 
1303
			#設置執行失敗
1304
			$result["status"]="false";
1305
 
1306
			#設置執行錯誤訊息
1307
			$result["error"][]="\$conf變數須為陣列形態";
1308
 
1309
			#如果傳入的參數為 null
1310
			if(is_null($conf)){
1311
 
1312
				#設置執行錯誤訊息
1313
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
1314
 
1315
				}#if end
1316
 
1317
			#回傳結果
1318
			return $result;
1319
 
1320
			}#if end
1321
 
1322
		#函式說明:
1323
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容.
1324
		#回傳結果:
1325
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
1326
		#$result["error"],執行不正常結束的錯訊息陣列.
1327
		#$result["simpleError"],簡單表示的錯誤訊息.
1328
		#$result["function"],當前執行的函式名稱.
1329
		#$result["argu"],設置給予的參數.
1330
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
1331
		#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
1332
		#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
1333
		#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
1334
		#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
1335
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
1336
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
1337
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
1338
		#必填參數:
1339
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
1340
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
1341
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
1342
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
1343
		#可省略參數:
1344
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
1345
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("streams");
1346
		#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null、any代表不指定變數形態.其中 resource也包含"resource (closed)".
1347
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("array");
1348
		#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
1349
		#$conf["canBeEmptyString"]="false";
1350
		#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
1351
		#$conf["canNotBeEmpty"]=array();
1352
		#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
1353
		#$conf["canBeEmpty"]=array();
1354
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
1355
		$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("periodToWait");
1356
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
1357
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("periodToWait");
1358
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
1359
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("integer");
1360
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
1361
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array(1);
1362
		#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
1363
		#$conf["disallowAllSkipableVarIsEmpty"]="";
1364
		#$conf["disallowAllSkipableVarIsEmptyArray"],字串,是否允許每個可省略參數都為空陣列,預設為"true"允許,反之為"false".
1365
		#$conf["disallowAllSkipableVarIsEmptyArray"]="";
1366
		#$conf["disallowAllSkipableVarNotExist"],字串,是否不允許每個可省略參數都不存在,預設為"false"代表允許,反之為"true".
1367
		#$conf["disallowAllSkipableVarNotExist"]="";
1368
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
1369
		#$conf["arrayCountEqualCheck"][]=array();
1370
		#參考資料:
1371
		#array_keys=>http://php.net/manual/en/function.array-keys.php
1372
		#備註:
1373
		#無.
1374
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
1375
		unset($conf["variableCheck::checkArguments"]);
1376
 
1377
		#如果執行異常
1378
		if($checkArguments["status"]==="false"){
1379
 
1380
			#設置執行失敗
1381
			$result["status"]="false";
1382
 
1383
			#設置執行錯誤訊息
1384
			$result["error"]=$checkArguments;
1385
 
1386
			#回傳結果
1387
			return $result;
1388
 
1389
			}#if end
1390
 
1391
		#如果參數檢查不通過
1392
		if($checkArguments["passed"]==="false"){
1393
 
1394
			#設置執行失敗
1395
			$result["status"]="false";
1396
 
1397
			#設置執行錯誤訊息
1398
			$result["error"]=$checkArguments;
1399
 
1400
			#回傳結果
1401
			return $result;
1402
 
1403
			}#if end
1404
 
1405
		#初始化設置要監控的 stream 陣列資訊
1406
		$streamInfo=array();
1407
 
1408
		#針對每個 stream
1409
		foreach($conf["streams"] as $channelName => $stream){
1410
 
1411
			#設置 channel 的 stream
1412
			$streamInfo[$channelName]["stream"]=$stream;
1413
 
1414
			#預設 channel 視為開啟的狀況
1415
			$streamInfo[$channelName]["alive"]=true;
1416
 
1417
			#初始化該chnnel得到的回應為空.
1418
			$result["content"][$channelName]["content"]="";
1419
 
1420
			#初始化該chnnel為開啟的狀態
1421
			$result["content"][$channelName]["alive"]=true;
1422
 
1423
			}#foreach end
1424
 
1425
		#無窮迴圈
1426
		while(true){
1427
 
1428
			#針對每個 stream
1429
			foreach($streamInfo as $name=>$info){
1430
 
1431
				#如果通道是開啟的
1432
				if($info["alive"]){
1433
 
1434
					#確認是否尚未關閉
1435
					if(!feof($info["stream"])){
1436
 
1437
						#讀取訊息
1438
						$msg=fread($info["stream"],2048);
1439
 
1440
						#如果有訊息
1441
						if(!empty($msg)){
1442
 
1443
							#記錄訊息
1444
							$result["content"][$name]["content"]=$result["content"][$name]["content"].$msg.PHP_EOL;
1445
 
1446
							}#if end
1447
 
1448
						}#if end
1449
 
1450
					#反之
1451
					else{
1452
 
1453
						#設置通道已經關閉的識別
1454
						$streamInfo[$name]["alive"]=false;
1455
 
1456
						#初始化該chnnel為開啟的狀態
1457
						$result["content"][$channelName]["alive"]=false;
1458
 
1459
						#卸除作為參數的通道
1460
						unset($conf["streams"][$name]);
1461
 
1462
						}#else end
1463
 
1464
					}#if end
1465
 
1466
				}#foreach end
1467
 
1468
			#如果已經沒有要監控的通道存在
1469
			if(empty($conf["streams"])){
1470
 
1471
				#跳出 while
1472
				break;
1473
 
1474
				}#if end
1475
 
1476
			#如果等待時間已經結束
1477
			if(--$conf["periodToWait"]===0){
1478
 
1479
				#跳出 while
1480
				break;
1481
 
1482
				}#if end
1483
 
1484
			#休息1秒鐘
1485
			sleep(1);
1486
 
1487
			}#while end
1488
 
1489
		#針對每個 stream
1490
		foreach($result["content"] as $channelName => $stream){
1491
 
1492
			#如果輸出為空
1493
			if(empty($result["content"][$channelName]["content"])){
1494
 
1495
				#卸除之
1496
				unset($result["content"][$channelName]);
1497
 
1498
				}#if end
1499
 
1500
			}#foreach end
1501
 
1502
		#取得依然可以使用的通道
1503
		$result["streams"]=$conf["streams"];
1504
 
1505
		#如果可以使用的通道已經不存在
1506
		if(empty($result["streams"])){
1507
 
1508
			#設置所有 channel 已經關閉.
1509
			$result["allChannelClosed"]="true";
1510
 
1511
			}#if end
1512
 
1513
		#反之
1514
		else{
1515
 
1516
			#設置所有 channel 未關閉.
1517
			$result["allChannelClosed"]="false";
1518
 
1519
			}#else end
1520
 
1521
		#設置執行正常
1522
		$result["status"]="true";
1523
 
1524
		#回傳結果
1525
		return $result;
1526
 
1527
		}#function proc_stream_select end
396 liveuser 1528
 
1529
	/*
1530
	#函式說明:
1531
	#類似stream_select的替代方案, 用來檢查透過proc運行的多執行序其標準輸出、錯誤輸出是否有訊息,程序是否已經結束.
1532
	#回傳結果:
1533
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
1534
	#$reuslt["error"],執行不正常結束的錯訊息陣列.
1535
	#$result["function"],當前執行的函式名稱.
1536
	#$result["argu"],使用的參數.
1537
	#$result["content"],陣列,運行中的程序,可作為下次呼叫本函式的procs參數.
1538
	#$result["streams"],陣列,元素為對應channelName索引的輸出.
1539
	#$result["allStreamsClosed"],字串,"true"代表streams參數的通道已經全部關閉;反之為"false".
1540
	#$result["gotMsg"],字串,"true"代表有訊息輸出;反之為"false".
1541
	#必填參數:
1542
	#$conf["procs"],陣列,threads::proc回傳的content.
1543
	$conf["procs"]=array();
1544
	#可省略參數:
1545
	#$conf["channelName"],陣列,每個元素為兩個元素的陣列,第一個元素為對應procs元素的標準輸出的stream/channel名稱,預設為std_$index,第二個元素為對應procs元素的錯誤輸出,預設為err_$index,$index為從0開始的整數.
1546
	#$conf["channelName"]=array();
1547
	#$conf["periodToWait"],整數,要等待多少秒來嘗試取得訊息,預設為1秒鐘.
1548
	#$conf["periodToWait"]=1;
1549
	#參考資料:
1550
	#https://www.php.net/manual/en/function.proc-open.php
1551
	#https://www.php.net/manual/en/function.proc-get-status.php
1552
	#https://www.php.net/manual/en/function.proc-terminate.php
1553
	#備註:
1554
	#無.
1555
	*/
1556
	public static function proc_streams_select(&$conf){
1557
 
1558
		#初始化要回傳的結果
1559
		$result=array();
383 liveuser 1560
 
396 liveuser 1561
		#取得當前執行的函數名稱
1562
		$result["function"]=__FUNCTION__;
1563
 
1564
		#如果沒有參數
1565
		if(func_num_args()==0){
1566
 
1567
			#設置執行失敗
1568
			$result["status"]="false";
1569
 
1570
			#設置執行錯誤訊息
1571
			$result["error"]="函數".$result["function"]."需要參數";
1572
 
1573
			#回傳結果
1574
			return $result;
1575
 
1576
			}#if end
1577
 
1578
		#涵式說明:
1579
		#判斷當前環境為web還是cmd
1580
		#回傳結果:
1581
		#$result,"web"或"cmd"
1582
		if(csInformation::getEnv()==="web"){
1583
 
1584
			#設置執行失敗
1585
			$result["status"]="false";
1586
 
1587
			#設置執行錯誤訊息
1588
			$result["error"][]="函數 ".$result["function"]." 僅能在命令列環境下運行!";
1589
 
1590
			#回傳結果
1591
			return $result;
1592
 
1593
			}#if end
1594
 
1595
		#取得參數
1596
		$result["argu"]=$conf;
1597
 
1598
		#如果 $conf 不為陣列
1599
		if(gettype($conf)!=="array"){
1600
 
1601
			#設置執行失敗
1602
			$result["status"]="false";
1603
 
1604
			#設置執行錯誤訊息
1605
			$result["error"][]="\$conf變數須為陣列形態";
1606
 
1607
			#如果傳入的參數為 null
1608
			if(is_null($conf)){
1609
 
1610
				#設置執行錯誤訊息
1611
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
1612
 
1613
				}#if end
1614
 
1615
			#回傳結果
1616
			return $result;
1617
 
1618
			}#if end
1619
 
1620
		#函式說明:
1621
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容.
1622
		#回傳結果:
1623
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
1624
		#$result["error"],執行不正常結束的錯訊息陣列.
1625
		#$result["simpleError"],簡單表示的錯誤訊息.
1626
		#$result["function"],當前執行的函式名稱.
1627
		#$result["argu"],設置給予的參數.
1628
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
1629
		#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
1630
		#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
1631
		#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
1632
		#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
1633
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
1634
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
1635
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
1636
		#必填參數:
1637
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
1638
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
1639
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
1640
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
1641
		#可省略參數:
1642
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
1643
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("procs");
1644
		#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null、any代表不指定變數形態.其中 resource也包含"resource (closed)".
1645
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("array");
1646
		#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
1647
		#$conf["canBeEmptyString"]="false";
1648
		#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
1649
		#$conf["canNotBeEmpty"]=array();
1650
		#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
1651
		#$conf["canBeEmpty"]=array();
1652
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
1653
		$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("channelName","periodToWait");
1654
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
1655
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("channelName","periodToWait");
1656
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
1657
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("array","integer");
1658
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
1659
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array(null,1);
1660
		#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
1661
		#$conf["disallowAllSkipableVarIsEmpty"]="";
1662
		#$conf["disallowAllSkipableVarIsEmptyArray"],字串,是否允許每個可省略參數都為空陣列,預設為"true"允許,反之為"false".
1663
		#$conf["disallowAllSkipableVarIsEmptyArray"]="";
1664
		#$conf["disallowAllSkipableVarNotExist"],字串,是否不允許每個可省略參數都不存在,預設為"false"代表允許,反之為"true".
1665
		#$conf["disallowAllSkipableVarNotExist"]="";
1666
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
1667
		#$conf["arrayCountEqualCheck"][]=array();
1668
		#參考資料:
1669
		#array_keys=>http://php.net/manual/en/function.array-keys.php
1670
		#備註:
1671
		#無.
1672
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
1673
		unset($conf["variableCheck::checkArguments"]);
1674
 
1675
		#如果執行異常
1676
		if($checkArguments["status"]==="false"){
1677
 
1678
			#設置執行失敗
1679
			$result["status"]="false";
1680
 
1681
			#設置執行錯誤訊息
1682
			$result["error"]=$checkArguments;
1683
 
1684
			#回傳結果
1685
			return $result;
1686
 
1687
			}#if end
1688
 
1689
		#如果參數檢查不通過
1690
		if($checkArguments["passed"]==="false"){
1691
 
1692
			#設置執行失敗
1693
			$result["status"]="false";
1694
 
1695
			#設置執行錯誤訊息
1696
			$result["error"]=$checkArguments;
1697
 
1698
			#回傳結果
1699
			return $result;
1700
 
1701
			}#if end
1702
 
1703
		#初始化預設的 channel name
1704
		$default_channelName=array();
1705
 
1706
		#針對每個 proc
1707
		foreach($conf["procs"] as $index => $proc){
1708
 
1709
			#設置預設的 channle name
1710
			$default_channelName[]=array("std_".$index,"err_".$index);
1711
 
1712
			}#foreach end
1713
 
1714
		#函式說明:
1715
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容.
1716
		#回傳結果:
1717
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
1718
		#$result["error"],執行不正常結束的錯訊息陣列.
1719
		#$result["simpleError"],簡單表示的錯誤訊息.
1720
		#$result["function"],當前執行的函式名稱.
1721
		#$result["argu"],設置給予的參數.
1722
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
1723
		#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
1724
		#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
1725
		#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
1726
		#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
1727
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
1728
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
1729
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
1730
		#必填參數:
1731
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
1732
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
1733
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
1734
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
1735
		#可省略參數:
1736
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
1737
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("procs");
1738
		#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null、any代表不指定變數形態.其中 resource也包含"resource (closed)".
1739
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("array");
1740
		#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
1741
		#$conf["canBeEmptyString"]="false";
1742
		#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
1743
		#$conf["canNotBeEmpty"]=array();
1744
		#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
1745
		#$conf["canBeEmpty"]=array();
1746
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
1747
		$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("channelName","periodToWait");
1748
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
1749
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("channelName","periodToWait");
1750
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
1751
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("array","integer");
1752
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
1753
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array($default_channelName,1);
1754
		#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
1755
		#$conf["disallowAllSkipableVarIsEmpty"]="";
1756
		#$conf["disallowAllSkipableVarIsEmptyArray"],字串,是否允許每個可省略參數都為空陣列,預設為"true"允許,反之為"false".
1757
		#$conf["disallowAllSkipableVarIsEmptyArray"]="";
1758
		#$conf["disallowAllSkipableVarNotExist"],字串,是否不允許每個可省略參數都不存在,預設為"false"代表允許,反之為"true".
1759
		#$conf["disallowAllSkipableVarNotExist"]="";
1760
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
1761
		$conf["variableCheck::checkArguments"]["arrayCountEqualCheck"][]=array("procs","channelName");
1762
		#參考資料:
1763
		#array_keys=>http://php.net/manual/en/function.array-keys.php
1764
		#備註:
1765
		#無.
1766
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
1767
		unset($conf["variableCheck::checkArguments"]);
1768
 
1769
		#如果執行異常
1770
		if($checkArguments["status"]==="false"){
1771
 
1772
			#設置執行失敗
1773
			$result["status"]="false";
1774
 
1775
			#設置執行錯誤訊息
1776
			$result["error"]=$checkArguments;
1777
 
1778
			#回傳結果
1779
			return $result;
1780
 
1781
			}#if end
1782
 
1783
		#如果參數檢查不通過
1784
		if($checkArguments["passed"]==="false"){
1785
 
1786
			#設置執行失敗
1787
			$result["status"]="false";
1788
 
1789
			#設置執行錯誤訊息
1790
			$result["error"]=$checkArguments;
1791
 
1792
			#回傳結果
1793
			return $result;
1794
 
1795
			}#if end
1796
 
1797
		#每個 channelName 參數的元素必須為 有兩個元素的陣列,key值要為0跟1.
1798
 
1799
		#針對 channelName 的每個元素
1800
		foreach($conf["channelName"] as $chName){
1801
 
1802
			#函式說明:
1803
			#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容.
1804
			#回傳結果:
1805
			#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
1806
			#$result["error"],執行不正常結束的錯訊息陣列.
1807
			#$result["simpleError"],簡單表示的錯誤訊息.
1808
			#$result["function"],當前執行的函式名稱.
1809
			#$result["argu"],設置給予的參數.
1810
			#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
1811
			#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
1812
			#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
1813
			#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
1814
			#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
1815
			#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
1816
			#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
1817
			#$result["notNeedVar"],字串陣列,多餘的參數名稱.
1818
			#必填參數:
1819
			#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
1820
			$conf["variableCheck::checkArguments"]["varInput"]=&$chName;
1821
			#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
1822
			$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
1823
			#可省略參數:
1824
			#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
1825
			$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array(0,1);
1826
			#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null、any代表不指定變數形態.其中 resource也包含"resource (closed)".
1827
			$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string","string");
1828
			#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
1829
			#$conf["canBeEmptyString"]="false";
1830
			#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
1831
			#$conf["canNotBeEmpty"]=array();
1832
			#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
1833
			#$conf["canBeEmpty"]=array();
1834
			#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
1835
			#$conf["skipableVariableCanNotBeEmpty"]=array();
1836
			#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
1837
			#$conf["skipableVariableName"]=array();
1838
			#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
1839
			#$conf["skipableVariableType"]=array();
1840
			#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
1841
			#$conf["skipableVarDefaultValue"]=array("");
1842
			#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
1843
			#$conf["disallowAllSkipableVarIsEmpty"]="";
1844
			#$conf["disallowAllSkipableVarIsEmptyArray"],字串,是否允許每個可省略參數都為空陣列,預設為"true"允許,反之為"false".
1845
			#$conf["disallowAllSkipableVarIsEmptyArray"]="";
1846
			#$conf["disallowAllSkipableVarNotExist"],字串,是否不允許每個可省略參數都不存在,預設為"false"代表允許,反之為"true".
1847
			#$conf["disallowAllSkipableVarNotExist"]="";
1848
			#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
1849
			#$conf["arrayCountEqualCheck"][]=array();
1850
			#$conf["arrayCount"],字串陣列,為檢查指定的陣列參數,其元素數量要為多少,預設不指定.
1851
			#$conf["arrayCount"][]=array("variableName",$elementCount);
1852
			#參考資料:
1853
			#array_keys=>http://php.net/manual/en/function.array-keys.php
1854
			#備註:
1855
			#無.
1856
			$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
1857
			unset($conf["variableCheck::checkArguments"]);
1858
 
1859
			#如果執行異常
1860
			if($checkArguments["status"]==="false"){
1861
 
1862
				#設置執行失敗
1863
				$result["status"]="false";
1864
 
1865
				#設置執行錯誤訊息
1866
				$result["error"]=$checkArguments;
1867
 
1868
				#回傳結果
1869
				return $result;
1870
 
1871
				}#if end
1872
 
1873
			#如果檢查不通過
1874
			if($checkArguments["passed"]==="false"){
1875
 
1876
				#設置執行失敗
1877
				$result["status"]="false";
1878
 
1879
				#設置執行錯誤訊息
1880
				$result["error"]=$checkArguments;
1881
 
1882
				#回傳結果
1883
				return $result;
1884
 
1885
				}#if end
1886
 
1887
			}#foreach end
1888
 
1889
		#函式說明:
1890
		#更新透過proc執行的多程序資訊.
1891
		#回傳結果:
1892
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
1893
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
1894
		#$result["function"],當前執行的函式名稱.
1895
		#$result["argu"],使用的參數.
1896
		#$result["content"],陣列,每個元素為其指令執行的結果訊息陣列,key為"status"代表執行是否正常的識別;key為"statusCode"代表程式結束後回傳給對應executeBy程式的數值,若為"?"則代表程序尚未結束,可透過proc_update函式進行資訊的更新與取得;key為"output"代表標準輸出,若為resource,則代表為pipe;key為"error"代表非標準輸出,若為resource,則代表為pipe;key為"input"代表成功輸入的指令;key為"process"代表該程序經proc_open後的process source;key為"proc_get_status"代表程序的資訊.
1897
		#必填參數:
1898
		#$conf["procs"],陣列,運行self::proc後回傳的content.
1899
		$conf["threads::proc_update"]["procs"]=$conf["procs"];
1900
		#可省略參數:
1901
		#無.
1902
		#參考資料:
1903
		#無.
1904
		#備註:
1905
		#無.
1906
		$proc_update=threads::proc_update($conf["threads::proc_update"]);
1907
		unset($conf["threads::proc_update"]);
1908
 
1909
		#debug
1910
		#var_dump(__LINE__,$proc_update);
1911
 
1912
		#如果執行異常
1913
		if($proc_update["status"]==="false"){
1914
 
1915
			#設置執行錯誤
1916
			$result["error"]=$proc_update;
1917
 
1918
			#設置執行異常
1919
			$result["status"]="false";
1920
 
1921
			#回傳結果
1922
			return $result;
1923
 
1924
			}#if end
1925
 
1926
		#debug
1927
		#var_dump(__LINE__,$conf["channelName"]);
1928
 
1929
		#針對每個程序
1930
		foreach($proc_update["content"] as $index => $pInfo){
1931
 
1932
			#如果程序尚未結束
1933
			if($pInfo["statusCode"]==="?"){
1934
 
1935
				#初始化等待訊息的時間
1936
				$periodToWait=0;
1937
 
1938
				#無窮迴圈
1939
				while(true){
1940
 
1941
					#取得目前 std 的輸出
1942
					$std=fgets($pInfo["content"]);
1943
 
1944
					#取得目前 err 的輸出
1945
					$err=fgets($pInfo["error"]);
1946
 
1947
					# 如果有 std 輸出
1948
					if(!empty($std)){
1949
 
1950
						#設置 streams std 的輸出
1951
						$result["streams"][$conf["channelName"][$index][0]]=$std;
1952
 
1953
						#跳出迴圈
1954
						break;
1955
 
1956
						}#if end
1957
 
1958
					#如果有 err 輸出
1959
					if(!empty($err)){
1960
 
1961
						#設置 streams err 的輸出
1962
						$result["streams"][$conf["channelName"][$index][1]]=$err;
1963
 
1964
						#跳出迴圈
1965
						break;
1966
 
1967
						}#if end
1968
 
1969
 
1970
					#如果已經達到等待的時間上限
1971
					if($periodToWait>=$conf["periodToWait"]){
1972
 
1973
						#跳出迴圈
1974
						break;
1975
 
1976
						}#if end
1977
 
1978
					#等待1秒
1979
					sleep(1);
1980
 
1981
					#已經待的時間加1
1982
					$periodToWait=$periodToWait+1;
1983
 
1984
					}#while end
1985
 
1986
				#儲存尚未運行完畢的程序
1987
				$result["content"][]=$pInfo;
1988
 
1989
				}#if end
1990
 
1991
			#反之程序已經結束
1992
			else{
1993
 
1994
				#如果有標準輸出
1995
				if(gettype($pInfo["content"])==="string"){
1996
 
1997
					#如果有內容
1998
					if(!empty($pInfo["content"])){
1999
 
2000
						#設置 streams std 的輸出
2001
						$result["streams"][$conf["channelName"][$index][0]]=$pInfo["content"];
2002
 
2003
						}#if end
2004
 
2005
					}#if end
2006
 
2007
				#如果有錯誤輸出
2008
				if(gettype($pInfo["error"])==="string"){
2009
 
2010
					#如果有內容
2011
					if(!empty($pInfo["error"])){
2012
 
2013
						#設置 streams err 的輸出
2014
						$result["streams"][$conf["channelName"][$index][1]]=$pInfo["error"];
2015
 
2016
						}#if end
2017
 
2018
					}#if end
2019
 
2020
				}#else end
2021
 
2022
			}#foreach end
2023
 
2024
		#如果沒有運行中的程序
2025
		if(empty($result["content"])){
2026
 
2027
			#設置所有 streams 已經關閉.
2028
			$result["allStreamsClosed"]="true";
2029
 
2030
			}#if end
2031
 
2032
		#反之
2033
		else{
2034
 
2035
			#設置所有 streams 未關閉.
2036
			$result["allStreamsClosed"]="false";
2037
 
2038
			}#else end
2039
 
2040
		#如果有輸出
2041
		if(!empty($result["streams"])){
2042
 
2043
			#設置有輸出的識別
2044
			$result["gotMsg"]="true";
2045
 
2046
			}#if end
2047
 
2048
		#反之
2049
		else{
2050
 
2051
			#設置沒有輸出的識別
2052
			$result["gotMsg"]="false";
2053
 
2054
			}#else end
2055
 
2056
		#設置運行正常
2057
		$result["status"]="true";
2058
 
2059
		#回傳結果
2060
		return $result;
2061
 
2062
		}#function proc_streams_select end
2063
 
3 liveuser 2064
	/*
2065
	#函式說明:
2066
	#透過parallel展示多執行序運作.
2067
	#回傳結果:
2068
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
2069
	#$reuslt["error"],執行不正常結束的錯訊息陣列.
2070
	#$result["function"],當前執行的函式名稱.
2071
	#必填參數:
2072
	#無.
2073
	#可省略參數:
2074
	#無.
2075
	#參考資料:
2076
	#https://www.php.net/manual/en/class.parallel-runtime.php
2077
	#備註:
226 liveuser 2078
	#需要於編譯PHP時啟用該套件
3 liveuser 2079
	*/
2080
	public static function parallel_demo(){
226 liveuser 2081
 
3 liveuser 2082
		#初始化要回傳的結果
2083
		$result=array();
2084
 
2085
		#取得當前執行的函數名稱
2086
		$result["function"]=__FUNCTION__;
226 liveuser 2087
 
3 liveuser 2088
		#新增程序r1
2089
		$r1=new \parallel\Runtime();
226 liveuser 2090
 
3 liveuser 2091
		#r1要執行的函式
2092
		$thread_r1_function=function($conf){
226 liveuser 2093
 
3 liveuser 2094
			#提示開始
2095
			echo $conf["id"]." start".PHP_EOL;
226 liveuser 2096
 
3 liveuser 2097
			#跑 $conf["i"] 次
2098
			for($i=0;$i<$conf["i"];$i++){
226 liveuser 2099
 
3 liveuser 2100
				#題書$i數值
2101
				echo "\$i=".$i.PHP_EOL;
226 liveuser 2102
 
3 liveuser 2103
				}#for end
226 liveuser 2104
 
3 liveuser 2105
			#提示結束
2106
			echo $conf["id"]." end".PHP_EOL;
226 liveuser 2107
 
3 liveuser 2108
			};#function end
2109
 
2110
		#r1的參數
2111
		$args_r1=array();
2112
		$args_r1["id"]="r1";
2113
		$args_r1["i"]=10;
2114
 
2115
		#運行程序r1
2116
		#程序函式為 $thread_r1_function
2117
		#參數陣列為 $args_r1
2118
		$future_r1=$r1->run($thread_r1_function, $args_r1);
226 liveuser 2119
 
3 liveuser 2120
		#新增程序r2
2121
		$r2=new \parallel\Runtime();
226 liveuser 2122
 
3 liveuser 2123
		#r2要執行的函式
2124
		$thread_r2_function=function($conf){
226 liveuser 2125
 
3 liveuser 2126
			#提示開始
2127
			echo $conf["id"]." start".PHP_EOL;
226 liveuser 2128
 
3 liveuser 2129
			#跑 $conf["i"] 次
2130
			for($i=$conf["i"];$i>0;$i--){
226 liveuser 2131
 
3 liveuser 2132
				#題書$i數值
2133
				echo "\$i=".$i.PHP_EOL;
226 liveuser 2134
 
3 liveuser 2135
				}#for end
226 liveuser 2136
 
3 liveuser 2137
			#提示結束
2138
			echo $conf["id"]." end".PHP_EOL;
226 liveuser 2139
 
3 liveuser 2140
			};#function end
2141
 
2142
		#r2的參數
2143
		$args_r2=array();
2144
		$args_r2["id"]="r2";
2145
		$args_r2["i"]=10;
226 liveuser 2146
 
3 liveuser 2147
		#運行程序r2
2148
		#程序函式為 $thread__r2_function
2149
		#參數陣列為 $args_r2
2150
		$future_r2=$r2->run($thread_r2_function, $args_r2);
226 liveuser 2151
 
3 liveuser 2152
		#存放有多少在執行的程序
2153
		$futureArray=array();
2154
		$futureArray[]=$future_r1;
2155
		$futureArray[]=$future_r2;
226 liveuser 2156
 
3 liveuser 2157
		#當有程序尚未結束時
2158
		while(!empty($futureArray)){
226 liveuser 2159
 
3 liveuser 2160
			#針對每個 Future
2161
			foreach($futureArray as $index => $Future){
226 liveuser 2162
 
3 liveuser 2163
				#如果執行完成了
2164
				if($Future->done()){
226 liveuser 2165
 
3 liveuser 2166
					#移除之
2167
					unset($futureArray[$index]);
226 liveuser 2168
 
3 liveuser 2169
					}#if end
226 liveuser 2170
 
3 liveuser 2171
				}#foreach end
226 liveuser 2172
 
3 liveuser 2173
			}#while end
226 liveuser 2174
 
3 liveuser 2175
		#提示所有程序都執行結束了
2176
		echo "all done!".PHP_EOL;
226 liveuser 2177
 
3 liveuser 2178
		#設置執行正常
2179
		$result["status"]="true";
226 liveuser 2180
 
3 liveuser 2181
		#回傳結果
2182
		return $result;
226 liveuser 2183
 
3 liveuser 2184
		}#function parallel_demo end
226 liveuser 2185
 
3 liveuser 2186
	/*
2187
	#函式說明:
2188
	#透過 unix socket 來多執行序運作.
2189
	#回傳結果:
2190
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
2191
	#$reuslt["error"],執行不正常結束的錯訊息陣列.
2192
	#$result["function"],當前執行的函式名稱.
2193
	#$result["argu"],使用的參數.
2194
	#$result["content"],陣列,每個元素為cmds參數中個別元素其指令傳送後得到的uuid,可透過sock::getProcInfo來查詢結果.
2195
	#必填參數:
2196
	#$conf["cmds"],字串陣列,每個元素代表要執行的指令與參數.
2197
	#$conf["cmds"]=array();
2198
	#可省略參數:
2199
	#$conf["sock"],字串,要連線的 usr/bin/qbpwcf-sock.php 所產生的 unix domain socket 路徑與名稱,預設為 qbpwcf_usock_path.
2200
	#$conf["sock"]=qbpwcf_usock_path;
2201
	#參考資料:
2202
	#無
2203
	#備註:
2204
	#需要透過sock::unixDomainSockServer來運行.
2205
	*/
2206
	public static function socket(&$conf){
226 liveuser 2207
 
3 liveuser 2208
		#初始化要回傳的變數
2209
		$result=array();
2210
 
2211
		#初始化當前執行的函數名稱
2212
		$result["function"]=__FUNCTION__;
2213
 
2214
		#如果 $conf 不為陣列
2215
		if(gettype($conf)!="array"){
226 liveuser 2216
 
3 liveuser 2217
			#設置執行失敗
2218
			$result["status"]="false";
226 liveuser 2219
 
3 liveuser 2220
			#設置執行錯誤訊息
2221
			$result["error"][]="\$conf變數須為陣列形態";
2222
 
2223
			#如果傳入的參數為 null
2224
			if($conf==null){
226 liveuser 2225
 
3 liveuser 2226
				#設置執行錯誤訊息
2227
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
226 liveuser 2228
 
3 liveuser 2229
				}#if end
2230
 
2231
			#回傳結果
2232
			return $result;
226 liveuser 2233
 
3 liveuser 2234
			}#if end
226 liveuser 2235
 
3 liveuser 2236
		#取得使用的參數
2237
		$result["argu"]=$conf;
226 liveuser 2238
 
3 liveuser 2239
		#函式說明:
2240
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容.
2241
		#回傳結果:
2242
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
2243
		#$result["error"],執行不正常結束的錯訊息陣列.
2244
		#$result["simpleError"],簡單表示的錯誤訊息.
2245
		#$result["function"],當前執行的函式名稱.
2246
		#$result["argu"],設置給予的參數.
2247
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
2248
		#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
2249
		#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
2250
		#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
2251
		#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
2252
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
2253
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
2254
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
2255
		#必填參數:
2256
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
2257
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
2258
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
2259
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
2260
		#可省略參數:
2261
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
2262
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("cmds");
2263
		#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null代表不指定變數形態.
2264
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("array");
2265
		#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
2266
		$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";
2267
		#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
2268
		#$conf["canNotBeEmpty"]=array();
2269
		#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
2270
		#$conf["canBeEmpty"]=array();
2271
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
2272
		$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("sock");
2273
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
2274
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("sock");
2275
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
2276
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string");
2277
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
2278
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array(null);
2279
		#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
2280
		#$conf["disallowAllSkipableVarIsEmpty"]="";
2281
		#$conf["disallowAllSkipableVarIsEmptyArray"],字串,是否允許每個可省略參數都為空陣列,預設為"true"允許,反之為"false".
2282
		#$conf["disallowAllSkipableVarIsEmptyArray"]="";
2283
		#$conf["disallowAllSkipableVarNotExist"],字串,是否不允許每個可省略參數都不存在,預設為"false"代表允許,反之為"true".
2284
		#$conf["disallowAllSkipableVarNotExist"]="";
2285
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
2286
		#$conf["variableCheck::checkArguments"]["arrayCountEqualCheck"][]=array("");
2287
		#參考資料:
2288
		#array_keys=>http://php.net/manual/en/function.array-keys.php
2289
		#備註:
2290
		#無.
2291
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
2292
		unset($conf["variableCheck::checkArguments"]);
226 liveuser 2293
 
3 liveuser 2294
		#如果 $checkArguments["status"] 等於 "false"
2295
		if($checkArguments["status"]==="false"){
226 liveuser 2296
 
3 liveuser 2297
			#設置錯誤識別
2298
			$result["status"]="false";
226 liveuser 2299
 
3 liveuser 2300
			#設置錯誤訊息
2301
			$result["error"]=$checkArguments;
226 liveuser 2302
 
3 liveuser 2303
			#回傳結果
2304
			return $result;
226 liveuser 2305
 
3 liveuser 2306
			}#if end
226 liveuser 2307
 
3 liveuser 2308
		#如果 $checkArguments["passed"] 等於 "false"
2309
		if($checkArguments["passed"]==="false"){
226 liveuser 2310
 
3 liveuser 2311
			#設置錯誤識別
2312
			$result["status"]="false";
226 liveuser 2313
 
3 liveuser 2314
			#設置錯誤訊息
2315
			$result["error"]=$checkArguments;
226 liveuser 2316
 
3 liveuser 2317
			#回傳結果
2318
			return $result;
226 liveuser 2319
 
3 liveuser 2320
			}#if end
226 liveuser 2321
 
3 liveuser 2322
		#針對每個指令
2323
		foreach($conf["cmds"] as $cmd){
226 liveuser 2324
 
3 liveuser 2325
			#連線到 usr/bin/qbpwcf-usock.php 產生的  unix domain socket,運行指定的指令.
2326
			#回傳結果:
2327
			#$result["status"],"true"代表執行正常;"false"代表執行不正常.
2328
			#$result["error"],錯誤訊息陣列.
2329
			#$result["function"],當前執行的函式名稱.
2330
			#$result["argu"],使用的參數.
2331
			#$result["content"],執行完指令的結果.
2332
			#必填參數:
2333
			#$conf["fileArgu"],字串,變數__FILE__的內容.
2334
			$conf["sock::execAnyCmdByQBPWCFunixSocket"]["fileArgu"]=__FILE__;
2335
			#$conf["command"],字串,要執行的指令名稱.
2336
			$conf["sock::execAnyCmdByQBPWCFunixSocket"]["command"]=$cmd;
2337
			#可省略參數:
226 liveuser 2338
 
3 liveuser 2339
			#如果有設置 sock 參數
2340
			if(isset($conf["sock"])){
226 liveuser 2341
 
3 liveuser 2342
				#$conf["sock"],字串,要連線的 usr/bin/qbpwcf-sock.php 所產生的 unix domain socket 路徑與名稱,預設為 qbpwcf_usock_path.
2343
				$conf["sock::execAnyCmdByQBPWCFunixSocket"]["sock"]=$conf["sock"];
226 liveuser 2344
 
3 liveuser 2345
				}#if end
226 liveuser 2346
 
3 liveuser 2347
			#$conf["argu"],陣列字串,指令搭配的參數,預設為空陣列.
2348
			#$conf["sock::execAnyCmdByQBPWCFunixSocket"]["argu"]=$conf["argu"];
2349
			#$conf["commandIncludeArgu"],字串,是否command含有參數,預設為"false"代表沒有;反之為"true".
2350
			$conf["sock::execAnyCmdByQBPWCFunixSocket"]["commandIncludeArgu"]="true";
2351
			#$conf["commandInBg"],字串,是否要將程序放在背景執行,再取得相關資訊,預設為"false"代表不要;反之為"true".
2352
			$conf["sock::execAnyCmdByQBPWCFunixSocket"]["commandInBg"]="true";
2353
			#參考資料:
2354
			#無.
2355
			#備註:
2356
			#無.
2357
			$execAnyCmdByQBPWCFunixSocket=sock::execAnyCmdByQBPWCFunixSocket($conf["sock::execAnyCmdByQBPWCFunixSocket"]);
2358
			unset($conf["sock::execAnyCmdByQBPWCFunixSocket"]);
226 liveuser 2359
 
3 liveuser 2360
			#如果執行失敗
2361
			if($execAnyCmdByQBPWCFunixSocket["status"]==="false"){
226 liveuser 2362
 
3 liveuser 2363
				#設置錯誤識別
2364
				$result["status"]="false";
226 liveuser 2365
 
3 liveuser 2366
				#設置錯誤訊息
2367
				$result["error"]=$execAnyCmdByQBPWCFunixSocket;
226 liveuser 2368
 
3 liveuser 2369
				#回傳結果
2370
				return $result;
226 liveuser 2371
 
3 liveuser 2372
				}#if end
226 liveuser 2373
 
3 liveuser 2374
			#debug
2375
			#var_dump(__LINE__,$execAnyCmdByQBPWCFunixSocket);
226 liveuser 2376
 
3 liveuser 2377
			#儲存收到的回應
2378
			$result["content"][]=$execAnyCmdByQBPWCFunixSocket["content"];
226 liveuser 2379
 
3 liveuser 2380
			}#foreach end
226 liveuser 2381
 
3 liveuser 2382
		#設置執行正常
2383
		$result["status"]="true";
226 liveuser 2384
 
3 liveuser 2385
		#回傳結果
2386
		return $result;
226 liveuser 2387
 
3 liveuser 2388
		}#function socket end
2389
 
226 liveuser 2390
	}#class threads end