当WebSocket服务器获取消息时,它应该按照获取的路径运行脚本。
现在我使用这个方案:
在WebsocketDaemon:中
protected function onMessage($connectionId, $data, $type) {
if (!strlen($data) || !$this->checkFlood($connectionId))
return;
$dataArg = base64_encode($this->getRepackData($connectionId, $data));
$response = shell_exec('php cli/runthroughwebsocket.php '.$dataArg);
$this->sendPacketToClient($connectionId, $response);
}
runthroughwebsocket.php:
<?php
if (php_sapi_name() !== 'cli')
return;
chdir(dirname($_SERVER['SCRIPT_FILENAME']).'/..');
function setData($packet) {
$GLOBALS['ws'] = true;
$_SERVER['PATH_INFO'] = $packet->url;
$_SERVER['HTTP_USER_AGENT'] = $packet->agent;
$_SERVER['REMOTE_ADDR'] = $packet->ip;
foreach ($packet->cookie as $key => $cookie)
$_COOKIE[$key] = $cookie;
}
if (empty($argv[1]))
return;
$packet = json_decode(base64_decode($argv[1]));
setData($packet);
require_once 'index.php';
它像通过浏览器一样运行,但带有我需要的参数。所以,它是有效的。但是慢。这需要几秒钟的时间。甚至AJAX工作得更快。我想是因为"shell_exec"。如果不使用"shell_exec"并通过"include"运行脚本,它的速度就像子弹头一样快,但在第二个"onMessage"之后,它将写入"Cannot redclare class"。我不知道如何用另一种方式运行脚本。还有"require_one"的麻烦。你有什么建议吗?
更新:
所以,我知道我不能在websocket线程中运行其他脚本。问题是,我的脚本使用全局变量,如$_SESSION、$_COOKIE等。我无法将其替换为局部变量。这意味着如果没有fork,我就无法与用户合作…:-("shell_exec"是最快(或正确)的方法吗?
再次更新:
我发现问题出在"shell_exec('php"这一行。它运行php.exe进程大约2秒。我该如何加快速度?
我解决了问题
问题出现在browcap.ini文件中。因此php.exe加载太慢。不再需要重新包含。"exec()"的工作速度足够快。
将类移动到它自己的类文件中,如果需要访问它,请使用require_once调用它,然后实例化一个实例。
之后,您可以通过需要的内容进行迭代,因为您有要处理的对象,并且您只是重用对象,而不是重新定义整个类。
更新:
classfile.php
class classname {
// class methods here.
}
index.php
require_once 'classfile.php';
$classobject = new classname;
// You want to do your actions/loops etc here.
基本上包括/需要类文件,而不是相反。