Kirjoittaja Aihe: [ ratkaistu ] Portti aina päällä, miten se vapautetaan  (Luettu 2144 kertaa)

teele

  • Käyttäjä
  • Viestejä: 850
    • Profiili
Php-palvelinkokeilussa on pieni ongelma. Palvelimelle laitettu portti on aina päällä ja sivu ei toimine sen takia.

Php-ohlelma on tällainen

Koodia: [Valitse]
<?php

ini_set
('error_reporting'E_ALL E_NOTICE);
ini_set('display_errors'1);

// Set time limit to indefinite execution
set_time_limit(70);

// Set the ip and port we will listen on
$address '127.0.0.1';
$port 6901;

ob_implicit_flush();

// Create a TCP Stream socket
$sock socket_create(AF_INETSOCK_STREAM0);

// Bind the socket to an address/port
socket_bind($sock$address$port) or die('Could not bind to address');

// Start listening for connections
socket_listen($sock);

// Non block socket type
socket_set_nonblock($sock);

// Clients
$clients = [];

// Loop continuously
while (true) {
    
// Accept new connections
    
if ($newsock socket_accept($sock)) {
        if (
is_resource($newsock)) {
            
// Write something back to the user
            
socket_write($newsock">" $seconds ' '1).chr(0);
            
// Non bloco for the new connection
            
socket_set_nonblock($newsock);
            
// Do something on the server side
            
echo "New client connected\n";
            
// Append the new connection to the clients array
            
$clients[] = $newsock;
        }
    }

    
// Polling for new messages
    
if (count($clients)) {
        foreach (
$clients AS $k => $v) {
            
// Check for new messages
            
$string '';
            if (
$char socket_read($v1024)) {
                
$string .= $char;
            }
            
// New string for a connection
            
if ($string) {
                echo 
"$k:$string\n";
            } else {
                if (
$seconds 60) {
                    
// Ping every 5 seconds for live connections
                    
if (false === socket_write($v'PING')) {
                        
// Close non-responsive connection
                        
socket_close($clients[$k]);
                        
// Remove from active connections array
                        
unset($clients[$k]);
                    }
                    
// Reset counter
                    
$seconds 0;
                }
            }
        }
    }

    
sleep(1);

    
$seconds++;
}

// Close the master sockets
socket_close($sock);
<?
php

ja selaimessa näkyvä sivu eli virheilmoitus on tällainen

Koodia: [Valitse]
Warning: socket_bind(): unable to bind address [98]: Address already in use in /home/mappi/nettisivu/koepalvelin_01.php on line 22
Could not bind to address

Pääteselvittely antaa tällaista

Koodia: [Valitse]
$ sudo netstat -tulpn | grep :6901
tcp        0      0 127.0.0.1:6901          0.0.0.0:*               LISTEN      1118/apache2

Olisiko portti siis varattu apachelle, ja porttinumero pitäisi vain vaihtaa. Miten koepalvelimen saa pois päiviltä eli php-ohjelman sammutettua täysin varmasti, ei ole ihan varmaa, toimiiko php:n set_time_limit(70).

MUok.

Näin ainakin portti näyttää vapautuvan

Koodia: [Valitse]
sudo systemctl restart apache2

« Viimeksi muokattu: 20.02.21 - klo:11.08 kirjoittanut teele »

nm

  • Käyttäjä
  • Viestejä: 16425
    • Profiili
Vs: Portti aina päällä, miten se vapautetaan
« Vastaus #1 : 20.02.21 - klo:00.39 »
Käynnistätkö PHP-ohjelmasi nyt Apachen kautta? Se ei ole järkevää, koska kyseessä on pidempiaikaisesti suoritettava palvelinprosessi, eikä tavallinen web-sivun sisältöä tuottava tai POST-kyselyihin vastaava php-skripti.

Käynnistä ohjelma siis ilman Apachea vaikka komentorivillä php-tulkilla.

teele

  • Käyttäjä
  • Viestejä: 850
    • Profiili
Vs: Portti aina päällä, miten se vapautetaan
« Vastaus #2 : 20.02.21 - klo:11.06 »

eli
php koepalvelin.php   käynnistykseen

ja 

ctrl-c  lopetukseen, jos ei muuten pääty.

Kiitos neuvosta  :)