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

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

我有一个名为 server.php 的 PHP 套接字服务器脚本,它绑定到某个端口并保持 运行 很长时间。 (实际上它以 cli(终端)模式启动,直到按下 ctrl+c 命令才会停止。) 还有一个管理聊天请求的名为 service.php 的 Soap-server PHP 文件。 (例如开一个新房间,接受或踢客户等等。) 两个脚本都访问一个公共数据库,因此它们可以共享信息。

但有时SoapServer需要异步调用SocketServer的一些方法(在系统内存中运行)获取相关数据。

我正在寻找一种简单而确定的方法来处理这个问题。感谢任何提示。

根据少量信息,我认为您最好的选择是确保 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 / 网络请求的 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,上面的例子就可以完成。