当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工作得更快。我想这是因为&#34; shell_exec&#34;。如果不使用&#34; shell_exec&#34;并按&#34; include&#34;运行脚本 - 它像子弹一样快速,但在第二次&#34; onMessage&#34;它会写&#34;不能重新声明课程&#34;。而且我不知道如何以另一种方式运行脚本。使用&#34; require_once&#34;麻烦也是。 你有什么建议吗?
更新
所以,我知道我不能在websocket线程中运行其他脚本。问题是我的脚本使用全局变量,如$ _SESSION,$ _COOKIE等。我无法将其替换为局部变量。这意味着我无法在没有叉子的情况下与用户合作...... :-( 是&#34; shell_exec&#34;最快(或最正确)的方式?
再次更新:
我发现问题出在那一行&#34; shell_exec(&#39; php &#34;。它运行php.exe进程大约2秒。我怎么能加速吗?
我解决了这个问题!
问题出在browcap.ini文件中。因为它php.exe加载太慢。 不再需要包括在内。 &#34; EXEC()&#34;工作得足够快。
答案 0 :(得分:0)
将类移动到它自己的类文件中,在需要访问它的地方使用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.
基本上包括/要求类文件而不是相反。