在多线程之前在长时间运行的后台shell脚本中传递数组

时间:2012-08-23 15:40:59

标签: php linux multithreading shell

在crontab中,我添加了一个php脚本名称,从CLI SAPI模式运行此脚本,因此没有max_execution_time问题。

我可以使用空格传递几个参数。

system('/path/of/your/script.php param1 param2 > scriptlog.txt &')

但我需要传递一个数组作为参数是shell脚本并分解数组。

例如,

system('/path/of/your/script.php array > scriptlog.txt &')

2 个答案:

答案 0 :(得分:3)

当您在应用中投射system时,您必须implode您的参数
只需像

那样依次传递参数
system('/path/of/your/script.php param[0] param[1] > scriptlog.txt &')

这看起来像

system('/path/of/your/script.php '.implode(" ",$params).' > scriptlog.txt &')

如果您有引号,可以查看escapeshellarg

system('/path/of/your/script.php '.implode(" ",array_map("escapeshellarg",$params)).' > scriptlog.txt &')

然后在script.php中,使用

捕捉参数
$args = $argv;
array_shift($args); //Because $args[0] is 'script.php'

如果您在> scriptlog.txt &中抓住script.php,请改用:

$args = $argv;
if (false !== ($pos = array_search(">",$args))) {
    $args = array_slice($args,1,$pos-1);
} else {
    array_shift($args);
}

请注意,仅当您的数组是非关联数据时,此方法才有效 您需要编写另一个函数来检索关联参数

答案 1 :(得分:0)

你无法直接传递阵列。理想情况下,您要做的是将数组的每个成员作为单独的参数传递出来,然后将它们读回来在您的脚本中使用。您还可以传递要读取到脚本的参数数量。 IE。

$out = sizeof($array);
foreach ($array as $arg){
    $out = $out . ' ' . $arg;
}

这应该给你的out对象一个像“4 param1 param2 param3 param4”这样的列表

然后你只需要在bash脚本中使用ARGV来阅读这些变量。

或者,您也可以使用字段分隔列表,将其作为一个参数读取,然后使用字段分隔符上的拆分将每个数组元素拆分出来。