使用系统内存中的另一个PHP文件调用一个PHP实例方法


Call a PHP instance method with another PHP file in system memory

我有一个名为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,上面的例子就可以完成这项工作。