使用系统内存中的另一个 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,上面的例子就可以完成。
我有一个名为 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,上面的例子就可以完成。