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开启路径
![在这里插入图片描述](https://images2015.cnblogs.com/blog/1154270/201705/1154270-20170504130251632-1522733181.jpg#pic_center)
注意:最重要最关键的就是系统变量部分的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 看你的项目部署在哪路径会不一致。
然后执行后,成功是下面这个样子的。【**如果没有成功,则说明上一步骤没有成功**】
![在这里插入图片描述](https://images2015.cnblogs.com/blog/1154270/201705/1154270-20170504131347054-1157301603.jpg#pic_center)
关于还有个问题就是可能你开启的php版本不对,导致php的命令没有被发现,然后没有能够运行到socket的组件。这时候你就要指定对应php.ini开启socket组件的php.exe文件路径。
最后,整个的解决步骤是这样的,一定要耐心按步骤来操作,不用着急。