【问题标题】:Php sockets don't work properly (CentOS 7)Php 套接字无法正常工作(CentOS 7)
【发布时间】:2018-07-15 02:33:27
【问题描述】:
<?php
function go(){
    $starttime = round(microtime(true),2);
    echo "GO() ... <br />\r\n";

    echo "socket_create ...";
    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

    if($socket < 0){
        echo "Error: ".socket_strerror(socket_last_error())."<br />\r\n";
        exit();
    } else {
        echo "OK <br />\r\n";
    }


    echo "socket_bind ...";
    $bind = socket_bind($socket, '127.0.0.1', 889);//привязываем его к указанным ip и порту
    if($bind < 0){
        echo "Error: ".socket_strerror(socket_last_error())."<br />\r\n";
        exit();
    }else{
        echo "OK <br />\r\n";
    }

    socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);//разрешаем использовать один порт для нескольких соединений

    echo "Listening socket... ";
    $listen = socket_listen($socket, 5);//слушаем сокет

    if($listen < 0){
        echo "Error: ".socket_strerror(socket_last_error())."<br />\r\n";
        exit();
    }else{
        echo "OK <br />\r\n";
    }

    while(true){ //Бесконечный цикл ожидания подключений
        echo "Waiting... ";
        $accept = @socket_accept($socket); //Зависаем пока не получим ответа
        if($accept === false){
            echo "Error: ".socket_strerror(socket_last_error())."<br />\r\n";
            usleep(100);
        } else {
            echo "OK <br />\r\n";
            echo "Client \"".$accept."\" has connected<br />\r\n";
            file_put_contents("res.txt", "OK ");
        }

        $msg = "Hello, Client!";
        echo "Send to client \"".$msg."\"... ";
        socket_write($accept, $msg);
        echo "OK <br />\r\n";

        if( ( round(microtime(true),2) - $starttime) > 100) {
            echo "time = ".(round(microtime(true),2) - $starttime);
            echo "return <br />\r\n";
            return $socket;
        }


    }


}

error_reporting(E_ALL); //Выводим все ошибки и предупреждения
set_time_limit(0);      //Время выполнения скрипта не ограничено
ob_implicit_flush();    //Включаем вывод без буферизации

$socket = go();         //Функция с бесконечным циклом, возвращает $socket по запросу выполненному по прошествии 100 секнуд.

echo "go() ended<br />\r\n";

if (isset($socket)){
    echo "Closing connection... ";
    @socket_shutdown($socket);
    socket_close($socket);
    echo "OK <br />\r\n";
}
?>

当打开带有此代码的页面时,它会开始无限加载

889/tcp端口打开

Machine 具有来自 remi 存储库的 php 7.2 和这样的插件: php php-mysql php-gd php-ldap php-odbc php-pear php-xml php-xmlrpc php-mbstring php-snmp php-soap curl curl-devel php -mcrypt php-pecl-ap

出现这种问题的原因可能是什么?连接时没有任何反应。

【问题讨论】:

    标签: php sockets centos centos7


    【解决方案1】:

    问题是浏览器不能运行sockets(你实际上可以这样做,但是你不会看到什么程序返回),php sockets必须通过控制台运行(例如:php filename.php)。 socket_bind函数中要使用WAN ip(Global ip)。

    【讨论】:

      猜你喜欢
      • 2012-01-26
      • 2015-10-12
      • 1970-01-01
      • 1970-01-01
      • 2017-11-29
      • 2017-01-10
      • 2018-04-24
      • 2012-03-25
      • 1970-01-01
      相关资源
      最近更新 更多