3

我需要在命令行上运行我的 CI 脚本之一。我需要将一个数组传递给控制器​​,然后再传递给脚本。这是我现在得到的:

$params = array(
    'a' => var1,
    'b' => var2
);

然后运行的cmd是:

php index.php process process_opk params

在我的控制器中,只是为了查看阵列如何/是否正确通过,我有:

public function index($args) {
    print_r($args);
}

它的输出是params一个字符串。

在发送之前我需要先序列化我的数组吗?我猜 CLI 改变了变量通过 CLI 传递的方式,我错了吗?如果有人可以详细说明这一点并展示最佳实践,那就太好了。谢谢!

更新:到目前为止我能找到的最佳解决方案是对序列化数据进行 base64_encode 并将其作为长字符串发送。然后在控制器中解码和反序列化并将数组发送到我的脚本。

4

4 回答 4

2

默认情况下,CI 允许使用“az 0-9~%.:_-”字符。base64 生成另一个符号,如 + 和 =。这就是为什么最好使用rawurlencode而不是 base64:

exec( 'php index.php controller function '.rawurlencode(serialize($params)) );

转移和外壳是安全的。

于 2013-07-03T13:28:05.643 回答
2

如果参数的数量不是太多,则可以方便地传递参数,例如...

php index.php process process_opk/par1/par2/par3...

并在控制器中

<?php

class Process extends CI_Controller {

function __construct() {
    parent::__construct();       
}

public function index()
{
    $this->process_opk();
}

public function process_opk($par1 = -1,$par2 = -1,$par3 = -1)
{
  //process
}
?>
于 2013-07-20T13:15:01.943 回答
1

我猜 CLI 改变了变量通过 CLI 传递的方式,我错了吗?

不。

https://stackoverflow.com/a/2873015/183254

您的解决方案似乎是最好的路线,尽管不确定 base64 是否必要(尤其是如果您有不稳定的字符,则可能是)。

于 2013-03-19T19:27:47.947 回答
0

要将其传递到带有发布数据的新线程:

exec('nohup php index.php controller method ' . rawurlencode($this->input->raw_input_stream) . ' ' . arg2 . ' ' . $arg3 . ' > /dev/null 2>&1 & echo $!', $op);
于 2018-11-08T11:04:28.157 回答