Subversion Repositories php-qbpwcf

Rev

Rev 350 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 350 Rev 383
Line 1198... Line 1198...
1198
 
1198
 
1199
		#回傳結果
1199
		#回傳結果
1200
		return $result;
1200
		return $result;
1201
 
1201
 
1202
		}#function proc_update end
1202
		}#function proc_update end
-
 
1203
		
-
 
1204
	/*
-
 
1205
	#函式說明:
-
 
1206
	#類似stream_select的替代方案, 用來檢查透過proc運行的多執行序其標準輸出、錯誤輸出是否有訊息,程序是否已經結束.
-
 
1207
	#回傳結果:
-
 
1208
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
-
 
1209
	#$reuslt["error"],執行不正常結束的錯訊息陣列.
-
 
1210
	#$result["function"],當前執行的函式名稱.
-
 
1211
	#$result["argu"],使用的參數.
-
 
1212
	#$result["content"],陣列,每個元素的key代表有訊息的channel名稱,數值為陣列.
-
 
1213
	#$result["content"][$channel],陣列,$channel為通道的名稱亦即streams參數陣列中的key.陣列的key有"content",代表得到的訊息;"alive"則代表通道是否還處於開啟的狀態.
-
 
1214
	#$result["streams"],陣列,依然開啟的通道(運行中),元素的key為該channel的名稱;數值為channel.
-
 
1215
	#$result["allChannelClosed"],字串,"true"代表streams參數的通道已經全部關閉;反之為"false".
-
 
1216
	#必填參數:
-
 
1217
	#$conf["streams"],陣列,每個元素為threads::proc回傳結果content中每個元素的content跟error,key為該stream的名稱,例如:"client_1_std"、"client_1_err".
-
 
1218
	$conf["streams"]=array();
-
 
1219
	#可省略參數:
-
 
1220
	#$conf["periodToWait"],整數,要等待多少秒來嘗試取得訊息,預設為1秒鐘.
-
 
1221
	#$conf["periodToWait"]=1;
-
 
1222
	#參考資料:
-
 
1223
	#https://www.php.net/manual/en/function.proc-open.php
-
 
1224
	#https://www.php.net/manual/en/function.proc-get-status.php
-
 
1225
	#https://www.php.net/manual/en/function.proc-terminate.php
-
 
1226
	#備註:
-
 
1227
	#無.
-
 
1228
	*/
-
 
