php的非阻塞套接字socket

本文探讨了在PHP中使用非阻塞套接字进行服务器在线状态检测的问题。作者通过研究发现,将socket设为非阻塞应在connect之后进行,解决了报错10035的问题。同时指出,不同操作系统下的错误号可能不同,如Windows下的10035和Linux下的115,提醒开发者注意平台差异。
摘要由CSDN通过智能技术生成

        本文的需求是检测数量不确定的服务器在不在线的问题。一开始是准备网页异步调用php去检测socket连接,所以没弄过这块内容的我就上网搜了类似php异步调用socket等内容。真是~。~

        先说说搜索结果,出来最多的都是ajax,curl,fsockopen和popen等等。偶然间发现了一篇文章中提到了socket中的select函数,然后仔细看了看,才发现自己把非阻塞和异步搞混了。这个问题本可以继续深入,这里暂且不说。现在来说说非阻塞套接字在本文需求下的应用。

         socket_select函数相关的代码不多,网上多得是c语言的select函数的用法,基本流程是建立一个套接字,设为非阻塞的,然后再connect,这个时候就用select在timeout时间内选择建立好的连接来进行读写,最后用完关掉。一般人或许就照搬c语言代码就差不多了,把相应的函数改成php里的形式。老实说,一开始我也这么做的,结果失败了。网上有一份类似的php写的socket代码,里面的错误有不少,我都给改了,但结果还是报错10035,无法立即建立一个非阻塞套接字连接。于是找到socket_connect的manual,就让我在user contributed notes发现了这么一段话。

        If you're using non-blocking, be sure not to turn it on until after you connect, otherwise you will get the mesasge: PHP Warning:  socket_connect() unable to connect [115]: Operation now in progress in file.php on line 123 and socket_connect() will return false (even though it will connect).

        虽然这段话是13年前的,但我觉得还是有道理的,因为我把设为非阻塞的操作和connect的操作换了下顺序,真的就成功连接上了。然而问题在于每次连接都是先阻塞得连接好再设为非阻塞的,每次connect的时间真是个问题,一旦对方没响应,等个5秒都是小意思,然后我就重新去看了下c语言的代码。这个时候我才发现,我被上述这段话迷惑了,c语言的基本流程顺序是没有问题的,那就是针对非阻塞的套接字。每个套接字先设为非阻塞的然后再connect,虽然这样会报错,但还是会继续连接的,仅仅只是不能立马完成而已,正如上述那段英文的最后 = =。

        然而一个致命的问题让我困扰了好久,上述connect后根据报出的错误numbe来判断是不是我们想要的连接。简单来说,就是报出的错误如果是10035,那么就可以进行下一步任务,如果是其他错误那就不行了。所以一开始还以为是115又浪费了不少时间。

        (0813更新----然而,在不同的操作系统中,error number好像是不一样的,windows下是10035,Linux下就是115了,果然还是少用windows开发好。)

  
  
  
define('EINPROGRESS', 10035);
function noblockingsocket($ip, $port, &$errstr, &$errno){
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值