我有一个名为server.php
的PHP套接字服务器脚本,它绑定到某个端口并保持长时间运行。(实际上它是在cli(终端)模式下启动的,直到按下ctrl+c命令才会停止。)还有一个名为service.php
的Soap服务器PHP文件,用于管理聊天请求。(例如,打开一个新房间,接受或踢开客户等等。)这两个脚本都访问一个公共数据库,因此它们可以共享信息。
但有时SoapServer需要异步调用SocketServer的一些方法(它在系统内存中运行)并获取相关数据。
我正在寻找一种简单而确定的方法来处理这个问题。thanx的小费。
根据这些信息,我认为你最好确保server.php只做一件事:打开一个套接字(例如,在8001端口上)并服务。它根本不应该包含任何方法。
你把你的方法放在另一个脚本中,让我们称之为handler.php。在server.php中,你包括它:require_once("handler.php");
没有什么可以阻止您在另一个端口(例如8002)上打开另一个套接字,该套接字不处理持久连接,而是响应常规的web请求。例如,将其称为server2.php。此server2.php还包含:require_once("handler.php");
然后SoapServer可以使用curl向端口8002发出异步请求,并可以访问server.php用于持久连接的相同方法。
一个监听常规ajax/web请求的websocket可能看起来像下面的代码。在我的例子中,handler.php有一个方法handle()
,它处理基于$query
的$rawInput
。$query
可以和您想要调用的方法的名称一样简单。
ob_end_clean();
header("Connection: close");
ob_start();
$size = ob_get_length();
header("Content-Length: $size");
ob_end_flush();
flush();
set_time_limit(0);
require_once("handler.php");
$sock = socket_create(AF_INET, SOCK_STREAM, 0);
socket_bind($sock, "127.0.0.1" , 8002);
socket_listen($sock, 1024);
while (true) {
$client = socket_accept($sock);
$rawInput = socket_read($client, 204800);
$input = explode("'r'n", $rawInput);
$input = explode(" ", $input[0]);
$query = isset($input[1]) ? $input[1] : '/';
$result = handle($query, $rawInput);
$headers = "HTTP/1.0 200 OK'r'n";
$headers .= "Connection: keep-alive'r'n";
$headers .= "Content-Type: application/json'r'n";
$headers .= "Content-Length: " . sprintf('%u', strlen($result)) . "'r'n";
$headers .= "Keep-Alive: timeout=5, max=100'r'n";
$output = $headers . "'r'n" . $result;
socket_write($client, $output, strlen($output));
socket_shutdown($client, 1);
socket_close($client);
}
socket_shutdown($sock);
socket_close($sock);
这个例子取自我写的一些代码,我正在积极使用,删除了特定于我的应用程序的代码行。我希望它对你也有用。。
因为提供的信息很少——我不知道为什么不能让Apache也访问handler.php。但如果它需要一个websocket,上面的例子就可以完成这项工作。