我有一个PHP脚本(齿轮工人)调用Rscript(带状态进度条),运行正常,但我不知道程序的状态。我的问题是否有可能将运行状态返回到PHP脚本。
<?php
print_r(posix_getpwuid(getmyuid()));
print_r(pathinfo($YOUR_PATH));
exec(" RScript ~/dynamic.R 'select field1, field2 from table where 1=1 limit 100' ");
?>
所以dynamic.R执行100行的som数据操作(我有进度条的plyr功能)但是没有显示gearman进度条,因此想要显示gearman的进度。
希望我的问题有道理
问候,Savi
答案 0 :(得分:1)
exec()
执行此操作,但如果没有首先找到其PID,则几乎不可能与该过程协调。这是proc_open()
的用途。 popen()
可能会有效,但我猜测进度条会写入stderr
,这就是我在这里嘲笑的。
这是一个小程序,应该是一个适合你的例子:
<?php
$descriptors = array(
0 => array("pipe", "r"),
1 => array("pipe", "w"),
2 => array("pipe", "w")
);
$process = proc_open( "/usr/bin/env ruby ./rlike.rb 1 10", $descriptors, $pipes, getcwd() );
if( is_resource($process) ){
echo "ran process\n";
do{
$status = proc_get_status($process);
if(! $status["running"]) break;
fflush($pipes[2]);
$progressbar = fread( $pipes[2],1 );
if( $progressbar == "\r" ) echo "\n";
else echo "$progressbar";
}while( $status["running"] );
fclose($pipes[0]);
fclose($pipes[2]);
echo "\nProcess complete. \n";
print_r( $status );
}else{
echo "Failed to run process.\n";
}
输出如下:
ran process
|> | 00%
|==> | 10%
|====> | 20%
|======> | 30%
|========> | 40%
|==========> | 50%
|============> | 60%
|==============> | 70%
|================> | 80%
|==================> | 90%
|====================>| 100%
Process complete.
Array
(
[command] => /usr/bin/env ruby ./rlike.rb 1 10
[pid] => 60306
[running] =>
[signaled] =>
[stopped] =>
[exitcode] => 0
[termsig] => 0
[stopsig] => 0
)
最后,编写进度条的ruby程序如下所示(看来,ruby语法的真棒:) :):
wait = ARGV[1].to_f || 10.0
repeat = ARGV[2].to_i
repeat = 10 if !repeat or repeat == 0
wait = 1 if !wait or wait == 0
barlen = 20
(repeat+1).times do |t|
curlen = ( repeat == 0 ? 0 : ( t*barlen/repeat ) )
bar = ( "%#{curlen}s>" % "" ).gsub( " ", "=")
$stderr.print sprintf("\r|%- #{barlen+1}s| %3.2d%% ", bar, 100*t/repeat )
$stderr.flush
sleep 1 unless t == repeat
end
从这个例子中,你应该能够得到任何你喜欢的东西。警告:我每次都要重写整个进度条并使用\r
返回到行的开头 - 但是根据Rscript进度条的工作原理,情况可能并非如此。
答案 1 :(得分:0)
您需要将变量传递给exec
才能获得返回值。来自文档:
string exec ( string $command [, array &$output [, int &$return_var ]] )
return_var
如果return_var参数与。一起出现 输出参数,然后执行命令的返回状态将 被写入这个变量。
因此,您的代码可能如下所示:
exec(" RScript ~/dynamic.R 'select field1, field2 from table where 1=1 limit 100' ", $output, $return_var);
在上面,$return_var
将具有您的命令的返回状态。