Subversion Repositories php-qbpwcf

Rev

Rev 368 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 368 Rev 383
Line 163... Line 163...
163
$clientErrOut=&$proc_c["content"][0]["error"];
163
$clientErrOut=&$proc_c["content"][0]["error"];
164
 
164
 
165
#提示 client 運行中且提供 pid
165
#提示 client 運行中且提供 pid
166
echo $clientLogHead."client(pid:".$proc_c["content"][0]["proc_get_status"]["pid"].") is running....".PHP_EOL;
166
echo $clientLogHead."client(pid:".$proc_c["content"][0]["proc_get_status"]["pid"].") is running....".PHP_EOL;
167
 
167
 
-
 
168
#設置要監控的 stream 陣列資訊
-
 
169
$stream_r=array();
-
 
170
$stream_r["serverStdOut"]=array();
-
 
171
$stream_r["serverStdOut"]["stream"]=$serverStdOut;
-
 
172
$stream_r["serverStdOut"]["alive"]=true;
-
 
173
$stream_r["serverErrOut"]=array();
168
#用 stream_select 來取得兩個程序的輸出....
174
$stream_r["serverErrOut"]["stream"]=$serverErrOut;
-
 
175
$stream_r["serverErrOut"]["alive"]=true;
-
 
176
$stream_r["clientStdOut"]=array();
-
 
177
$stream_r["clientStdOut"]["stream"]=$clientStdOut;
-
 
178
$stream_r["clientStdOut"]["alive"]=true;
-
 
179
$stream_r["clientErrOut"]=array();
-
 
180
$stream_r["clientErrOut"]["stream"]=$clientErrOut;
-
 
181
$stream_r["clientErrOut"]["alive"]=true;
169
 
182
 
170
#給 stream select 的 read msg monitor
-
 
171
$stream_r=array("serverStdOut"=>$serverStdOut,"serverErrOut"=>$serverErrOut,"clientStdOut"=>$clientStdOut,"clientErrOut"=>$clientErrOut);
-
 
172
 
-
 
173
#debug
-
 
174
#var_dump(__LINE__,$stream_r);exit;
-
 
175
 
-
 
176
#複製一份,避免被 stream_select 異動到原始的 stream
-
 
177
$stream_r_select=$stream_r;
-
 
178
 
-
 
179
#給 stream select 的 write msg monitor
183
#設置預設下個訊息開頭不要換行
180
$stream_w=null;
-
 
181
 
-
 
182
#給 steam select 的 unexpect msg monitor
-
 
183
$stream_e=null;
184
$eolAtStart=false;
184
 
185
 
