說實話,在配置socket的使用過程中,新手都會遇到這個問題,很是棘手。而且弄了半天都會發現還是沒有弄夠弄好,浪費時間和精力。
所以想在這里分享下我的解決辦法,並且可以跟你保證100%有效,本人自己親自操作的。
說說這個問題的解決思路:
問題一,socket組件沒有開啟。
問題二,php的開啟路徑有錯
問題三,php存在多個版本,導致開啟的php不對。
先聲明下,我是使用的phpstudy進行搭建的環境。(我百度了解了下wamp中部分地方不一樣,我下面會詳細說明)
步驟一:要開啟socket的支持組件
對phpstudy右鍵->打開配置文件->php.ini,搜索extension=php_sockets.dll,把前面的;分號去掉,這個是一個注釋。
注意:由於phpsutdy中的版本不同所對應的配置文件也會不同,所以為了確保安全,個人建議你查看了phpstudy的版本后再去到根目錄去搜對應的php.ini修改。
記得開啟之后一定要重新啟動phpstudy!
關於wamp的socket支持開啟的話,apache和php下面的php.ini都要一起修改開啟!!區別就在於phpstudy的只用修改一個php.ini。
步驟二:檢驗socket組件是否已經開啟
方法一:直接在瀏覽器中輸入:localhost,然后彈出來的信息你就可以直接瀏覽查看是否支持socket。如果支持就說明已經開啟成功,如果是×說明第一步沒有成功!
方法二:在php的www文件夾下面創建test.php,在里面輸入下面的代碼:
<?php phpinfo(); ?>
然后在瀏覽器中輸入localhost/test.php去找到對應的socket組件的支持,如果像下圖就是成功的開啟了。
步驟三:設置cmd中可以啟動php
我的計算機右鍵->屬性->高級系統設置->高級->環境變量->配置php開啟路徑
注意:最重要最關鍵的就是系統變量部分的PATH后面添加的php開啟的路徑,指向你之前配置正確的php.ini開啟的那個php版本路徑。也就是存放的php.exe的對應路徑。
我這里是存在D:\phpStudy\php55n下。不用具體到D:\phpStudy\php55n\php.exe!!
接下來還需要再配置系統變量部分的path路徑,同上面的PATH路徑一樣。
配置好后就可以直接確定,確定退出。
步驟四:運行php對應的代碼測試PHP是否配置成功和socket是否已經開啟。
在搜索中輸入cmd->輸入: php d:\phpstudy\www\open.php
open.php用於測試socket的開啟是否正確,所以open.php的代碼是:
if(extension_loaded('sockets')){ echo "1"; }else{ echo "0"; }
然后會看到上面輸出的是1就說明是socket開啟成功了,如果是0則說明socket沒有開啟成功。
如果提示PHP命令未找到則說明上面的步驟三沒有配置正確!!
步驟五:測試socket服務端是否有錯.
下面的是socket服務端的代碼,然后運行就知道問題Fatal error: Call to undefined function socket_create() 是否解決:
<?php //確保在連接客戶端時不會超時 set_time_limit(0); //設置IP和端口號 $address = "127.0.0.1"; $port = 2048; //調試的時候,可以多換端口來測試程序! /** * 創建一個SOCKET * AF_INET=是ipv4 如果用ipv6,則參數為 AF_INET6 * SOCK_STREAM為socket的tcp類型,如果是UDP則使用SOCK_DGRAM */ $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die("socket_create() 失敗的原因是:" . socket_strerror(socket_last_error()) . "/n"); //阻塞模式 socket_set_block($sock) or die("socket_set_block() 失敗的原因是:" . socket_strerror(socket_last_error()) . "/n"); //綁定到socket端口 $result = socket_bind($sock, $address, $port) or die("socket_bind() 失敗的原因是:" . socket_strerror(socket_last_error()) . "/n"); //開始監聽 $result = socket_listen($sock, 4) or die("socket_listen() 失敗的原因是:" . socket_strerror(socket_last_error()) . "/n"); echo "OK\nBinding the socket on $address:$port ... "; echo "OK\nNow ready to accept connections.\nListening on the socket ... \n"; do { // never stop the daemon //它接收連接請求並調用一個子連接Socket來處理客戶端和服務器間的信息 $msgsock = socket_accept($sock) or die("socket_accept() failed: reason: " . socket_strerror(socket_last_error()) . "/n"); //讀取客戶端數據 echo "Read client data \n"; //socket_read函數會一直讀取客戶端數據,直到遇見\n,\t或者\0字符.PHP腳本把這寫字符看做是輸入的結束符. $buf = socket_read($msgsock, 8192); echo "Received msg: $buf \n"; //數據傳送 向客戶端寫入返回結果 $msg = "welcome \n"; socket_write($msgsock, $msg, strlen($msg)) or die("socket_write() failed: reason: " . socket_strerror(socket_last_error()) ."/n"); //一旦輸出被返回到客戶端,父/子socket都應通過socket_close($msgsock)函數來終止 socket_close($msgsock); } while (true); socket_close($sock); ?>
同樣搜索cmd->輸入:php d:\phpstudy\www\websocket\websocket\index.php 看你的項目部署在哪路徑會不一致。
然后執行后,成功是下面這個樣子的。【如果沒有成功,則說明上一步驟沒有成功】
關於還有個問題就是可能你開啟的php版本不對,導致php的命令沒有被發現,然后沒有能夠運行到socket的組件。這時候你就要指定對應php.ini開啟socket組件的php.exe文件路徑。
最后,整個的解決步驟是這樣的,一定要耐心按步驟來操作,不用着急。
如果在以上的操作有什么問題可以給我留言或者加我的QQ:330168885。歡迎一起討論和提問。