GoLang 执行CMD命令 (cmd | exec | Command)

场景说明:我的项目站点是PHP,现在需要用 GoLang 写一个定时任务,去修改一些数据库中的内容。

GoLang 执行时需要通过一个读取参数判断当前任务是否执行,这个参数保存在 PHP 内。


方法

  1. PHP 增加一个接口返回需要的参数,这样做 GoLang 访问 127.0.0.1, 如果执行频率太高的情况,会给 Apache 带来太多压力。放弃。

  2. GoLang 读取 PHP 文件,通过自负串截取,取得参数。这样做性能是最好的,但是 PHP 的配置文件,甲方总是修改,他不太懂,为了避免他改错,造成读取不到参数,而且方法感觉也不优雅。放弃。

  3. GoLang 通过命令执行单独的 PHP 文件, PHP 返回参数给 GoLang,这样避免了经过 127.0.0.1 给 Apache 带来的压力。


上代码


PHP

<?php

$config = include_once("/Users/niejunyong/www/c.799coin.com/config/hello.php");

echo json_encode($config['trade']['time'][0]);

exit;

GoLang

type start struct {
   Open string
   Close string
}

// 获取市场开放时间
func tradeStart()  {

    cmd := exec.Command("php", "-f", "/Users/niejunyong/go/src/workspace/kuanliangou_setTime/close_order/config.php")
    
    // 设置接收
    var out bytes.Buffer
    cmd.Stdout = &out
    
    // 执行
    err := cmd.Run()
    
    if err != nil {
       fmt.Println(err)
    }
    
    // 字符串转 JSON
    var s start
    err = json.Unmarshal([]byte(out.String()), &s)
    
    if err != nil {
       fmt.Println("json.marshal failed, err:", err)
    }
    
    fmt.Println()
    fmt.Println(s)
    fmt.Println(s.Open)
    fmt.Println(s.Close)
    
}

运行结果

3975
0
3年前