php分叉子进程以执行infinte循环

php分叉子进程以执行infinte循环,php,process,fork,Php,Process,Fork,我对php比较陌生,但我可以用其他语言js、java、c/c++编程。我有一个问题,我似乎无法解决,所以我希望有人能在这里帮助我: 我创建了一个server_class.php文件,用于管理多个客户端之间的连接。客户端通过web连接到php服务器。当我启动server_class.php时,它会执行两个应用程序,它们处于无限循环中,并将数据打印到终端。当客户端连接到php服务器时,我希望服务器开始向每个客户端发送每个应用程序的输出,以便客户端可以看到每个应用程序的当前输出。我已经部分实现了这一点

我对php比较陌生,但我可以用其他语言js、java、c/c++编程。我有一个问题,我似乎无法解决,所以我希望有人能在这里帮助我:

我创建了一个server_class.php文件,用于管理多个客户端之间的连接。客户端通过web连接到php服务器。当我启动server_class.php时,它会执行两个应用程序,它们处于无限循环中,并将数据打印到终端。当客户端连接到php服务器时,我希望服务器开始向每个客户端发送每个应用程序的输出,以便客户端可以看到每个应用程序的当前输出。我已经部分实现了这一点。但是,它只发送一个应用程序的输出,而不发送另一个应用程序的输出

在执行服务器和客户端之间的连接时,将执行以下功能:

private function startProc($client) {
    $this->output("Start a client process");
    $pid = pcntl_fork();
    if($pid == -1) {
        $this->output("fork terminated!");
    }
    elseif($pid) { // process
        $client->setPid($pid);
    }
    else {
        $this->output("Starting app1 data pipe...");
        exit($this->launchAppOneProc($client));

        $this->output("Starting app2 data pipe...");
        exit($this->launchAppTwoProc($client));
    }
}
好的,一旦客户端和服务器之间的连接完成,就会执行此函数。如您所见,我创建了一个新流程,然后执行两个方法:LaunchAppOnProc和launchAppTwoProc。这两个函数包含以下代码:

private function launchAppOneProc($client) {
    while (@ ob_end_flush()); // end all output buffers if any

    while (!feof($this->appone_proc))
    {   
        $appone_text = fread($this->appone_proc, 4096);
        $this->send($client, $appone_text);
        flush();
    }

    $this->output("AppOne has stopped running!");
}
上述函数与launchAppTwoProc相同。函数$this->output将指定的文本打印到server_class.php的终端

所以问题是它只执行launchAppOneProc函数,而不执行下一个函数launchAppTwoProc

关于如何执行这两个功能有什么想法吗

多谢各位
大卫

好的,我找到了解决问题的办法。为了消除一些混淆,我有两个应用程序在后台运行并写入缓冲区。当客户端连接到服务器时,它们连接到两个缓冲区并开始接收数据。所以我所做的就是为每个频道创建一个新的流程。当客户端连接到服务器时,将创建两个进程并将其分配给客户端。每个进程都连接到一个缓冲区,并开始向客户端发送数据

private function startProc($client) {
    $this->output("Start a client process");

    for ($i = 0; $i < 2; ++$i) {
        // Create new process.
        $pid = pcntl_fork();

        switch ($pid) {
            case -1: // Failed to create new process.
                $this->output("Failed to create new process!");
                break;

            case 0: // Child process created, execute code...
                switch ($i) {
                    case 0:
                        $this->output("Connect to AppOne data pipe...");
                        $this->launchAppOneProc($client);
                        break;

                    case 1:
                        $this->output("Connect to AppTwo data pipe...");
                        $this->launchAppTwoProc($client);
                        break;
                }

            default: // Back to parent.
                switch ($i) {
                    case 0:
                        $client->setAppOnePid($pid);
                        break;
                    case 1:
                        $client->setAppTwoPid($pid);
                        break;
                }
        }
    }
}

我希望这是有意义的,可以帮助任何遇到同样问题的人。

您在$this->launchAppOneProc。。。和$this->launchAppTwoProc…感谢您的响应,但即使在删除围绕这两个函数调用的退出函数后,问题仍然存在。我不清楚您的各种程序是如何设置的,但可能会出现一点混淆:分叉之后,父进程和子进程都将具有类似的数据变量等,但更改其中一个进程中的数据不会更改另一个进程中的相应数据。
posix_kill($client->getAppOnePid(), SIGTERM);
posix_kill($client->getAppTwoPid(), SIGTERM);