如何重新包含php脚本或在没有分叉的情况下运行几次/或加快分叉
当WebSocket服务器获取消息时,它应该按照获取的路径运行脚本 现在我使用这个方案: 在WebsocketDaemon中:如何重新包含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
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一次了,基本上它只是确保文件不会再次包含在脚本中,以防止重复错误。那么问题就不是你最初说的那样了,你需要用新的信息更新你的问题,并提供你认为正在破坏的代码。