我需要在命令行上运行我的一个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并将其作为长字符串发送。然后在控制器中解码并反序列化并将数组发送到我的脚本。
答案 0 :(得分:2)
默认情况下,CI允许“a-z 0-9~%。:_-”字符。 base64生成另一个符号,如+和=。这就是使用rawurlencode代替base64:
的原因exec( 'php index.php controller function '.rawurlencode(serialize($params)) );
转移和安全是安全的外壳
答案 1 :(得分:1)
我想CLI会改变变量通过CLI传递的方式,我错了吗?
没有
https://stackoverflow.com/a/2873015/183254
你的解决方案似乎是最好的路线,虽然不确定base64是否必要(如果你有不稳定的字符,它可能是esp)。
答案 2 :(得分:0)
如果参数数量不是太多,则传递像......这样的参数很方便。
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
}
?>
答案 3 :(得分:0)
要将其传递到带有帖子数据的新线程中:
exec('nohup php index.php controller method ' . rawurlencode($this->input->raw_input_stream) . ' ' . arg2 . ' ' . $arg3 . ' > /dev/null 2>&1 & echo $!', $op);