導航:首頁 > 編程語言 > phpsocket多線程

phpsocket多線程

發布時間:2023-03-26 20:37:14

php多個file_get_contents如何多線程並發

這是阻塞調用,肯定是第一個完成了才執行第二個。

不知道你為什麼希望同時並發,調用後的結果需要使用嗎,如果不使用,可以啟動一個後台進程去打開文件,命令發出就不管了。如果還要用結果,那PHP很難達到你的目的,你應該考慮使用DELPHI、C++這些來開發。

② 北大青鳥java培訓:PHP中的(偽)多線程與多進程

利用WEB伺服器本身的多線程來處理,從WEB伺服器多次調用我們需要實現多線程的程序。
PHP中也能多線程了,那麼問題也來了,那就是同步的問題。
安徽電腦培訓http://www.kmbdqn.cn/知道PHP本身是不支持多線程的,所以更不會有什麼像Java中synchronize的方法了。
那我們該如何做呢?1.盡量不訪問同一個資源。
以避免沖突。
但是可以同時像資料庫操作。
因為資料庫是支持並發操作的。
所以在多線程的PHP中不要向同一個文件中寫入數據。
如果必須要寫的話,用別的方法進行同步。
如調用flock對文件進行加鎖等。
或建立臨時文件,並在另外的線程中等待這個文件的消失while(file_exits('xxx'));這樣就等於這個臨時文件存在時,表示其實線程正在操作。
如果沒有了這個文件,說明其它線程已經釋放了這個。
2.盡量不要從runThread在執行fputs後取這個socket中讀取數據。
因為要實現多線程,需要的用非阻塞模式。
即在像fgets這樣的函數時立即返回。

所以讀寫數據就會出問題。
如果使用阻塞模式的話,程序就不算是多線程了。
他要等上面的返回才執行下面的程序。
所以如果需要交換數據最後利用外面文件或數據中完成。
實在想要的話就用socket_set_nonblock($fp)來實現。
說了這么多,倒底這個有沒有實際的意義呢?在什麼時候需要這種用這種方法呢?答案是肯定的。
大家知道。
在一個不斷讀取網路資源的應用中,網路的速度是瓶頸。
如果采多這種形式就可以同時以多個線程對不同的頁面進行讀取。

③ php socket 如何實現非阻塞

關於socket的阻塞與非阻塞模式以及它們之間的優缺點,這已經沒什麼可言的;我打個很簡單的比方,如果你調用socket send函數時;
如果是阻塞模式下:
send先比較待發送數據的長度len和套接字s的發送緩沖的長度,如果len大於s的發送緩沖區的長度,該函數返回SOCKET_ERROR;如果len小於或者等於s的發送緩沖區的長度,那麼send先檢查協議是否正在發送s的發送緩沖中的數據,如果是就等待協議把數據發送完,如果協議還沒有開始發送s的發送緩沖中的數據或者s的發送緩沖中沒有數據,那麼 send就比較s的發送緩沖區的剩餘空間和len,如果len大於剩餘空間大小,send就一直等待協議把s的發送緩沖中的數據發送完,如果len小於剩餘空間大小send就僅僅把buf中的數據到剩餘空間里
如果是非阻塞模式下:
在調用socket send函數時,如果能寫到socket緩沖區時,就寫數據並返回實際寫的位元組數目,當然這個返回的實際值可能比你所要寫的數據長度要小些(On nonblocking stream oriented sockets, the number of bytes written can be between 1 and the requested length, depending on buffer availability on both the client and server computers),如果不可寫的話,就直接返回SOCKET_ERROR了,所以沒有等待的過程。。
經過上面的介紹後,下面介紹如何設置socket的非阻塞模式:
當使用socket()函數和WSASocket()函數創建套接字時,默認都是阻塞的。在創建套接字之後,通過調用ioctlsocket()函數,將該套接字設置為非阻塞模式。
//-------------------------
// Set the socket I/O mode: In this case FIONBIO
// enables or disables the blocking mode for the
// socket based on the numerical value of iMode.
// If iMode = 0, blocking is enabled;
// If iMode != 0, non-blocking mode is enabled.
u_long iMode = 1; //non-blocking mode is enabled.
ioctlsocket(m_socket, FIONBIO, &iMode); //設置為非阻塞模式

套接字設置為非阻塞模式後,在調用Windows Sockets API函數時,調用函數會立即返回。大多數情況下,這些函數調用都會調用「失敗」,並返回WSAEWOULDBLOCK錯誤代碼。說明請求的操作在調用期間內沒有時間完成。通常,應用程序需要重復調用該函數,直到獲得成功返回代碼。 不同的Windows Sockets API函數,在調用失敗時返回的WSAEWOULDBLOCK錯誤代碼具有不同的含義
需要說明的是並非所有的 Windows Sockets API 在非阻塞模式下調用,都會返回 WSAEWOULDBLOCK 錯誤。例如,以非阻塞模式的套接字為參數調用 bind() 函數時,就不會返回該錯誤代碼。當然,在調用 WSAStartup() 函數時更不會返回該錯誤代碼,因為該函數是應用程序第一調用的函數,當然不會返回這樣的錯誤代碼。
要將套接字設置為非阻塞模式,除了使用 ioctlsocket() 函數之外,還可以使用 WSAAsyncselect() 和 WSAEventselect() 函數。當調用該函數時,套接字會自動地設置為非阻塞方式:

④ 想用PHP做Socket伺服器,不知道如何實現同時和多個不同客戶端數據交互

因為只有調用了accept客戶端才能連上,你如果accept下面接一個循環,那麼第二個用戶不是說能不能進這個循環,而是連不進……此時只有第一個用戶break出了循環,然後程序回頭再調用accept,第二個用戶才能連上。
用多進程來處理如何?因為accept一個客戶端以後,應該是馬上准備accept下一個客戶端才對,而不是處理完現在這個客戶端才accept下一個客戶端。
socket_accept以後,直接調用
pcntl_fork(),此時進程會分裂為兩個,其中一個的pnctl_fork返回值是0,另一個不是0。不是0的那個直接繼續調用socket_accept即可,是0的那個處理客戶端請求。
pnctl_fork不知道在windows下能不能用。
不過返回不是0的那個進程並不是這樣就完事了,還要調用pcntl_wait防止子進程卡在那邊沒有完全結束。你可以在主進程里時不時就調用這個,配上WNOHANG作為option參數防止沒有子進程需要wait的時候卡在那邊。
這都是linux下常用的處理手段。說實話本來我想讓你用多線程的,不過看了一圈不知道php里怎麼用線程,倒是找到了用進程的方式,所以就

閱讀全文

與phpsocket多線程相關的資料

熱點內容
主角10歲收了母親的小說 瀏覽:543
女獄電影日本 瀏覽:154
二龍湖浩哥最早的作品 瀏覽:699
異界收母入後宮 瀏覽:155
ida反編譯出來的代碼是匯編指令嗎 瀏覽:820
小孩子是天才的電影 瀏覽:450
輿情監控演算法 瀏覽:147
好看123電影 瀏覽:751
成龍主演的五行拳電影名字 瀏覽:954
好看的中文字幕經典 瀏覽:913
android仿qq輸入 瀏覽:117
看輕小說的網站 瀏覽:86
命令與征服3戰役存檔 瀏覽:147
台灣風月影片 瀏覽:326
彭偶么電視劇電影大全 瀏覽:291
重生井岡山林楓 瀏覽:519
日本大片網址大全 瀏覽:741
在線免費觀看完整版電影大全韓國 瀏覽:889
片子視頻破解網站 瀏覽:853
穿越抗戰時期送物資的小說 瀏覽:536