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


How to re include php script or run few times without forking / or speed up forking

当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.

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