如何重新包含PHP脚本或运行几次而不分叉/或加速分叉

时间:2015-04-05 11:59:06

标签: php websocket

当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;工作得足够快。

1 个答案:

答案 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.

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