php本地如何开启websocket遇到的坑

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文件路径。

最后,整个的解决步骤是这样的,一定要耐心按步骤来操作,不用着急。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值