【问题标题】:How to implement a PHP timeout when waiting for sockets?等待套接字时如何实现PHP超时?
【发布时间】:2017-03-08 03:18:10
【问题描述】:

每 60 秒,我想执行一些其他的例程。在此活动期间,如果由于任何原因断开连接,我也希望借此机会重新建立连接。这如何实现?

<?php
$sock = socket_create(AF_INET, SOCK_STREAM, 0);
socket_bind($sock, "123.321.123.321" , 20);
socket_listen ($sock , 10);
while (true) 
{

    //Do some other routine ever 60 seconds

    $client =  socket_accept($sock);  //Blocking function!
    $input = socket_read($client, 1024000);
    $response=processInput($input);
    socket_write($client, $response);
}

【问题讨论】:

  • @Revent 谢谢。它没有解决超时问题,但它确实解决了识别通信何时丢失的问题。也许只有两个独立的程序?一个 60 秒的循环(或 cron 或其他),第二个与我展示的类似?
  • 这是一篇关于该主题的帖子,但我不确定这对您的具体情况有多大用处:stackoverflow.com/questions/8310487/start-and-stop-a-timer-php。如果我站在你的立场上,我会考虑将侦听器作为守护进程或其他东西运行。
  • 再次感谢 Revent,是的,看起来不太合适。我知道这是题外话,但是您介意指出我正确的方向如何将侦听器作为守护程序运行吗?这似乎是要走的路,但我不知道从哪里开始。

标签: php sockets timeout


【解决方案1】:

使用stream_select() 函数。

例如:

$socket = stream_socket_server("tcp://0.0.0.0:8160", $errno,$errorMessage);
$master[] = $socket;
$read = $master;
$write_something = false;
$mod_fd = stream_select($read, $_w, $_e, $write_something ? 0 : 1, 5000);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    • 2012-01-31
    • 1970-01-01
    • 2014-08-15
    • 1970-01-01
    • 2011-03-06
    相关资源
    最近更新 更多