我想知道如何将文件的内容(在我的情况下为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文件访问网页会发生什么,他们是否会相互覆盖?
我想必须有一个更合适的方法来做到这一点,我还没弄明白。任何的想法?谢谢!
答案 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]
是第二行,依此类推。