《10个经典的PHP实例教程源码》由会员分享,可在线阅读,更多相关《10个经典的PHP实例教程源码(97页珍藏版)》请在金锄头文库上搜索。
1、file:/C|/Users/Administrator/Desktop/新建文本文档.txt2015/4/21 14:54:251.PHP获取跳转的URL真实地址源码function curl_post_302($url,$data=null) $ch = curl_init();curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);curl_setopt($ch, CURLOPT_TIMEOUT,
2、 30);curl_setopt($ch, CURLOPT_POST, 1);curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); / 获取转向后的内容 $data = curl_exec($ch);$Headers = curl_getinfo($ch); curl_close($ch);if($data != $Headers) return $Headers“url“; elsereturn false;2.php开启多进程的方法源码外部連進來的Socketglobal $ServerSocket,$RemoteSocket,$IP,$Port;$Se
3、rverSocket=$ConnectedServerSocket;declare(ticks = 1); /這一行一定要加,不然沒辦法設定訊息處理函數。/設定訊息處理函數if(!pcntl_signal(SIGTERM, “ChildSignalFunction“) return;if(!pcntl_signal(SIGTRAP, “ChildSignalFunction“) return;/建立一個連線到VNC的Socket$RemoteSocket=socket_create(AF_INET, SOCK_STREAM,SOL_TCP);file:/C|/Users/Administrat
4、or/Desktop/新建文本文档.txt2015/4/21 14:54:25/連線到內部的VNC$RemoteConnected=socket_connect($RemoteSocket,$IP,$Port);if(!$RemoteConnected) return; /無法連線到VNC 結束/將Socket的處理設為Nonblock,避免程式被Block住if(!socket_set_nonblock($RemoteSocket) return;if(!socket_set_nonblock($ServerSocket) return;while(true)/這邊我們採用pooling的方
5、式去取得資料$NoRecvData=false; /這個變數用來判別外部的連線是否有讀到資料$NoRemoteRecvData=false;/這個變數用來判別VNC連線是否有讀到資料$RecvData=socket_read($ServerSocket,4096,PHP_BINARY_READ);/從外部連線讀取4096 bytes的資料$RemoteRecvData=socket_read($RemoteSocket,4096,PHP_BINARY_READ);file:/C|/Users/Administrator/Desktop/新建文本文档.txt2015/4/21 14:54:25/
6、從vnc連線連線讀取4096 bytes的資料if($RemoteRecvData=)/VNC連線中斷,該結束嘍echo“Remote Connection Closen“;return; if($RemoteRecvData=false)/*由於我們是採用nonblobk模式這裡的情況就是vnc連線沒有可供讀取的資料*/$NoRemoteRecvData=true;/清除掉Last Errrorfile:/C|/Users/Administrator/Desktop/新建文本文档.txt2015/4/21 14:54:25socket_clear_error($RemoteSocket);i
7、f($RecvData=)/外部連線中斷,該結束嘍echo“Client Connection Closen“;return;if($RecvData=false)/*由於我們是採用nonblobk模式這裡的情況就是外部連線沒有可供讀取的資料*/file:/C|/Users/Administrator/Desktop/新建文本文档.txt2015/4/21 14:54:25$NoRecvData=true;/清除掉Last Errrorsocket_clear_error($ServerSocket);if($NoRecvData/睡醒後,繼續作pooling的動作讀取socketcontin
8、ue;/Recv Dataif(!$NoRecvData)file:/C|/Users/Administrator/Desktop/新建文本文档.txt2015/4/21 14:54:25/外部連線讀取到資料while(true)/把外部連線讀到的資料,轉送到VNC連線上$WriteLen=socket_write($RemoteSocket,$RecvData);if($WriteLen=false)/由於網路傳輸的問題,目前暫時無法寫入資料/先睡個0.1秒再繼續嘗試。usleep(100000);continue;if($WriteLen=0)file:/C|/Users/Administ
9、rator/Desktop/新建文本文档.txt2015/4/21 14:54:25/遠端連線中斷,程式該結束了echo“Remote Write Connection Closen“;return;/從外部連線讀取的資料,已經完全送給VNC連線時,中斷這個迴圈。if($WriteLen=strlen($RecvData) break;/如果資料一次送不完就得拆成好幾次傳送,直到所有的資料全部送出為止$RecvData=substr($RecvData,$WriteLen);if(!$NoRemoteRecvData)/這邊是從VNC連線讀取到的資料,再轉送回外部的連線/原理跟上面差不多不再贅
10、述while(true)file:/C|/Users/Administrator/Desktop/新建文本文档.txt2015/4/21 14:54:25$WriteLen=socket_write($ServerSocket,$RemoteRecvData);if($WriteLen=false)usleep(100000);continue;if($WriteLen=0)echo“Remote Write Connection Closen“;return;if($WriteLen=strlen($RemoteRecvData) break;$RemoteRecvData=substr($
11、RemoteRecvData,$WriteLen);file:/C|/Users/Administrator/Desktop/新建文本文档.txt2015/4/21 14:54:25function DestroySocket()/用來關閉已經開啟的Socketglobal$ServerSocket,$RemoteSocket;if($RemoteSocket)/如果已經開啟VNC連線/在Close Socket前必須將Socket shutdown不然對方不知到你已經關閉連線了socket_shutdown($RemoteSocket,2);socket_clear_error($Remot
12、eSocket);/關閉Socketsocket_close($RemoteSocket); file:/C|/Users/Administrator/Desktop/新建文本文档.txt2015/4/21 14:54:25/關閉外部的連線socket_shutdown($ServerSocket,2);socket_clear_error($ServerSocket);socket_close($ServerSocket);/這裡是整個程式的開頭,程式從這邊開始執行/這裡首先執行一次fork$PID=pcntl_fork();if($PID=-1) die(“could not fork“)
13、;/如果$PID不為0表示這是Parrent Process/$PID就是Child Process/這是Parrent Process 自己結束掉,讓Child成為一個Daemon。if($PID) die(“Daemon PID:$PIDn“);file:/C|/Users/Administrator/Desktop/新建文本文档.txt2015/4/21 14:54:25/從這邊開始,就是Daemon模式在執行了/將目前的Process跟終端機脫離成為daemon模式if(!posix_setsid() die(“could not detach from terminaln“);/設定
14、daemon 的訊息處理函數declare(ticks = 1);if(!pcntl_signal(SIGTERM, “SignalFunction“) die(“Error!n“);if(!pcntl_signal(SIGTRAP, “SignalFunction“) die(“Error!n“);if(!pcntl_signal(SIGCHLD, “SignalFunction“) die(“Error!n“);/建立外部連線的Socket$ServerSocket=socket_create(AF_INET, SOCK_STREAM,SOL_TCP);/設定外部連線監聽的IP以及Port
15、,IP欄位設0,表示經聽所有介面的IPif(!socket_bind($ServerSocket,0,$ServerPort) die(“Cannot Bind Socket!n“);/開始監聽Portif(!socket_listen($ServerSocket) die(“Cannot Listen!n“);/將Socket設為nonblock模式file:/C|/Users/Administrator/Desktop/新建文本文档.txt2015/4/21 14:54:25if(!socket_set_nonblock($ServerSocket) die(“Cannot Set Server Socket to Block!n“);/清空$PID變數,表示目前沒有任何的Child Processunset($PID);while(true)/進入pooling模式,每隔1秒鐘就去檢查有沒有連線進來。sleep(1);/檢查有沒有連線進來$ConnectedServerSocket=socket_accept($ServerSocket);if($ConnectedServerSocket!=false)/有人連進來嘍/起始一個Child Process用來處理連線$PID=pcntl_fork();file:/C|/Users/Administrator