Ankündigung

Einklappen
Keine Ankündigung bisher.

Sockets blockieren unter Windows 10 PHP 7.2

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Sockets blockieren unter Windows 10 PHP 7.2

    Hi,
    bei einen Test für eine Socket-Klasse hab ich ein merkwürdiges Verhalten unter Windows 10. Hab es mal hier reingestellt da ich das Problem nicht einordnen kann.
    Wie unten in der Zeile Line 50 zu sehen ist blockiert da Irgendwas so dass für ein Connect fast genau 1 Sekunde benötigt wird.


    phpcheck.class.socksrv.php Total: 19 Tests, 0 Errors
    PHPCheck V1.3.20, OS: WINNT, PHP-Version: 7.2.3 (32 Bit), Time: 5.25 s, Memory: 2.0M (128M)
    exist versions info 22 $info = $t->getClassVersion("SockSrv");
    $t->check($info, !empty($info));
    [0.6 ms]
    '1.2'
    Ok
    create a socketserver 27 $port = 8000;
    $ip = 'localhost';
    try {
    $options = array(
    'clientConnection' => 'checkClientConnection', //Client-Class
    'serverIP' => $ip,
    'port' => $port,
    'keepAlive' => 1,
    'maxLenData' => 16,
    );
    $srv = new SockSrv($options);
    $result = "Ok";

    } catch (Exception $e) {
    $result = $e->getMessage();
    }
    $t->check($result, $result == "Ok" AND $srv instanceof SockSrv);
    [7.6 ms]
    'Ok'
    Ok
    first check with timeout 10ms 46 $socketInfo = $srv->check(0.01);
    $t->checkEqual($socketInfo, array());
    [10.7 ms]
    array ( )
    Ok
    check after connect server 50 $sockOpenTimeout =2;
    $sock = new sock();
    $sock->open($ip,$port,$sockOpenTimeout);
    $clients = $srv->check(0.1);
    $t->check($clients, count($clients) == 1);
    [1004.8 ms]
    array ( 0 => checkClientConnection::__set_state(array( 'maxBufLen' => 51200, 'so ..
    Ok
    Der selbe Test läuft unter Linux und auch unter Win XP ohne Verzögerungen.

    phpcheck.class.socksrv.php Total: 19 Tests, 0 Errors
    PHPCheck V1.3.20, OS: SunOS, PHP-Version: 7.1.20 (32 Bit), Time: 2.21 s, Memory: 2.0M (256M)
    check after connect server 48 $sock = new sock();
    $sock->open('localhost',$port);
    $clients = $srv->check(0.1);
    $t->check($clients, count($clients) == 1);
    [1.4 ms]
    array ( 0 => checkClientConnection::__set_state(array( 'maxBufLen' => 51200, 'so ..
    Ok
    Bin aktuell etwas ratlos wo ich da suchen soll. Windows-Macke oder PHP 7.2 ? Alles was so stören könnte (Firewall, Virenscanner..) hab ich probehalber mal ausgeschaltet ohne Änderungen.
    Das Zielsystem ist Linux. Mich ärgert es dennoch, das es unter Windows 10 nicht richtig läuft. Irgend welche Ideen in welcher Richtung ich suchen muß?

    LG jspit
    ​​​​​​​

  • #2
    Connectest du direkt auf eine IP oder findet da noch eine Namensauflösung statt?

    Kommentar


    • #3
      Danke rkr !!
      Hab für $ip = 'localhost'; mal $ip = '192.168.188.20'; eingesetzt und => [0.7 ms]. Was da mit 'localhost' schief läuft ist mir aber nicht ganz klar.

      Kommentar


      • #4
        Könnte mit IPv6 zusammenhängen, da Win10 localhost standardmäßig als ::1 auflöst und vermutlich nach 1s Fallback auf IPv4 macht.
        Du könntest einstellen dass IPv4 bevorzugt wird https://support.microsoft.com/en-us/...advanced-users
        sorry, shift-taste kaputt

        Kommentar


        • #5
          PHP liefert mir für
          PHP-Code:
          var_dump(gethostbyname('localhost'));
          //string(9) "127.0.0.1" 
          Wenn ich im Script
          PHP-Code:
          $ip 'localhost';
          $serverIp 'localhost'
          setze habe ich die Sekunde als Verzögerung.

          Nicht jedoch bei
          PHP-Code:
          $ip gethostbyname('localhost');
          $serverIp 'localhost'
          Der Server benutzt direkt die sockets, die Testabfragen vom Client werden jedoch mit fsockopen connected. An der Registry möchte ich nicht rumspielen.
          Hab ja nun eine Variante die auch unter Win10 läuft.

          Kommentar


          • #6
            Habe noch ein paar Sachen probiert:
            • Ein ping auf localhost zeigt mir für mein Win10-System die IP als IPV6 "::1" an
            • Der Socketserver reagiert so wie er eingestellt ist nur auf IPV4
            • gethostbyname liefert immer die IPV4-Adresse
            Damit wird die von Meister1900 #4 aufgestellte Vermutung zur einzig brauchbaren Erklärung. Mit der
            PHP-Code:
            $clientIp gethostbyname('localhost');  //IPV4 
            funktionieren die Tests jetzt auf allen Systemen ohne Verzögerungen.

            Kommentar

            Lädt...
            X