如何重新包含php脚本或在没有分叉的情况下运行几次/或加快分叉

如何重新包含php脚本或在没有分叉的情况下运行几次/或加快分叉,php,websocket,Php,Websocket,当WebSocket服务器获取消息时,它应该按照获取的路径运行脚本 现在我使用这个方案: 在WebsocketDaemon中: protected function onMessage($connectionId, $data, $type) { if (!strlen($data) || !$this->checkFlood($connectionId)) return; $dataArg = base64_encode($this->getRep

当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之后,它将编写无法重新声明类的脚本。我不知道如何以另一种方式运行脚本。我也曾有过麻烦。 你有什么建议吗

更新:

所以,我知道我不能在websocket线程中运行其他脚本。问题是我的脚本使用全局变量,如$\u SESSION、$\u COOKIE等,我无法将其替换为局部变量。这意味着如果没有fork,我无法与用户一起工作…:- shell_exec是最快的还是正确的方法

再次更新:

我发现问题出在shell_exec'php的那一行。它运行php.exe进程大约2秒。我怎样才能加速呢

我解决了这个问题

问题出在browcap.ini文件中。因此,php.exe的加载速度太慢。
不再需要重新包含。exec的工作速度足够快。

将类移动到它自己的类文件中,在需要访问它的地方使用require\u调用它一次,然后实例化一个实例

在这之后,您可以通过需要的内容进行迭代,因为您有您的对象要处理,并且您只是重用对象,而不是重新定义整个类

更新:

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.

基本上包括/需要类文件,而不是相反。

我包括/需要的每个文件都是只包含类的cli shell文件,没有类。当我确实需要_时,它不会写错误,但会有麻烦。当我关闭数据库时,脚本会给出相应的消息。但是当我打开我的数据库脚本时,仍然回答说数据库仍然关闭…我不完全理解requre_一旦工作,但当脚本再次执行new$class时,它不会响应实际状态。好的,你已经让它使用require一次了,基本上它只是确保文件不会再次包含在脚本中,以防止重复错误。那么问题就不是你最初说的那样了,你需要用新的信息更新你的问题,并提供你认为正在破坏的代码。