精华内容
下载资源
问答
  • 每次对主机发送命令的动作时,我从库里把数据取出来,我去判断几种就可以,每模块执行之前都要这样的判断, 直接把用户分配给了不同的模块,这就变成我了我每模块都要写一边(重复劳动) 写一公共的类,就是...

    一、编写插件基类

    1、目录结构

    1、我是如何获知我有多少种系统?

    1. 当客户端第一连接过来的时候,我就已经把这些文件存下来了 ,存在到哪里了?存到数据库了
    2. 每次对主机发送命令的动作时,我从库里把数据取出来,我去判断有几种就可以,每个模块执行之前都要这样的判断,
    3. 直接把用户分配给了不同的模块,这就变成我了我每个模块都要写一边(重复劳动)
    4. 写一个公共的类,就是提取这些,你一定要有一个公共的类,他的作用是为了规范其他的模块

    2、运行结果截图

    cmd和state只要一执行就会自动去提取主机

    二、获取主机列表

    1、目录结构

    2、代码解析

    1、注册admin组件

    from django.contrib import admin
    
    # Register your models here.
    from Arya import models
    admin.site.register(models.Host)
    admin.site.register(models.HostGroup)
    

    2、创建超级用户进入后台创建测试数据

    python manage.py createsuperuser

    3、默认操作系统类型

    from django.db import models
    
    # Create your models here.
    
    class Host(models.Model):
        hostname = models.CharField(max_length=128,unique=True)
        key = models.TextField()
        status_choices = ((0,'Waiting Approval'),
                          (1,'Accepted'),
                          (2,'Rejected'))
    
    
        os_type_choices =(
            ('redhat','Redhat\CentOS'),
            ('ubuntu','Ubuntu'),
            ('suse','Suse'),
            ('windows','Windows'),
        )

    4、判断输入的命令有没有超过边界

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    # Author:luoahong
    
    
    class BaseSaltModule(object):
        def __init__(self,sys_argvs,db_models,settings):
            self.db_models = db_models
            self.settings = settings
            self.sys_argvs = sys_argvs
    
        def get_selected_os_types(self):
            data = {}
            for host in self.host_list:
                data[host.os_type] = []
            print('--->data',data)
            return data
        def process(self):
            self.fetch_hosts()
            self.config_data_dic = self.get_selected_os_types()
        def require(self,*args,**kwargs):
            pass
        def fetch_hosts(self):
            print('--fetching hosts---')
    
            if '-h' in self.sys_argvs or '-g' in self.sys_argvs:
                host_list = []
                if '-h' in self.sys_argvs:
                    host_str_index = self.sys_argvs.index('-h') +1
                    if len(self.sys_argvs) <= host_str_index:
                        exit("host argument must be provided after -h")
                    else: #get the host str
                        host_str = self.sys_argvs[host_str_index]
                        host_str_list = host_str.split(',')
                        host_list += self.db_models.Host.objects.filter(hostname__in=host_str_list)
                if '-g' in self.sys_argvs:
                    group_str_index = self.sys_argvs.index('-g') +1
                    if len(self.sys_argvs) <= group_str_index:
                        exit("group argument must be provided after -g")
                    else: #get the group str
                        group_str = self.sys_argvs[group_str_index]
                        group_str_list = group_str.split(',')
                        group_list = self.db_models.HostGroup.objects.filter(name__in=group_str_list)
                        for group in group_list:
                            host_list += group.hosts.select_related()
                self.host_list = set(host_list)
                return True
                print('----host list:', host_list)
            else:
                exit("host [-h] or group[-g] argument must be provided")
    
    
        def syntax_parser(self,section_name,mod_name,mod_data):
            print("-going to parser state data:",section_name,mod_name)
            for state_item in mod_data:
                print("\t",state_item)
                for key,val in state_item.items():
                    if hasattr(self,key):
                        state_func = getattr(self,key)
                        state_func(val)
                    else:
                        exit("Error:module [%s] has no argument [%s]" %( mod_name,key ))

    三、提取yaml配置文件

    1、提取配置文件模板

    apache:
      pkg.installed: []
       service.running:
         - reload: True
         - watch:
           - file: /etc/httpd/conf/httpd.conf
      user.present:
        - uid: 87
        #- username: alex
        - gid: 87
        - home: /var/www/html
        - shell: /bin/nologin
        - require:
          - group: apache
      group.present:
        - gid: 87
        - require:
          - pkg: apache
    
     /etc/httpd/conf/httpd.conf:
       file.managed:
         - source: salt://apache/httpd.conf
         - user: root
         - group: root
         - mode: 644

    2、目录结构

    4、提取配置文件python文件

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    # Author:luoahong
    
    
    class BaseSaltModule(object):
        def __init__(self,sys_argvs,db_models,settings):
            self.db_models = db_models
            self.settings = settings
            self.sys_argvs = sys_argvs
    
        def get_selected_os_types(self):
            data = {}
            for host in self.host_list:
                data[host.os_type] = []
            print('--->data',data)
            return data
        def process(self):
            self.fetch_hosts()
            self.config_data_dic = self.get_selected_os_types()
        def require(self,*args,**kwargs):
            pass
        def fetch_hosts(self):
            print('--fetching hosts---')
    
            if '-h' in self.sys_argvs or '-g' in self.sys_argvs:
                host_list = []
                if '-h' in self.sys_argvs:
                    host_str_index = self.sys_argvs.index('-h') +1
                    if len(self.sys_argvs) <= host_str_index:
                        exit("host argument must be provided after -h")
                    else: #get the host str
                        host_str = self.sys_argvs[host_str_index]
                        host_str_list = host_str.split(',')
                        host_list += self.db_models.Host.objects.filter(hostname__in=host_str_list)
                if '-g' in self.sys_argvs:
                    group_str_index = self.sys_argvs.index('-g') +1
                    if len(self.sys_argvs) <= group_str_index:
                        exit("group argument must be provided after -g")
                    else: #get the group str
                        group_str = self.sys_argvs[group_str_index]
                        group_str_list = group_str.split(',')
                        group_list = self.db_models.HostGroup.objects.filter(name__in=group_str_list)
                        for group in group_list:
                            host_list += group.hosts.select_related()
                self.host_list = set(host_list)
                return True
                print('----host list:', host_list)
            else:
                exit("host [-h] or group[-g] argument must be provided")
    
    
        def syntax_parser(self,section_name,mod_name,mod_data):
            print("-going to parser state data:",section_name,mod_name)
            for state_item in mod_data:
                print("\t",state_item)
                for key,val in state_item.items():
                    if hasattr(self,key):
                        state_func = getattr(self,key)
                        state_func(val)
                    else:
                        exit("Error:module [%s] has no argument [%s]" %( mod_name,key ))

    5、运行截图

    1、获主机信息

    2、打印模块详细信息

    打印结果截图

    转载于:https://www.cnblogs.com/luoahong/p/9426736.html

    展开全文
  • s3波形 在S3上获取音频文件密钥,为文件创建波形数据,然后通过流将其上传回S3。 安装 $ npm install s3-waveform --save 原料药 Exports.createWaveform(config,回调) ... 音频文件有多少个通道。 [默认值= 2
  • 有时候我们不确定key有多少, 但是会有一定的规律(这规律是根据业务来定的,如下), 这时候我们就可以考虑将properties中的信息转换为一map, 然后根据key的规律操作响应的数据 1. 创建一properties文件, ...

    springboot中比较常见的获取properties中的值,就是直接在字段上面添加@Value的属性. 但

    有时候我们不确定key有多少, 但是会有一定的规律(这个规律是根据业务来定的,如下), 这时候我们就可以考虑将properties中的信息转换为一个map, 然后根据key的规律操作响应的数据

    1. 创建一个properties文件, properties文件内容: 

    # 配置格式严格按照如下设置; app1, app2为具体的模块名称
    wechat.data.app1.appId=appid1
    wechat.data.app1.secret=secret1
    
    wechat.data.app2.appId=appid2
    wechat.data.app2.secret=
    
    wechat.data.app3.appId=appid3
    wechat.data.app3.secret=secret3

    2. 在java中将该properties文件转换为map

    package com.bz.wes.login.loginapi.config;
    
    import lombok.Data;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.context.annotation.PropertySource;
    import org.springframework.stereotype.Component;
    
    import java.util.HashMap;
    import java.util.Map;
    
    /**
     * @author changez
     * @desc
     * @datetime 2019/9/25 17:06
     */
    @Data
    @Component
    // 指定配置文件
    @PropertySource("classpath:wechatInfo.properties")
    @ConfigurationProperties(prefix = "wechat")
    public class WechatPropertiesConfig {
    
        // prefix的值+data变量名为properties key的前一部分, 将key剩余的部分作为map的key, value作为map的value
        public Map<String, String> data = new HashMap();
    }
    

     

    展开全文
  • #控制一个pool可分配多少个jedis实例,用来替换上面的redis.maxActive,如果是jedis 2.4以后用该属性 redis.maxTotal=300 #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。 redis....
  • Mybatis【配置文件】 Mybatis【关联映射】 Mybatis【缓存、代理、逆向工程】 Mybatis【与Spring整合】 Mybatis面试题 :fish_cake:Spring家族 SpringIOC和AOP&事务总结 Spring入门这一篇就够了 Spring【依赖...
  • 1. 时候Android系统配置的UI控件,不能满足我们的需求,Android开发做到了一定程度,多少都会用到自定义控件,一方面是更加灵活,另一方面在大数据量的情况下自定义控件的效率比写布局文件更高。 2. 下面我们是...

    1. 有时候Android系统配置的UI控件,不能满足我们的需求,Android开发做到了一定程度,多少都会用到自定义控件,一方面是更加灵活,另一方面在大数据量的情况下自定义控件的效率比写布局文件更高。

     

    2. 下面我们是自定义一个SmartImageView继承自ImageView,扩展了ImageView的功能:

        步骤:

    • 新建一个SmartImageView类,让继承自ImageView(放置特定的包下);

    • 实现SmartImageView类下的构造方法,最好全部实现,这个不容易出现问题,同时子类不能剥夺父类的构造方法;

    • 扩展功能方法setImageUrl,通过设置一个网络的路径给SmartImageView,SmartImageView会自动的把这个路径对应的图片下载下来;

     

    3. 下面我结合一个具体的案例形象说明一下:

    (1)新建一个Android工程,命名为" 网易新闻客户端_自定义控件(SmartImageView)",同时新建一个类为SmartImageView让它继承自ImageView,这里我们暂时不必理会布局文件activity_main.xml和MainActivity.java

    如下图:

     

    (2)接下来我们编写SmartImageView,扩展ImageView的功能:

     1 package com.himi.smart;
     2 
     3 import java.io.InputStream;
     4 import java.net.HttpURLConnection;
     5 import java.net.URL;
     6 
     7 import android.content.Context;
     8 import android.graphics.Bitmap;
     9 import android.graphics.BitmapFactory;
    10 import android.os.Handler;
    11 import android.os.Message;
    12 import android.util.AttributeSet;
    13 import android.widget.ImageView;
    14 
    15 /**
    16  * 实现一个子类,扩展系统的ImageView
    17  * @author Administrator
    18  *
    19  */
    20 public class SmartImageView extends ImageView {
    21     
    22     private static final int SUCCESS = 1;
    23     private Handler handler = new Handler() {
    24         public void handleMessage(android.os.Message msg) {
    25             switch (msg.what) {
    26             case SUCCESS:
    27                 Bitmap bitmap = (Bitmap) msg.obj;
    28                 setImageBitmap(bitmap);
    29                 break;
    30 
    31             default:
    32                 //其他消息,都是获取图片失败
    33                 break;
    34             }
    35 
    36         };
    37     };
    38 
    39     public SmartImageView(Context context, AttributeSet attrs, int defStyle) {
    40         super(context, attrs, defStyle);
    41         // TODO 自动生成的构造函数存根
    42     }
    43 
    44     public SmartImageView(Context context, AttributeSet attrs) {
    45         super(context, attrs);
    46         // TODO 自动生成的构造函数存根
    47     }
    48 
    49     public SmartImageView(Context context) {
    50         super(context);
    51         // TODO 自动生成的构造函数存根
    52     }
    53     
    54     /**
    55      * 设置一个网络的路径给imageview,imageview会自动的把这个路径对应的图片下载下来
    56      * @param path 图片的路径
    57      */
    58 
    59     public void  setImageUrl(final String path) {
    60         new Thread() {
    61             public void run() {
    62                 try {
    63                     URL url = new URL(path);
    64                     HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    65                     conn.setConnectTimeout(5000);
    66                     conn.setReadTimeout(5000);
    67                     conn.setRequestMethod("GET");
    68                     int code = conn.getResponseCode();
    69                     if(code ==200) {
    70                         InputStream is = conn.getInputStream();//获得服务器端的图片文件的输入流
    71                         Bitmap bitmap = BitmapFactory.decodeStream(is);//将服务器端的图片文件的输入流 转化为 Bitmap图片文件
    72                         //setImageBitmap(bitmap);子线程不能更新UI,这里要使用消息机制
    73                         Message msg = Message.obtain();
    74                         msg.obj = bitmap;
    75                         msg.what = SUCCESS;
    76                         handler.sendMessage(msg);
    77                     }
    78                 } catch (Exception e) {
    79                     e.printStackTrace();
    80                     handler.sendEmptyMessage(0);
    81                 }
    82             
    83                 
    84             };
    85         }.start();
    86     }
    87     
    88 }

    这里我们上面说过了我们最好实现全部的构造方法,在扩展方法setImageUrl():它是利用网络路径(String),获取网络上的图片资源,这里用到了网络操作,必然是耗时的操作,我们定义的SmartImageView到时候必然运行在主线程,我们知道网络操作不能放在主线程(UI主线程),所以这里新建了一个子线程new Thread()再结合handler(消息机制)实现UI更新。

     

    (3)接下来我们回到activity_main.xml布局文件:

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="com.himi.smart.MainActivity" >
    
        <com.himi.smart.SmartImageView
            android:id="@+id/iv"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/hello_world" />
    
    </RelativeLayout>

    添加一个我们定义的SmartImageView控件,设置其他参数和ImageView一样(SmartImageView继承自ImageView),这里特别注意:

    开始标签是 " 包名+控件类名 ",比如这里的是:

    <com.himi.smart.SmartImageView 

              android:id="@+id/iv"

              android:layout_centerHorizontal="true"

              android:layout_centerVertical="true"

              android:layout_width="wrap_content"

              android:layout_height="wrap_content"

              android:text="@string/hello_world" />

     

    (4)接下来自然是使用,回到MainActivity.java:

    package com.himi.smart;
    
    import com.himi.hebao.R;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.widget.ImageView;
    
    public class MainActivity extends Activity {
        
        private SmartImageView iv;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
            iv = (SmartImageView) findViewById(R.id.iv);
            iv.setImageUrl("http://a.hiphotos.baidu.com/image/pic/item/cf1b9d16fdfaaf51ebc1c2be8e5494eef01f7a94.jpg");
            
        }
    
    }

    这里的"http://a.hiphotos.baidu.com/image/pic/item/cf1b9d16fdfaaf51ebc1c2be8e5494eef01f7a94.jpg"是网络图片的路径,如下:

    (5)不要忘记在AndroidManifest.xml添加网络权限: <uses-permission android:name="android.permission.INTERNET"/>

    布署程序到模拟器上面:

    备注:这里编写的SmartImageView是为了后面Android(java)学习笔记205网易新闻UI实现的扩展类,下篇就是详细说明如何编写一个网易新闻的客户端

     

    转载于:https://www.cnblogs.com/hebao0514/p/4779043.html

    展开全文
  • 任务181: 演示一集内有多少成员存在于另一集内(下) 任务182: 小结 第17章: Tableau初级篇(函数与计算) 任务183: 运算符 任务184: 数字函数 任务185: 字符串函数 任务186: 日期函数 任务187: ...
  • 详情看配置文件内的说明 同步数据库表 FC001DBInit.go 主要入口 build_linux.bat 一键打包linux发布程序 build_windows.bat 一键打包windows发布程序 FC000.go 运行beego FC001DBInit.go 数据库表同步...
  • 时候我们会遇到jar包冲突的bug,或者说就是想单纯的看看我那简单的一句implementations到底导入了多少个jar包,这也是为什么Groovy语言的Gradle和XML语言的Maven相比,前者就能如此简洁。这时候,就可以去Android...
  • 你必须知道的495C语言问题

    千次下载 热门讨论 2015-05-08 11:09:25
    第1章 声明和初始化 ...6.23 sizeof返回的大小是以字节计算的,怎样才能判断数组中有多少个元素呢? 第7章 内存分配 基本的内存分配问题 7.1 为什么这段代码不行?char*answer;printf("Typesomething...
  • 《你必须知道的495C语言问题》

    热门讨论 2010-03-20 16:41:18
    1.24 我在一个文件中定义了一extern数组,然后在另一个文件中使用,为什么sizeof取不到数组的大小? 13 声明问题 14 1.25 函数只定义了一次,调用了一次,但编译器提示非法重声明了。 14 *1.26 main的正确...
  • 前几天公司个业务需求,要求接收到网易考拉的推送数据并批量读取删除XML文件给到指定目录下,与海关清关接口对接。...3,根据进程数量用算法计算每个进程需要处理多少个xml文件以及开启多少个进程 4...

    前几天公司有个业务需求,要求接收到网易考拉的推送数据并批量读取删除XML文件给到指定目录下,与海关清关接口对接。(海关接口是以读取XML文件获取数据,好过时的技术...)。

    不废话先上我的思路

    1,获取海关指定文件夹内所有xml文件

    2,根据服务器配置计算出每个php处理n个xml文件所需cpu以及内存开销

    3,根据进程数量用算法计算每个进程需要处理多少个xml文件以及开启多少个进程

    4,主进程等待子进程执行结束后才能退出

    我遇到的难点

    1,再对最大进程开启数预测后得出了一个值 例如70个进程,那么怎样才能将这些xml文件分配到指定进程上不会引起不同进程处理同一个文件呢,我的代码实现为

     1                 //计算进程启动数量以及每个进程执行的文件操作
     2                 $fl_array = array();
     3 
     4                 //将数据从新转化
     5                 $new_array_list = array();
     6                 foreach ($new_array as $k => $v){
     7                     array_push($new_array_list,$v);
     8                 }
     9 
    10                 //每个进程的文件操作数量
    11                 $fl = floor($array_count/$this->pro)+1;
    12                 //第一步循环最大进程数
    13                 $c = 0;
    14 
    15                 for ($i=0;$i<$this->pro;$i++){
    16                     //第二步每个进程的文件操作数量
    17                     for ($j=0;$j<$fl;$j++){
    18                         if(isset($new_array_list[$c])){
    19                             $fl_array[$i][] = $new_array_list[$c];
    20                         }
    21                         $c++;
    22                     }
    23                 }                    

    其中数组$new_array_list为所有xml文件的文件名的数组最终得到的结果是一个二维数组,每个数组内有若干个xml文件名,这样就为了之后的循环开启子进程做了准备

    2,fork子进程

          foreach ($fl_array as $k =>$v){
                        $nPID = pcntl_fork(); // 创建子进程
    
                        if($nPID == 0){
                            try{
                                Yii::app()->db->createCommand( " SET AUTOCOMMIT=0; BEGIN WORK; " )->execute();
                                foreach ($fl_array[$k] as $k2=>$v2){
                                    //处理业务逻辑
                                    $filed = array();
    
                                    $sql_item_select = " /*master*/SELECT `custemstates` FROM t_rocord_head WHERE `copno`='".$v2['copNo']."';";
                                    $item = yii::app()->db->createCommand($sql_item_select)->queryRow();
    
    
    
                                    if($v2['returnStatus'] > $item['custemstates']){
    
                                        if(isset($v2['invtNo'])) array_push($filed," `invtno` = '".$v2['invtNo']."' "); //清单编号
                                        if(isset($v2['returnStatus'])) array_push($filed," `custemstates` = '".$v2['returnStatus']."' "); //海关回执状态编码
                                        if(isset($v2['selfcusflag'])) array_push($filed," `selfcusflag` = '".$v2['selfcusflag']."' "); //海关回执状态编码
                                        if(isset($v2['returnTime'])) array_push($filed," `custemreturntime` = '".$v2['returnTime']."' "); //海关回执时间
                                        if(isset($v2['returnInfo'])) array_push($filed," `custemmessage` = '".$v2['returnInfo']."' "); //海关回执消息
                                        array_push($filed," `sendflag` = '0' "); //是否发送给客户
                                        array_push($filed," `updatedate` = '".date('Y-m-d h:i:s')."' "); //更新时间
                                        array_push($filed," `updateuser` = 'system' "); //更新时间
    
                                        $sql_update = " /*master*/UPDATE t_rocord_head SET ".implode(",",$filed)." WHERE `copno` = '".$v2['copNo']."' and (`delflag` <> '1' OR `delflag` is null)";
    
    
    
                                        yii::app()->db->createCommand($sql_update)->execute();
    
                                    }else if($v2['returnStatus'] < '0' && $item['custemstates'] == '2'){
    
                                        if(isset($v2['invtNo'])) array_push($filed," `invtno` = '".$v2['invtNo']."' "); //清单编号
                                        if(isset($v2['returnStatus'])) array_push($filed," `custemstates` = '".$v2['returnStatus']."' "); //海关回执状态编码
                                        if(isset($v2['selfcusflag'])) array_push($filed," `selfcusflag` = '".$v2['selfcusflag']."' "); //海关回执状态编码
                                        if(isset($v2['returnTime'])) array_push($filed," `custemreturntime` = '".$v2['returnTime']."' "); //海关回执时间
                                        if(isset($v2['returnInfo'])) array_push($filed," `custemmessage` = '".$v2['returnInfo']."' "); //海关回执消息
                                        array_push($filed," `sendflag` = '0' "); //是否发送给客户
                                        array_push($filed," `updatedate` = '".date('Y-m-d h:i:s')."' "); //更新时间
                                        array_push($filed," `updateuser` = 'system' "); //更新时间
    
                                        $sql_update = " /*master*/UPDATE t_rocord_head SET ".implode(",",$filed)." WHERE `copno` = '".$v2['copNo']."' and (`delflag` <> '1' OR `delflag` is null);";
                                        yii::app()->db->createCommand($sql_update)->execute();
    
    
                                    }
                                }
    
                                yii::app()->db->createCommand( "COMMIT WORK;" )->execute();
                            }catch (Exception $e){
                                echo "子进程错误";
                                exec("kill -9 ".$masterpid."");
                                exit();
                            }
    
                            $oW = fopen($this->sPipePath, 'w');
                            fwrite($oW, $k."\n"); // 当前任务处理完比,在管道中写入数据
                            fclose($oW);
                            exit(0); // 执行完后退出
                        }
                    }

    其中 exec("kill -9 ".$masterpid.""); 是为了避免子进程异常后无法被退出造成的僵尸进程产生

    3,子进程执行完毕,主进程退出

     1           // 父进程
     2                 $oR = fopen($this->sPipePath, 'r');
     3                 stream_set_blocking($oR, false); // 将管道设置为非堵塞,用于适应超时机制
     4                 $sData = ''; // 存放管道中的数据
     5                 $nLine = 0;
     6                 $nStart = time();
     7                 while ($nLine < count($fl_array) && (time() - $nStart) < $this->timeout) {
     8                     $sLine = fread($oR, 1024);
     9                     if (empty($sLine)) {
    10                         continue;
    11                     }
    12 
    13                     //echo "current line: {$sLine}\n";
    14                     // 用于分析多少任务处理完毕,通过‘\n’标识
    15                     foreach(str_split($sLine) as $c) {
    16                         if ("\n" == $c) {
    17                             ++$nLine;
    18                         }
    19                     }
    20                     $sData .= $sLine;
    21                 }
    22                 //echo "Final line count:$nLine\n";
    23                 fclose($oR);
    24                 unlink($this->sPipePath); // 删除管道,已经没有作用了
    25 
    26                 // 等待子进程执行完毕,避免僵尸进程
    27                 $n = 0;
    28                 while ($n < count($fl_array)) {
    29                     $nStatus = -1;
    30                     $nPID = pcntl_wait($nStatus, WNOHANG);
    31                     if ($nPID > 0) {
    32                         //echo "{$nPID} exit\n";
    33                         ++$n;
    34                     }
    35                 }
    36 
    37                 // 验证结果,主要查看结果中是否每个任务都完成了
    38                 $arr2 = array();
    39                 foreach(explode("\n", $sData) as $i) {// trim all
    40                     if (is_numeric(trim($i))) {
    41                         array_push($arr2, $i);
    42                     }
    43                 }
    44                 $arr2 = array_unique($arr2);
    45 
    46                 if ( count($arr2) == count($fl_array)) {
    47 
    48                     echo "ok".date('Y-m-d h:i:s');
    49                     exit();
    50                 } else {
    51                     echo  "error count " . count($arr2) . date('Y-m-d h:i:s')."\n";
    52                     exit();
    53                 }

    就这样将需求搞定!

    下面为代码全貌,如有不正确的地方,请指出

      1 <?php
      2 /**
      3  * Created by PhpStorm.
      4  * User: Administrator
      5  * Date: 2018/6/15
      6  * Time: 9:06
      7  */
      8 class RemoveXmlCommand extends CConsoleCommand{
      9 
     10     // /home/wwwroot/192.168.1.126/qgsb_cms/qgsb_cms/protected/yiic removexml run
     11     private $config;
     12     //文件存储模式 1,liunx 2,windows
     13     private $storage_model;
     14 
     15     //文件存储路径
     16     private $storage_in_path_liunx;
     17 
     18     //进程管道文件路径
     19     private $piRealPath;
     20 
     21     private $storage_in_path_windows;
     22 
     23     private $storage_real_path;
     24 
     25     //开启处理进程个数
     26     private $pro;
     27     //超时设置
     28     private $timeout; //毫秒级
     29     //管道
     30     private $sPipePath;
     31 
     32     //海关状态编码优先级配置
     33     private $returnStatus = [
     34         '2'=>[
     35             'field'=>'00',
     36             'level'=>'1'
     37         ],
     38 //        '0'=>[
     39 //            'field'=>'01',
     40 //            'level'=>'2'
     41 //        ],
     42         '120'=>[
     43             'field'=>'02',
     44             'level'=>'3'
     45         ],
     46         '300'=>[
     47             'field'=>'03',
     48             'level'=>'4'
     49         ],
     50         '500'=>[
     51             'field'=>'04',
     52             'level'=>'5'
     53         ],
     54         '700'=>[
     55             'field'=>'05',
     56             'level'=>'6'
     57         ],
     58         '800'=>[
     59             'field'=>'06',
     60             'level'=>'7'
     61         ],
     62     ];
     63 
     64 
     65     function __construct() {
     66         $this->config = require_once(Yii::app()->basePath.'/config/customs.php');
     67 
     68         $this->storage_model = $this->config['remove_xml']['storage_model'];
     69         $this->storage_in_path_liunx = $this->config['remove_xml']['storage_in_path_liunx'];
     70         $this->piRealPath = $this->config['remove_xml']['piRealPath'];
     71         $this->storage_in_path_windows = $this->config['remove_xml']['storage_in_path_windows'];
     72         $this->pro = $this->config['remove_xml']['pro'];
     73         $this->timeout = $this->config['remove_xml']['timeout'];
     74 
     75         $this->storage_real_path = $this->_systemType($this->storage_model);
     76     }
     77 
     78     private function _systemType($model){
     79         switch ($model){
     80             case 1:
     81                 $this->storage_real_path = $this->storage_in_path_liunx;
     82                 break;
     83             case 2:
     84                 $this->storage_real_path = $this->storage_in_path_windows;
     85                 break;
     86             default:
     87                 return;
     88         }
     89         return $this->storage_real_path;
     90     }
     91 
     92 
     93     public function actionRunpro(){
     94         //拿到文件列表并进行数据处理拼接
     95         $xmlFlieArray = $this->_getXmlList($this->storage_real_path);
     96 
     97         //取得前2000位数组为了避免cpu爆炸
     98         $xmlFlieArray = array_slice($xmlFlieArray,0,2000);
     99 
    100 
    101         //初始化处理后的数据
    102         $makeFlieArry = array();
    103         if(!empty($xmlFlieArray)){
    104             foreach ($xmlFlieArray as $k => $v){
    105                 $xml = simplexml_load_file($this->storage_real_path.$v,'SimpleXMLElement', LIBXML_NOCDATA);
    106                 $jsonStr = json_encode($xml);
    107                 $jsonArray = json_decode($jsonStr,true);
    108                 $jsonArray['InventoryReturn']['filename'] = $v;
    109                 array_push($makeFlieArry,$jsonArray['InventoryReturn']);
    110             }
    111         }else{
    112             echo "没有可删除的xml文件".date('y-m-d h:i:s');
    113             exit();
    114         }
    115 
    116 
    117         foreach ($makeFlieArry as $k => $v){
    118             if($v['returnStatus'] == "CIQ101"){
    119                 unset($makeFlieArry[$k]);
    120             }
    121         }
    122 
    123         foreach ($makeFlieArry as $k => $v){
    124             //如果不是一个文件的情况
    125             if(isset($makeFlieArry[$k]) && isset($makeFlieArry[$k+1])){
    126                 if($makeFlieArry[$k]['copNo'] == $makeFlieArry[$k+1]['copNo']){
    127                     //开启逻辑判断优先级
    128                     if(($makeFlieArry[$k+1]['returnStatus'] > $makeFlieArry[$k]['returnStatus']) || ($makeFlieArry[$k+1]['returnStatus'] < '0' && $makeFlieArry[$k]['returnStatus'] == '2')){
    129                         unset($makeFlieArry[$k]);
    130                     }else{
    131                         unset($makeFlieArry[$k+1]);
    132                     }
    133 
    134                 }
    135             }
    136 
    137         }
    138 
    139         $new_array = $makeFlieArry;
    140 
    141 
    142         foreach ($new_array as $k => $v){
    143             if($v['returnStatus'] > '0'){
    144                 $new_array[$k]['selfcusflag'] = $this->returnStatus[$v['returnStatus']]['field'];
    145             }else{
    146                 $new_array[$k]['selfcusflag'] = '01';
    147             }
    148         }
    149 
    150         //更新数据库并删除文件
    151         if(!empty($new_array)){
    152 
    153             $array_count = count($new_array);
    154 
    155             if($this->pro > $array_count && $array_count>0){
    156                 //当文件小于进程数 可以直接用单进程跑任务
    157 
    158                 try{
    159                     Yii::app()->db->createCommand( " SET AUTOCOMMIT=0; BEGIN WORK; " )->execute();
    160 
    161                     foreach ($new_array as $k =>$v){
    162                         $filed = array();
    163                         $sql_item_select = " /*master*/SELECT `custemstates` FROM t_rocord_head WHERE `copno`='".$v['copNo']."';";
    164                         $item = yii::app()->db->createCommand($sql_item_select)->queryRow();
    165 
    166                         if($v['returnStatus'] > $item['custemstates']){
    167                             if(isset($v['invtNo'])) array_push($filed," `invtno` = '".$v['invtNo']."' "); //清单编号
    168                             if(isset($v['returnStatus'])) array_push($filed," `custemstates` = '".$v['returnStatus']."' "); //海关回执状态编码
    169                             if(isset($v['selfcusflag'])) array_push($filed," `selfcusflag` = '".$v['selfcusflag']."' "); //海关回执状态编码
    170                             if(isset($v['returnTime'])) array_push($filed," `custemreturntime` = '".$v['returnTime']."' "); //海关回执时间
    171                             if(isset($v['returnInfo'])) array_push($filed," `custemmessage` = '".$v['returnInfo']."' "); //海关回执消息
    172                             array_push($filed," `sendflag` = '0' "); //是否发送给客户
    173                             array_push($filed," `updatedate` = '".date('Y-m-d h:i:s')."' "); //更新时间
    174                             array_push($filed," `updateuser` = 'system' "); //更新时间
    175 
    176                             $sql_update = " /*master*/UPDATE t_rocord_head SET ".implode(",",$filed)." WHERE `copno` = '".$v['copNo']."' and (`delflag` <> '1' OR `delflag` is null);";
    177 
    178                             yii::app()->db->createCommand($sql_update)->execute();
    179 
    180 
    181                         }else if($v['returnStatus'] < '0' && $item['custemstates'] == '2'){
    182 
    183                             if(isset($v['invtNo'])) array_push($filed," `invtno` = '".$v['invtNo']."' "); //清单编号
    184                             if(isset($v['returnStatus'])) array_push($filed," `custemstates` = '".$v['returnStatus']."' "); //海关回执状态编码
    185                             if(isset($v['selfcusflag'])) array_push($filed," `selfcusflag` = '".$v['selfcusflag']."' "); //海关回执状态编码
    186                             if(isset($v['returnTime'])) array_push($filed," `custemreturntime` = '".$v['returnTime']."' "); //海关回执时间
    187                             if(isset($v['returnInfo'])) array_push($filed," `custemmessage` = '".$v['returnInfo']."' "); //海关回执消息
    188                             array_push($filed," `sendflag` = '0' "); //是否发送给客户
    189                             array_push($filed," `updatedate` = '".date('Y-m-d h:i:s')."' "); //更新时间
    190                             array_push($filed," `updateuser` = 'system' "); //更新时间
    191 
    192                             $sql_update = " /*master*/UPDATE t_rocord_head SET ".implode(",",$filed)." WHERE `copno` = '".$v['copNo']."' and (`delflag` <> '1' OR `delflag` is null);";
    193                             yii::app()->db->createCommand($sql_update)->execute();
    194 
    195                         }
    196                     }
    197 
    198                     yii::app()->db->createCommand( "COMMIT WORK;" )->execute();
    199 
    200                 }catch (Exception $e){
    201                     echo "更新数据库并删除文件步骤错误".date('y-m-d h:i:s');
    202                     exit();
    203                 }
    204 
    205 
    206 
    207                 foreach ($xmlFlieArray as $k => $v){
    208                     unlink($this->storage_real_path.$v);
    209                 }
    210 
    211                 echo "成功删除文件并且更新数据库!".date('y-m-d h:i:s');
    212                 exit();
    213             }else{
    214                 //开启多进程模式
    215                 //检测pcntl_fork扩展是否开启了
    216                 if (!function_exists('pcntl_fork')) {
    217                     die("pcntl_fork not existing");
    218                 }
    219 
    220                 if (!function_exists('exec')) {
    221                     die("exec not existing");
    222                 }
    223 
    224                 //当前主进程号
    225                 $masterpid = posix_getpid();
    226                 //创建管道
    227                 $this->sPipePath = $this->piRealPath."my_pipe.".$masterpid;
    228 
    229                 if (!posix_mkfifo($this->sPipePath, 0666)) {
    230                     die("create pipe {$this->sPipePath} error");
    231                 }
    232                 //计算进程启动数量以及每个进程执行的文件操作
    233                 $fl_array = array();
    234 
    235                 //将数据从新转化
    236                 $new_array_list = array();
    237                 foreach ($new_array as $k => $v){
    238                     array_push($new_array_list,$v);
    239                 }
    240 
    241                 //每个进程的文件操作数量
    242                 $fl = floor($array_count/$this->pro)+1;
    243                 //第一步循环最大进程数
    244                 $c = 0;
    245 
    246                 for ($i=0;$i<$this->pro;$i++){
    247                     //第二步每个进程的文件操作数量
    248                     for ($j=0;$j<$fl;$j++){
    249                         if(isset($new_array_list[$c])){
    250                             $fl_array[$i][] = $new_array_list[$c];
    251                         }
    252                         $c++;
    253                     }
    254                 }
    255 
    256                 foreach ($fl_array as $k =>$v){
    257                     $nPID = pcntl_fork(); // 创建子进程
    258 
    259                     if($nPID == 0){
    260                         try{
    261                             Yii::app()->db->createCommand( " SET AUTOCOMMIT=0; BEGIN WORK; " )->execute();
    262                             foreach ($fl_array[$k] as $k2=>$v2){
    263                                 //处理业务逻辑
    264                                 $filed = array();
    265 
    266                                 $sql_item_select = " /*master*/SELECT `custemstates` FROM t_rocord_head WHERE `copno`='".$v2['copNo']."';";
    267                                 $item = yii::app()->db->createCommand($sql_item_select)->queryRow();
    268 
    269 
    270 
    271                                 if($v2['returnStatus'] > $item['custemstates']){
    272 
    273                                     if(isset($v2['invtNo'])) array_push($filed," `invtno` = '".$v2['invtNo']."' "); //清单编号
    274                                     if(isset($v2['returnStatus'])) array_push($filed," `custemstates` = '".$v2['returnStatus']."' "); //海关回执状态编码
    275                                     if(isset($v2['selfcusflag'])) array_push($filed," `selfcusflag` = '".$v2['selfcusflag']."' "); //海关回执状态编码
    276                                     if(isset($v2['returnTime'])) array_push($filed," `custemreturntime` = '".$v2['returnTime']."' "); //海关回执时间
    277                                     if(isset($v2['returnInfo'])) array_push($filed," `custemmessage` = '".$v2['returnInfo']."' "); //海关回执消息
    278                                     array_push($filed," `sendflag` = '0' "); //是否发送给客户
    279                                     array_push($filed," `updatedate` = '".date('Y-m-d h:i:s')."' "); //更新时间
    280                                     array_push($filed," `updateuser` = 'system' "); //更新时间
    281 
    282                                     $sql_update = " /*master*/UPDATE t_rocord_head SET ".implode(",",$filed)." WHERE `copno` = '".$v2['copNo']."' and (`delflag` <> '1' OR `delflag` is null)";
    283 
    284 
    285 
    286                                     yii::app()->db->createCommand($sql_update)->execute();
    287 
    288                                 }else if($v2['returnStatus'] < '0' && $item['custemstates'] == '2'){
    289 
    290                                     if(isset($v2['invtNo'])) array_push($filed," `invtno` = '".$v2['invtNo']."' "); //清单编号
    291                                     if(isset($v2['returnStatus'])) array_push($filed," `custemstates` = '".$v2['returnStatus']."' "); //海关回执状态编码
    292                                     if(isset($v2['selfcusflag'])) array_push($filed," `selfcusflag` = '".$v2['selfcusflag']."' "); //海关回执状态编码
    293                                     if(isset($v2['returnTime'])) array_push($filed," `custemreturntime` = '".$v2['returnTime']."' "); //海关回执时间
    294                                     if(isset($v2['returnInfo'])) array_push($filed," `custemmessage` = '".$v2['returnInfo']."' "); //海关回执消息
    295                                     array_push($filed," `sendflag` = '0' "); //是否发送给客户
    296                                     array_push($filed," `updatedate` = '".date('Y-m-d h:i:s')."' "); //更新时间
    297                                     array_push($filed," `updateuser` = 'system' "); //更新时间
    298 
    299                                     $sql_update = " /*master*/UPDATE t_rocord_head SET ".implode(",",$filed)." WHERE `copno` = '".$v2['copNo']."' and (`delflag` <> '1' OR `delflag` is null);";
    300                                     yii::app()->db->createCommand($sql_update)->execute();
    301 
    302 
    303                                 }
    304                             }
    305 
    306                             yii::app()->db->createCommand( "COMMIT WORK;" )->execute();
    307                         }catch (Exception $e){
    308                             echo "子进程错误";
    309                             exec("kill -9 ".$masterpid."");
    310                             exit();
    311                         }
    312 
    313                         $oW = fopen($this->sPipePath, 'w');
    314                         fwrite($oW, $k."\n"); // 当前任务处理完比,在管道中写入数据
    315                         fclose($oW);
    316                         exit(0); // 执行完后退出
    317                     }
    318                 }
    319 
    320                 foreach ($xmlFlieArray as $k => $v){
    321                     unlink($this->storage_real_path.$v);
    322                 }
    323                 // 父进程
    324                 $oR = fopen($this->sPipePath, 'r');
    325                 stream_set_blocking($oR, false); // 将管道设置为非堵塞,用于适应超时机制
    326                 $sData = ''; // 存放管道中的数据
    327                 $nLine = 0;
    328                 $nStart = time();
    329                 while ($nLine < count($fl_array) && (time() - $nStart) < $this->timeout) {
    330                     $sLine = fread($oR, 1024);
    331                     if (empty($sLine)) {
    332                         continue;
    333                     }
    334 
    335                     //echo "current line: {$sLine}\n";
    336                     // 用于分析多少任务处理完毕,通过‘\n’标识
    337                     foreach(str_split($sLine) as $c) {
    338                         if ("\n" == $c) {
    339                             ++$nLine;
    340                         }
    341                     }
    342                     $sData .= $sLine;
    343                 }
    344                 //echo "Final line count:$nLine\n";
    345                 fclose($oR);
    346                 unlink($this->sPipePath); // 删除管道,已经没有作用了
    347 
    348                 // 等待子进程执行完毕,避免僵尸进程
    349                 $n = 0;
    350                 while ($n < count($fl_array)) {
    351                     $nStatus = -1;
    352                     $nPID = pcntl_wait($nStatus, WNOHANG);
    353                     if ($nPID > 0) {
    354                         //echo "{$nPID} exit\n";
    355                         ++$n;
    356                     }
    357                 }
    358 
    359                 // 验证结果,主要查看结果中是否每个任务都完成了
    360                 $arr2 = array();
    361                 foreach(explode("\n", $sData) as $i) {// trim all
    362                     if (is_numeric(trim($i))) {
    363                         array_push($arr2, $i);
    364                     }
    365                 }
    366                 $arr2 = array_unique($arr2);
    367 
    368                 if ( count($arr2) == count($fl_array)) {
    369 
    370                     echo "ok".date('Y-m-d h:i:s');
    371                     exit();
    372                 } else {
    373                     echo  "error count " . count($arr2) . date('Y-m-d h:i:s')."\n";
    374                     exit();
    375                 }
    376 
    377             }
    378 
    379         }else{
    380             echo "更新数据库并删除文件步骤错误".date('y-m-d h:i:s');
    381             exit();
    382         }
    383     }
    384 
    385     //获取目标文件夹内文件
    386     private function _getXmlList($path){
    387         $files = scandir($path);
    388         $result = [];
    389         foreach ($files as $file) {
    390             if ($file != '.' && $file != '..') {
    391                 //判断是否为xml文件
    392                 if(pathinfo($file)['extension'] == "xml"){
    393                     if (is_dir($path . '/' . $file)) {
    394                         scanFile($path . '/' . $file);
    395                     } else {
    396                         $result[] = basename($file);
    397                     }
    398                 }
    399 
    400             }
    401         }
    402 
    403         return $result;
    404     }
    405 }

     

    转载于:https://www.cnblogs.com/yuzhengzino/p/9199434.html

    展开全文
  • redirect就是服务端根据逻辑,发送一状态码,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以session,request参数都可以获取。 23、EJB与JAVA BEAN的区别?  Java Bean 是可...
  • 1.24 我在一个文件中定义了一extern数组,然后在另一个文件中使用,为什么sizeof取不到数组的大小? 13 声明问题 14 1.25 函数只定义了一次,调用了一次,但编译器提示非法重声明了。 14 *1.26 main的正确...
  • 入门学习Linux常用必会60命令实例详解doc/txt

    千次下载 热门讨论 2011-06-09 00:08:45
    -n:一般而言,mount挂上后会在/etc/mtab中写入一笔资料,在系统中没有可写入文件系统的情况下,可以用这选项取消这动作。 4.应用技巧 在Linux 和Unix系统上,所有文件都是作为一大型树(以/为根)的一部分...
  • 37、下面这条语句一共创建了多少个对象:String s="a"+"b"+"c"+"d"; 24 38、try {}里一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后? 25 39、下面的...
  • 看目录里面有多少,然后放入这comboBox * 3. 获取被过滤的文件 * 4. 按照顺序放入到combobox中 */ ui->comboBox->clear(); ui->comboBox->setMaxVisibleItems(5); // 最大可见数目 5 //The string ...
  • │ ├─ getters.js 从index.js抽取出来的getters,获取购物车里有多少种商品 │ ├─ index.js │ ├─ mutation-types.js 定义一些常量来替代 Mutation 事件类型 │ └─ mutations.js 从index.js抽取出来的...
  • GetPrivateProfileInt 为初始化文件(.ini文件)中指定的条目获取整数值 GetPrivateProfileSection 获取指定小节(在.ini文件中)所有项名和值的一列表 GetPrivateProfileString 为初始化文件中指定的条目...
  • 用户登录奖励1

    2019-10-19 22:26:01
    1)笔记 1)用户登录奖励(每日登录):... 今天没有奖励,你连续登录了多少天,我们专门个数据表的设计: login_bonues; 3)具体实现: 登录文件配置; 第一次登录游戏,在用户登录这里,插入每日登录奖励; 在获取游...
  • ElasticLogView通过基于baseFilterField字段连续轮询后端以获取最新记录来进行baseFilterField并运行聚合以收集过滤器的值,并提供一些基本的统计信息来说明数据库中有多少个不同的值。 配置 编辑js/config.js文件...
  • 看了许多教程 ,大多数都是提前定义好客户端,但是这样有弊端,我们并不知道以后会有多少客户端。有可能从数据库读取数据,也有可能通过json文件获取,总之 各种方式。 然后 网上大多数教程都是提前定义好的!这样...
  • 在oauth2根据授权码获取accsess token时,通关Debug发现在TokenEndpoint类下的getAccessToken方法内会根据principal去数据库获取client_id,但principal内存储的是当前用户的信息,然后就会报错:Given client ID does ...
  • 在Zookeeper中,znode是一跟Unix文件系统路径相似的节点,可以往这节点存储或获取数据。如果在创建znode时Flag设置为EPHEMERAL,那么当这创建这znode的节点和Zookeeper失去连接后,这znode将不再存在在...

空空如也

空空如也

1 2 3 4 5 ... 9
收藏数 172
精华内容 68
关键字:

获取配置文件有多少个数据