185
#無窮迴圈
186
#無窮迴圈
186
while(true){
187
while(true){
187
 
188
 
188
	#取得有異動的 stream
189
	#針對每個 stream
189
	$EventCount=stream_select($stream_r_select,$stream_w,$stream_e,5);
190
	foreach($stream_r as $name=>$info){
190
 
-
 
191
	#如果沒有異動的 stream
-
 
192
	if($EventCount===0){
-
 
193
	
-
 
194
		#用 "." 代表 idle,沒有異動.
-
 
195
		echo ".";
-
 
196
	
191
	
197
		}#if end
-
 
198
	
-
 
199
	#如果有異動的 stream
192
		#如果通道是開啟的
200
	if(in_array($stream_r_select,$stream_r)){
-
 
201
	
-
 
202
		#針對每個 stream
193
		if($info["alive"]){
203
		foreach($stream_r_select as $key => $stream){
-
 
204
		
194
		
205
			#debug
-
 
206
			var_dump(__LINE__,$stream);
-
 
207
		
-
 
208
			#如果有內容尚未讀取
195
			#確認是否尚未關閉
209
			while(!eof($stream)){
196
			if(!feof($info["stream"])){
210
			
-
 
211
				#取得訊息字串
-
 
212
				$string=fread($stream,2048);
-
 
213
			
-
 
214
				#$serverLogHead
-
 
215
				#$clientLogHead
-
 
216
			
197
			
217
				#判斷來源
198
				#讀取訊息
218
				switch($key){
199
				$msg=fread($info["stream"],2048);
219
				
200
				
220
					#如果是伺服端的標準輸出
201
				#如果有訊息
221
					case "serverStdOut":
202
				if(!empty($msg)){
222
					
203
				
223
					#如果是伺服端的錯誤輸出
204
					#如果開頭要換行
224
					case "serverErrOut":
205
					if($eolAtStart){
225
					
-
 
226
						#印出訊息
-
 
227
						echo $serverLogHead.":".$string.PHP_EOL;
-
 
228
					
206
					
-
 
207
						#輸出換行符號
229
						break;
208
						echo PHP_EOL;
230
						
209
						
231
					#如果是用戶的標準士輸出
210
						#設置下個訊息開頭不用換行的識別
232
					case "clientStdOut":
211
						$eolAtStart=false;
233
					
-
 
234
					#如果是用戶的錯誤輸出
-
 
235
					case "clientErrOut":
-
 
236
					
-
 
237
						#印出訊息
-
 
238
						echo $clientLogHead.":".$string.PHP_EOL;
-
 
239
					
-
 
240
						break;
-
 
241
					
212
					
-
 
213
						}#if end
-
 
214
				
242
					#其他不支援的 key
215
					#echo message.
-
 
216
					echo $name.":".$msg.PHP_EOL;
-
 
217
				
243
					default:
218
					}#if end
-
 
219
 
-
 
220
				}#if end
-
 
221
				
-
 
222
			#反之
-
 
223
			else{
-
 
224
			
-
 
225
				#設置通道已經關閉的識別
-
 
226
				$stream_r[$name]["alive"]=false;
-
 
227
				
-
 
228
				#如果開頭要換行
-
 
229
				if($eolAtStart){
-
 
230
				
-
 
231
					#輸出換行符號
-
 
232
					echo PHP_EOL;
244
					
233
					
245
						#debug
-
 
246
						echo "unsupported key:".$key.PHP_EOL;
234
					#設置下個訊息開頭不用換行的識別
247
						
-
 
248
						#結束執行,回傳shell 1.
-
 
249
						exit(1);
235
					$eolAtStart=false;
250
				
236
				
251
					}#switch end
237
					}#if end
-
 
238
		
-
 
239
				#提示 server 訊息通道已經關閉 
-
 
240
				echo $name.":channel closed".PHP_EOL;
252
			
241
			
253
				}#while end
242
				}#else end
-
 
243
		
-
 
244
			}#if end
-
 
245
			
-
 
246
		#反之
-
 
247
		else{
-
 
248
		
-
 
249
			#移除已經掰掰的通道
-
 
250
			unset($stream_r[$name]);
254
		
251
		
255
			}#foreach end
252
			}#else end
256
	
253
	
257
		}#if end
254
		}#foreach end
258
 
255
	
259
	}#while end
-
 
260
 
-
 
261
/*
-
 
262
 
-
 
263
#若程序運行中,就不斷執行
256
	#如果已經沒有要監控的通道存在
264
while($proc["content"][0]["statusCode"]==="?"){
257
	if(empty($stream_r)){
265
 
258
	
266
	#更新程序狀況
-
 
267
	#函式說明:
-
 
268
	#更新透過proc執行的多程序資訊.
-
 
269
	#回傳結果:
259
		#跳出 while
270
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
-
 
271
	#$reuslt["error"],執行不正常結束的錯訊息陣列.
-
 
272
	#$result["function"],當前執行的函式名稱.
-
 
273
	#$result["argu"],使用的參數.
-
 
274
	#$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"代表程序的資訊.
260
		break;
275
	#必填參數:
-
 
276
	#$conf["procs"],陣列,運行self::proc後回傳的content.
-
 
277
	$conf["procs"]=$proc["content"];
-
 
278
	#可省略參數:
-
 
279
	#無.
-
 
280
	#參考資料:
-
 
281
	#無.
-
 
282
	#備註:
-
 
283
	#無.
-
 
284
	$proc_update=threads::proc_update($conf);
-
 
285
	unset($conf);
-
 
286
	
261
	
287
	#如果執行異常
-
 
288
	if($proc_update["status"]==="false"){
-
 
289
 
-
 
290
		#debug
-
 
291
		var_dump($proc_update);
-
 
292
		
-
 
293
		#結束執行,回傳shell 1.
-
 
294
		exit(1);
-
 
295
 
-
 
296
		}#if end
262
		}#if end
297
		
263
		
298
	#更新程序狀態
264
	#提示沒有訊息
299
	$proc["content"]=$proc_update["content"];
-
 
300
 
-
 
301
	}#if end
265
	echo ".";
302
	
266
	
303
#如果client最終運行異常
267
	#設置下個訊息開頭要換行
304
if($proc["content"][0]["statusCode"]!==0){
-
 
305
 
-
 
306
	#debug
-
 
307
	var_dump($proc);
268
	$eolAtStart=true;
308
	
-
 
309
	#結束執行,回傳shell 1.
-
 
310
	exit(1);
-
 
311
 
-
 
312
	}#if end
-
 
313
	
269
	
-
 
270
	#休息1秒鐘
314
#debug
271
	sleep(1);
-
 
272
		
315
var_dump($proc);
273
	}#while end
316
 
274
 
-
 
275
#break point
317
*/
276
exit;
318
 
277
 
319
?>
278
?>