【发布时间】:2014-04-28 18:36:39
【问题描述】:
我对 php 比较陌生,但我可以用其他语言(js、java、c/c++)编程。我有一个问题,我似乎无法解决,所以我希望有人可以在这里帮助我:)
我创建了一个 server_class.php 文件来管理多个客户端之间的连接。客户端通过网络连接到 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));
}
}
好的,一旦客户端和服务器之间的连接完成,这个函数就会被执行。如您所见,我创建了一个新进程,然后执行两个方法:launchAppOneProc 和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()。
关于如何执行这两个功能的任何想法?
谢谢 大卫
【问题讨论】:
-
您在
$this->launchAppOneProc(...)和$this->launchAppTwoProc(...)之间有一个exit语句。 -
感谢您的回复,但即使删除了包含两个函数调用的退出函数,问题仍然存在。
-
我不清楚你的各种程序是如何设置的,但是可能会发生一点混乱:分叉后,父进程和子进程都会有相似的数据(变量等),但更改其中一个数据不会更改另一个中的相应数据。