workerman 平滑重启有啥用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了workerman 平滑重启有啥用相关的知识,希望对你有一定的参考价值。

参考技术A workerman 能在thinkphp的框架上使用
$Gateway = new \Org\Util\Gateway('127.0.0.1:5136');
$Gateway->sendToUid(1021,json_encode(array()));
下载workerman, 放入thinkphp,注意与Home平级,就把workerman当做是一个模块。
进入Home/Controller目录,新建WorkermanController.class.php
workerman和thinkphp完美结合使用源码
直接上源码,这里我是以守护进程方式运行的,调试的话,可以去掉daemonize = true 这行.

<?php
namespace Admin\Controller;
use Workerman\Worker;
/**
* 用户信息查询
*/
class WorkermanController
/**
* 用户信息查询
*/
public function index()
if(!IS_CLI)
die("access illegal");

require_once APP_PATH.'Workerman/Autoloader.php';

// 每个进程最多执行1000个请求
define('MAX_REQUEST', 1000);

Worker::$daemonize = true;//以守护进程运行
Worker::$pidFile = '/data/wwwlogs/CMSWorker/workerman.pid';//方便监控WorkerMan进程状态
Worker::$stdoutFile = '/data/wwwlogs/CMSWorker/stdout.log';//输出日志, 如echo,var_dump等
Worker::$logFile = '/data/wwwlogs/CMSWorker/workerman.log';//workerman自身相关的日志,包括启动、停止等,不包含任何业务日志

$worker = new Worker('text://172.16.0.10:10024');
$worker->name = 'CMSWorker';
$worker->count = 2;
//$worker->transport = 'udp';// 使用udp协议,默认TCP

$worker->onWorkerStart = function($worker)
echo "Worker starting...\n";
;
$worker->onMessage = function($connection, $data)
static $request_count = 0;// 已经处理请求数
var_dump($data);
$connection->send("hello");

/*
* 退出当前进程,主进程会立刻重新启动一个全新进程补充上来,从而完成进程重启
*/
if(++$request_count >= MAX_REQUEST)// 如果请求数达到1000
Worker::stopAll();

;

$worker->onBufferFull = function($connection)
echo "bufferFull and do not send again\n";
;
$worker->onBufferDrain = function($connection)
echo "buffer drain and continue send\n";
;

$worker->onWorkerStop = function($worker)
echo "Worker stopping...\n";
;

$worker->onError = function($connection, $code, $msg)
echo "error $code $msg\n";
;

// 运行worker
Worker::runAll();



修改Workerman/Worker.php源码,找到parseCommand()方法,workerman版本3.3.2的话,在586行,修改命令行检测语法:

protected static function parseCommand()

global $argv;
// Check argv;
$start_file = $argv[0];
if (!isset($argv[2]))
exit("Usage: php yourfile.php Controller/Action start|stop|restart|reload|status|kill\n");


// Get command.
$command = trim($argv[2]);
$command2 = isset($argv[3]) ? $argv[3] : '';
.....


OK,此时大功告成。

Linux命令行下运行,注意,此处要切换到thinkphp根目录下面
/usr/local/php/bin/php index.php Workerman/index start

查看运行状态:
/usr/local/php/bin/php index.php Workerman/index status

此处命令行可以放入全局变量中,直接以php运行本回答被提问者采纳

DataContext 有啥用?

【中文标题】DataContext 有啥用?【英文标题】:What is DataContext for?DataContext 有什么用? 【发布时间】:2011-11-07 21:28:27 【问题描述】:

作为问题的延续Linking DataContext with another property in WPF。

在研究的最后,我很惊讶地发现当有人写出这样的东西时:

<Label Content="Binding Path=Name" />

Content 属性所绑定的DataContext 属于Label 控件本身!它仍然有效的事实是由于 DataContext 值从最近的父级默认继承。

但是,如果您将此标签包装在自定义控件中,并且您不想将数据绑定到该控件的 DataContext 属性,则您更可能希望拥有:

<Controls:SearchSettings Settings="Binding Path=Settings" />

你来了。现在您需要将Settings 设置为DataContext 用于SearchSettings 控件,以便在内部绑定Label,但您不能,因为这将触发Settings 属性的重新绑定。

我看不出使用不同来源混合绑定属性的意义:DataContextElementName 等。 那么我为什么要使用DataContext

【问题讨论】:

【参考方案1】:

来自CodeProject kishore Gaddam:

DataContext 是数据绑定中最基本的概念之一。 Binding 对象需要从某个地方获取其数据,有几种方法可以指定数据的来源,例如直接在 Binding 中使用 Source 属性,在树中向上遍历时从最近的元素继承 DataContext,设置Binding 对象中的ElementNameRelativeSource 属性。

CodeProject 上的详细示例:http://www.codeproject.com/Articles/321899/DataContext-in-WPF

【讨论】:

【参考方案2】:

当你写作时

<Label name="myLabel" Content="Binding Path=Name" />

您绑定到myLabel.DataContext.Name,而不是myLabel.Name

