Fatal error: Call to undefined function socket_create() 解決辦法


說實話,在配置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。歡迎一起討論和提問。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM