是否可以将一个PHP脚本上接受的套接字用于另一个脚本


Is it possible to use a socket accepted on one PHP script on another?

我想实现一些看似荒谬的事情。

我已经创建了一个创建服务器套接字的PHP脚本。我能够从java客户端连接到服务器套接字。

现在我想要的是在服务器端的某个地方维护这个套接字,以便以后需要时可以访问它。

但是,这里的问题是,一旦responsd()函数终止,套接字就会关闭,Run类中的br.readLine()方法就会收到空行。

出于我的目的,readLine()方法应该继续等待响应。

到目前为止我所做的。。。

regsock.php(在应该注册套接字的地方)

  <?php
    set_time_limit(0);
    $fh = fopen("reg.txt", "w");
    fwrite($fh, "SERVER Starting'r'n");
    $sersock = socket_create_listen(1234);
    fwrite($fh, "SERVER Running'r'n");
    while(true){
        respond();
    }
    function respond(){
        global $sersock, $fh;
        $sock = socket_accept($sersock);
        fwrite($fh, "Client Connected'r'n");
        echo "Client: ".socket_read($sock, 1024);
        socket_write($sock, "OK'n'r");
        //Some way to store client sockets?
    }
    socket_close($sersock);
    fclose($fh);
?>

Run.java

Socket socket = new Socket("localhost", 1234);
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
                    socket.getOutputStream()));
BufferedReader br = new BufferedReader(new InputStreamReader(
                    socket.getInputStream()));
bw.write("Server OK?");
bw.flush();
System.out.println("Server:"+br.readLine()); //Output-> Server:OK
System.out.println("Server:"+br.readLine()); //Output-> Server:
bw.close();
br.close();
socket.close();

而且,remote.php(我想访问resgsock.php上接受的套接字的位置)

<?php
    $sock = //Retrieve socket resource here
    fwrite($sock, "REMOTE PAGE'r'n");
    echo "Socket write complete";
?>

这可能吗?或者我只是做错了一切。

这可以通过其他方法来实现吗。

regsock.php中接受的套接字只能在remote.php与regsock在同一进程或子进程中执行时传递给remote.php。

例如,你可以这样做:

# In global setup: handle child process termination automatically
# Might break calls to "system" though
pcntl_signal(SIGCHLD, SIG_IGN);
function respond(){
    global $sersock, $fh;
    $sock = socket_accept($sersock);
    fwrite($fh, "Client Connected'r'n");
    echo "Client: ".socket_read($sock, 1024);
    socket_write($sock, "OK'n'r");
    $pid = pcntl_fork();
    if ($pid == 0) {
        # This is now a subprocess. If I "include" remote.php
        # it can operate on $sock as if it was its own.
        include "remote.php";
        # Now exit the subprocess
        exit;
    } elsif ($pid < 0) {
        # fork failed, handle error
    } else {
        echo "Subprocess running with pid $pid!";
        # Close the copy of the socket in parent process,
        # subprocess has a copy of its own.
        socket_close($sock);
    }
}