WPF 中的 XAML 只是一个漂亮的用户界面,用于显示实际数据并与之交互,也称为DataContext。其他绑定源(RelativeSourceElementName 等)的目的是指向当前控件的DataContext 中不存在的另一个属性


所以假设你有一个窗口。如果不设置 DataContext,窗口仍然显示,但后面没有数据。

现在假设设置myWindow.DataContext = new ClassA();。现在窗口显示的数据是ClassA。如果ClassA 有一个名为Name 的属性,我可以编写一个标签并将其绑定到Name(例如您的示例),然后将显示存储在ClassA.Name 中的任何值。

现在,假设ClassA 具有ClassB 的属性,并且两个类都有一个名为Name 的属性。这是一个 XAML 块,它说明了 DataContext 的用途,以及一个控件如何引用不在它自己的 DataContext 中的属性的示例

<Window x:Name="myWindow"> <!-- DataContext is set to ClassA -->
    <StackPanel> <!-- DataContext is set to ClassA -->

        <!-- DataContext is set to ClassA, so will display ClassA.Name -->
        <Label Content="Binding Name" />

         <!-- DataContext is still ClassA, however we are setting it to ClassA.ClassB -->
        <StackPanel DataContext="Binding ClassB">

            <!-- DataContext is set to ClassB, so will display ClassB.Name -->
            <Label Content="Binding Name" />

            <!-- DataContext is still ClassB, but we are binding to the Window's DataContext.Name which is ClassA.Name -->
            <Label Content="Binding ElementName=myWindow, Path=DataContext.Name" /> 
        </StackPanel>
    </StackPanel>
</Window>

如您所见,DataContext 基于 UI 对象背后的任何数据。

更新:我经常从新 WPF 用户那里看到这个问题,因此我将这个答案扩展到我的博客上的一篇文章中:What is this “DataContext” you speak of?

【讨论】:

嗨!感谢您的详细回答。但。在您的示例中,我不喜欢您绑定 DataContext 属性本身。很可能我会将您示例中的 StackPanel 提取到单独的控件中。如果它的 DataContext 只是其父级 DataContext 的一个孤立部分,那是有道理的,不是吗?然后我不会绑定我的用户控件的 DataContext 属性,而是希望有一个具有自描述名称的特殊属性。 (我的意思是特定控件的 DataContext 是什么?我应该传入什么?)这就是事情变得复杂的地方。 [待续] 因为我不会绑定 DataContext 属性,所以它将从父控件中获取。这意味着我不再能够将自定义控件中的控件与 DataContext 绑定,只是因为我不知道里面有什么(控件无法控制它将是谁的孩子,以及它将接收什么 DataContext)。解决方案可能是从内部设置 DataContext 以进行控制(使用该特殊属性中的值)。 [待续] 但这会破坏控件本身的绑定,因为正如您所指出的那样,编写Content=Binding Name 后绑定到Label.DataContext.Name 而不是Label.Parent.DataContext.Name,正如我所期望的那样。 @Eugene 如果合乎逻辑,您想创建一个新的 UserControl(或 DataTemplate)。很多时候情况并非如此,绑定某物的 DataContext 比多次绑定到同一个属性更容易。 @Eugene 我强烈建议您研究 MVVM 设计模式。在我看来,它应该与任何 WPF 应用程序一起使用,您将更好地了解 DataContext 及其重要性。您的可视控件不是您的应用程序 - 您的 DataContext (ViewModels) 是。可视化控件(标签、按钮、文本框等)只是一个不错的 UI,允许用户与您的应用程序交互。【参考方案3】:

在大多数情况下,您确实想要绑定到 DataContext,例如,在 ItemsControls 上的某些模板中,这是绑定到当前模板项的唯一方法。对 DataContext 的进一步绑定非常简洁,易于读写。

在你的例子中你仍然可以设置DataContext,你只需要分别修改设置上的绑定:

<Controls:SearchSettings DataContext="Binding Settings" Settings="Binding"/>

【讨论】:

我想到了这种方法,但是没有意义。如果我只需要一个属性,为什么还要绑定两个属性? @EugeneStrizhok:您不仅需要一个,这允许您在不设置源的情况下绑定到子控件中的设置,因为您现在可以使用 DataContext。【参考方案4】:

在这种特殊情况下,您可以这样做:

<Controls:SearchSettings DataContext="Binding Path=Settings" Settings="Binding" />

假设您希望 SearchSettings 的所有内容都使用 Settings 作为其数据上下文。基本上,DataContext 会影响元素本身以及未显式覆盖它的任何后代。

【讨论】:

以上是关于workerman 平滑重启有啥用的主要内容,如果未能解决你的问题,请参考以下文章

workman 平滑重启

MATLAB imopen 开运算 是啥意思 有啥用,求大神解答啊

jenkins jira 集成有啥用

PID是啥?有啥用?进程上的PID都是固定的吗?

dowhile(0) 有啥用? [复制]

DataContext 有啥用?