1229
	public static function proc_stream_select(&$conf){
-
 
1230
	
-
 
1231
		#初始化要回傳的結果
-
 
1232
		$result=array();
-
 
1233
 
-
 
1234
		#取得當前執行的函數名稱
-
 
1235
		$result["function"]=__FUNCTION__;
-
 
1236
 
-
 
1237
		#如果沒有參數
-
 
1238
		if(func_num_args()==0){
-
 
1239
 
-
 
1240
			#設置執行失敗
-
 
1241
			$result["status"]="false";
-
 
1242
 
-
 
1243
			#設置執行錯誤訊息
-
 
1244
			$result["error"]="函數".$result["function"]."需要參數";
-
 
1245
 
-
 
1246
			#回傳結果
-
 
1247
			return $result;
-
 
1248
 
-
 
1249
			}#if end
-
 
1250
 
-
 
1251
		#涵式說明:
-
 
1252
		#判斷當前環境為web還是cmd
-
 
1253
		#回傳結果:
-
 
1254
		#$result,"web"或"cmd"
-
 
1255
		if(csInformation::getEnv()==="web"){
-
 
1256
 
-
 
1257
			#設置執行失敗
-
 
1258
			$result["status"]="false";
-
 
1259
 
-
 
1260
			#設置執行錯誤訊息
-
 
1261
			$result["error"][]="函數 ".$result["function"]." 僅能在命令列環境下運行!";
-
 
1262
 
-
 
1263
			#回傳結果
-
 
1264
			return $result;
-
 
1265
 
-
 
1266
			}#if end
-
 
1267
		
-
 
1268
		#取得參數
-
 
1269
		$result["argu"]=$conf;
-
 
1270
 
-
 
1271
		#如果 $conf 不為陣列
-
 
1272
		if(gettype($conf)!=="array"){
-
 
1273
 
-
 
1274
			#設置執行失敗
-
 
1275
			$result["status"]="false";
-
 
1276
 
-
 
1277
			#設置執行錯誤訊息
-
 
1278
			$result["error"][]="\$conf變數須為陣列形態";
-
 
1279
 
-
 
1280
			#如果傳入的參數為 null
-
 
1281
			if(is_null($conf)){
-
 
1282
 
-
 
1283
				#設置執行錯誤訊息
-
 
1284
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
-
 
1285
 
-
 
1286
				}#if end
-
 
1287
 
-
 
1288
			#回傳結果
-
 
1289
			return $result;
-
 
1290
 
-
 
1291
			}#if end
-
 
1292
			
-
 
1293
		#函式說明:
-
 
1294
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容.
-
 
1295
		#回傳結果:
-
 
1296
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
-
 
1297
		#$result["error"],執行不正常結束的錯訊息陣列.
-
 
1298
		#$result["simpleError"],簡單表示的錯誤訊息.
-
 
1299
		#$result["function"],當前執行的函式名稱.
-
 
1300
		#$result["argu"],設置給予的參數.
-
 
1301
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
-
 
1302
		#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
-
 
1303
		#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
-
 
1304
		#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
-
 
1305
		#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
-
 
1306
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
-
 
1307
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
-
 
1308
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
-
 
1309
		#必填參數:
-
 
1310
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
-
 
1311
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
-
 
1312
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
-
 
1313
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
-
 
1314
		#可省略參數:
-
 
1315
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
-
 
1316
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("streams");
-
 
1317
		#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null、any代表不指定變數形態.其中 resource也包含"resource (closed)".
-
 
1318
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("array");
-
 
1319
		#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
-
 
1320
		#$conf["canBeEmptyString"]="false";
-
 
1321
		#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
-
 
1322
		#$conf["canNotBeEmpty"]=array();
-
 
1323
		#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
-
 
1324
		#$conf["canBeEmpty"]=array();
-
 
1325
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
-
 
1326
		$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("periodToWait");
-
 
1327
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
-
 
1328
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("periodToWait");
-
 
1329
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
-
 
1330
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("integer");
-
 
1331
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
-
 
1332
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array(1);
-
 
1333
		#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
-
 
1334
		#$conf["disallowAllSkipableVarIsEmpty"]="";
-
 
1335
		#$conf["disallowAllSkipableVarIsEmptyArray"],字串,是否允許每個可省略參數都為空陣列,預設為"true"允許,反之為"false".
-
 
1336
		#$conf["disallowAllSkipableVarIsEmptyArray"]="";
-
 
1337
		#$conf["disallowAllSkipableVarNotExist"],字串,是否不允許每個可省略參數都不存在,預設為"false"代表允許,反之為"true".
-
 
1338
		#$conf["disallowAllSkipableVarNotExist"]="";
-
 
1339
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
-
 
1340
		#$conf["arrayCountEqualCheck"][]=array();
-
 
1341
		#參考資料:
-
 
1342
		#array_keys=>http://php.net/manual/en/function.array-keys.php
-
 
1343
		#備註:
-
 
1344
		#無.
-
 
1345
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
-
 
1346
		unset($conf["variableCheck::checkArguments"]);
-
 
1347
	
-
 
1348
		#如果執行異常
-
 
1349
		if($checkArguments["status"]==="false"){
-
 
1350
		
-
 
1351
			#設置執行失敗
-
 
1352
			$result["status"]="false";
-
 
1353
 
-
 
1354
			#設置執行錯誤訊息
-
 
1355
			$result["error"]=$checkArguments;
-
 
1356
			
-
 
1357
			#回傳結果
-
 
1358
			return $result;
-
 
1359
		
-
 
1360
			}#if end
-
 
1361
			
-
 
1362
		#如果參數檢查不通過
-
 
1363
		if($checkArguments["passed"]==="false"){
-
 
1364
		
-
 
1365
			#設置執行失敗
-
 
1366
			$result["status"]="false";
-
 
1367
 
-
 
1368
			#設置執行錯誤訊息
-
 
1369
			$result["error"]=$checkArguments;
-
 
1370
			
-
 
1371
			#回傳結果
-
 
1372
			return $result;
-
 
1373
		
-
 
1374
			}#if end
-
 
1375
	
-
 
1376
		#初始化設置要監控的 stream 陣列資訊
-
 
1377
		$streamInfo=array();
-
 
1378
	
-
 
1379
		#針對每個 stream
-
 
1380
		foreach($conf["streams"] as $channelName => $stream){
-
 
1381
		
-
 
1382
			#設置 channel 的 stream
-
 
1383
			$streamInfo[$channelName]["stream"]=$stream;
-
 
1384
			
-
 
1385
			#預設 channel 視為開啟的狀況
-
 
1386
			$streamInfo[$channelName]["alive"]=true;
-
 
1387
			
-
 
1388
			#初始化該chnnel得到的回應為空.
-
 
1389
			$result["content"][$channelName]["content"]="";
-
 
1390
			
-
 
1391
			#初始化該chnnel為開啟的狀態
-
 
1392
			$result["content"][$channelName]["alive"]=true;
-
 
1393
	
-
 
1394
			}#foreach end
-
 
1395
	
-
 
1396
		#無窮迴圈
-
 
1397
		while(true){
-
 
1398
 
-
 
1399
			#針對每個 stream
-
 
1400
			foreach($streamInfo as $name=>$info){
-
 
1401
			
-
 
1402
				#如果通道是開啟的
-
 
1403
				if($info["alive"]){
-
 
1404
				
-
 
1405
					#確認是否尚未關閉
-
 
1406
					if(!feof($info["stream"])){
-
 
1407
					
-
 
1408
						#讀取訊息
-
 
1409
						$msg=fread($info["stream"],2048);
-
 
1410
						
-
 
1411
						#如果有訊息
-
 
1412
						if(!empty($msg)){
-
 
1413
						
-
 
1414
							#記錄訊息
-
 
1415
							$result["content"][$name]["content"]=$result["content"][$name]["content"].$msg.PHP_EOL;
-
 
1416
						
-
 
1417
							}#if end
-
 
1418
 
-
 
1419
						}#if end
-
 
1420
						
-
 
1421
					#反之
-
 
1422
					else{
-
 
1423
					
-
 
1424
						#設置通道已經關閉的識別
-
 
1425
						$streamInfo[$name]["alive"]=false;
-
 
1426
						
-
 
1427
						#初始化該chnnel為開啟的狀態
-
 
1428
						$result["content"][$channelName]["alive"]=false;
-
 
1429
						
-
 
1430
						#卸除作為參數的通道
-
 
1431
						unset($conf["streams"][$name]);
-
 
1432
					
-
 
1433
						}#else end
-
 
1434
				
-
 
1435
					}#if end
-
 
1436
			
-
 
1437
				}#foreach end
-
 
1438
				
-
 
1439
			#如果已經沒有要監控的通道存在
-
 
1440
			if(empty($conf["streams"])){
-
 
1441
			
-
 
1442
				#跳出 while
-
 
1443
				break;
-
 
1444
			
-
 
1445
				}#if end
-
 
1446
			
-
 
1447
			#如果等待時間已經結束
-
 
1448
			if(--$conf["periodToWait"]===0){
-
 
1449
			
-
 
1450
				#跳出 while
-
 
1451
				break;
-
 
1452
			
-
 
1453
				}#if end
-
 
1454
			
-
 
1455
			#休息1秒鐘
-
 
1456
			sleep(1);
-
 
1457
			
-
 
1458
			}#while end
-
 
1459
		
-
 
1460
		#針對每個 stream
-
 
1461
		foreach($result["content"] as $channelName => $stream){
-
 
1462
		
-
 
1463
			#如果輸出為空
-
 
1464
			if(empty($result["content"][$channelName]["content"])){
-
 
1465
			
-
 
1466
				#卸除之
-
 
1467
				unset($result["content"][$channelName]);
-
 
1468
				
-
 
1469
				}#if end
-
 
1470
			
-
 
1471
			}#foreach end
-
 
1472
		
-
 
1473
		#取得依然可以使用的通道
-
 
1474
		$result["streams"]=$conf["streams"];
-
 
1475
		
-
 
1476
		#如果可以使用的通道已經不存在
-
 
1477
		if(empty($result["streams"])){
-
 
1478
		
-
 
1479
			#設置所有 channel 已經關閉.
-
 
1480
			$result["allChannelClosed"]="true";
-
 
1481
		
-
 
1482
			}#if end
-
 
1483
			
-
 
1484
		#反之
-
 
1485
		else{
-
 
1486
		
-
 
1487
			#設置所有 channel 未關閉.
-
 
1488
			$result["allChannelClosed"]="false";
-
 
1489
		
-
 
1490
			}#else end
-
 
1491
 
-
 
1492
		#設置執行正常
-
 
1493
		$result["status"]="true";
-
 
1494
		
-
 
1495
		#回傳結果
-
 
1496
		return $result;
-
 
1497
	
-
 
1498
		}#function proc_stream_select end
1203
 
1499
 
1204
	/*
1500
	/*
1205
	#函式說明:
1501
	#函式說明:
1206
	#透過parallel展示多執行序運作.
1502
	#透過parallel展示多執行序運作.
1207
	#回傳結果:
1503
	#回傳結果: