如何将文件作为参数传递给php exec?

时间:2011-10-23 16:23:55

标签: php c exec command-line-arguments

我想知道如何将文件的内容(在我的情况下为csv)作为命令行可执行文件(在C或Objective C中)的参数传递,以便由php中的exec调用。

以下是我所做的:用户从以下URL加载其文件的内容:

http://www.myserver.com/model.php?fileName=test.csv

然后以下代码允许php解析并加载csv文件:

<?php

$f = $_GET['fileName'];
$handle = fopen("$f", "r"); 

$data = array(); 
while (($line = fgetcsv($handle)) !== FALSE) { 
$data[] = $line;
}

?>

我遇到的问题是如何将此csv文件的内容作为参数传递给exec。即使我可以假设csv只有两列,它有多少行是用户特定的,所以我不能将所有值一个接一个地作为参数传递,例如

exec("/path_to_executable/model -a $data[0][0] -b $data[0][1] .....");

我认为唯一的替代解决方案是编写类似的东西:

exec("/path_to_executable/model -fileName test.csv");

并让命令行可执行文件执行csv解析,但在这种情况下,我认为我需要在服务器端物理写入csv文件。我想知道如果有几个人同时使用他们自己的不同csv文件访问网页会发生什么,他们是否会相互覆盖?

我想必须有一个更合适的方法来做到这一点,我还没弄明白。任何的想法?谢谢!

2 个答案:

答案 0 :(得分:0)

您可以使用popen()来处理要写入的进程。如果您需要双向(读/写)并可能需要更多功能,请查看proc_open()

您也可以将数据写入一些随机文件(以避免多个用户踢对方的竞赛条件)。

的内容
<?php
$csv = file_get_contents('http://www.myserver.com/model.php?fileName=test.csv
');
$filename = '/tmp/' . uniqid(sha1($csv)) . '.csv';
file_put_contents($filename, $csv);
exec('/your/thing < '. escapeshellarg($filename));
unlink($filename);

既然你也负责可执行文件,你可能会弄清楚如何获取传递的参数数量(提示:argc)并在(提示:argv)中读取它们。像这样通过基于行的传递:

<?php

$csvRow = fgetcsv($fh);
if ($csvRow) {
  $escaped = array_map('escapeshellarg', $csvRow);
  exec('/your/thing '. join(' ', $escaped));
}

答案 1 :(得分:0)

我建议将这些数据放在磁盘上,然后在命令行实用程序中加载它 - 它就不那么乱了。但是如果你不能这样做,那么一次只能将它传递给1(未解析)行:

$command = "/path_to_executable/model";
foreach ($fileData as $line) {
  $command .= ' "'.escapeshellarg($line).'"';
}
exec($command);

然后,您可以通过循环argv将数据提取到您的实用程序中,其中argv[0]是第一行,argv[1]是第二行,依此类推。