可能重复:
php exec command (or similar) to not wait for result
exec() waiting for a response in PHP
我有一个调用并运行Matlab脚本的php脚本。 Matlab脚本的结果是一个.png图像,然后我想在php中加载并发送到网页。我的PHP代码是:
$matlabExe = '"C:\\Program Files\\MATLAB\\R2012a\\bin\\matlab.exe"';
$mFile = "'C:\\processSatData.m'";
$combine = '"run(' . $mFile . ');"';
$command = $matlabExe . ' -nodisplay -nosplash -nodesktop -r ' . $combine;
passthru($command);
$im = file_get_contents('C:\\habitat.png');
header('Content-type:image/png');
echo $im;
然而,似乎在发送'passthru'命令之后,php不会等待Matlab脚本完成运行。因此,如果在运行php代码之前图像文件不存在,那么我会收到一条错误消息。
有没有办法让php代码在尝试加载图片文件之前等待Matlab脚本完成运行?
答案 0 :(得分:2)
passthru
不是这里的主要问题..但是我想你很快就得到了你的命令的响应,图像不会立即写入,而是通过第三个过程
file_get_contents
在这个实例中也可能失败,因为..图像可能不会被写入一次或在写入过程中可能导致文件锁定..无论如何你需要确保你有效发送输出前的图像;
set_time_limit(0);
$timeout = 30; // sec
$output = 'C:\\habitat.png';
$matlabExe = '"C:\\Program Files\\MATLAB\\R2012a\\bin\\matlab.exe"';
$mFile = "'C:\\processSatData.m'";
$combine = '"run(' . $mFile . ');"';
$command = $matlabExe . ' -nodisplay -nosplash -nodesktop -r ' . $combine;
try {
if (! @unlink($output) && is_file($output))
throw new Exception("Unable to remove old file");
passthru($command);
$start = time();
while ( true ) {
// Check if file is readable
if (is_file($output) && is_readable($output)) {
$img = @imagecreatefrompng($output);
// Check if Math Lab is has finished writing to image
if ($img !== false) {
header('Content-type:image/png');
imagepng($img);
break;
}
}
// Check Timeout
if ((time() - $start) > $timeout) {
throw new Exception("Timeout Reached");
break;
}
}
} catch ( Exception $e ) {
echo $e->getMessage();
}
答案 1 :(得分:1)
我相信如果您将passthru
更改为exec
,它将按预期工作。你也可以试试这个:
$matlabExe = '"C:\\Program Files\\MATLAB\\R2012a\\bin\\matlab.exe"';
$mFile = "'C:\\processSatData.m'";
$combine = '"run(' . $mFile . ');"';
$command = $matlabExe . ' -nodisplay -nosplash -nodesktop -r ' . $combine;
passthru($command);
// once a second, check for the file, up to 10 seconds
for ($i = 0; $i < 10; $i++) {
sleep(1);
if (false !== ($im = @file_get_contents('C:\\habitat.png'))) {
header('Content-type:image/png');
echo $im;
break;
}
}