PHP网页运行带参数的命令行并使用输出

时间:2013-10-09 19:02:51

标签: php

我的设置: Server 2008 R2 IIS 7.5 PHP 5

我希望在一个执行命令行exe的页面上有一个PHP脚本,其中的参数可以让网页使用输出。

我有一个命令行程序转换视频并将其保存到运行命令的位置,我希望php从网页上执行此操作,然后让网页能够获取转换后的文件并放入它在嵌入式播放器中观看?

这是否可能:-s

3 个答案:

答案 0 :(得分:0)

您正在寻找的功能是exec()

在命令中使用它们之前,请确保转义参数:escapeshellarg()

$param = $_POST["param"];
// some sort of sanitizing happens here
...

然后你的命令

$output  = exec("videoconverter ".escapeshellarg($param));

答案 1 :(得分:0)

可以使用PHP。但是,有更适合编程的语言,如Phyton,Ruby,C ++或C#,可以更好地应对后台任务。

要在PHP中执行后台任务,您需要使用类似execsystemshell_execpopen或更高级的内容,例如{{3} }和fsockopen

这完全取决于你的筹码。像Gearman这样的作业服务器需要一些设置,但是当处理由这些服务器处理时,可以更容易地处理php中的作业。

实现目标的方法:

  1. 创建一个转换并保存视频的php脚本

  2. 使用755 CHMOD文件使其在CLI中可执行

  3. 视频转换后,请在后台运行脚本,如下所示:

  4. pclose(popen('start "Process" /B "C:\PHP\php-cgi.exe" -f video_converter.php 2>&1 &', 'r'));

    "Process"是后台cli提示符的标题。需要防止出现问题。 /B在没有提示窗口的情况下启动命令。将使用2>&1 &来抑制脚本的输出,以防止中断。

    但是,我让脚本将convertor-progress写入(例如file_put_contents)文件,并在播放器所在的网站上使用ajax(javascript / jquery)进行监听。一旦达到100%,就会返回视频文件路径,并且javascript会更新并启动嵌入式播放器。

    对于会导致转换时间过长的大型视频文件,您可以在视频准备好观看后立即向用户发送电子邮件 - 以防您将此应用程序提供给公众。

    注意:该命令特定于Windows服务器。非Windows操作系统,如* NIX,Linux和Sun,使用以下命令:

    shell_exec(sprintf('nohup /usr/bin/env php -q -f %s > /dev/null 2>&1 & echo $!', 'path/to/video_converter.php'));
    

    pcntl_fork没有挂断,并保持后台进程运行直到终止。其余的与windows命令大致相同,只是修改了一点。

    尝试一下,让我们知道它是否有效: - )

    以下是一些值得阅读的资源,有关此主题的更多信息:

答案 2 :(得分:0)

崩溃了!!

感谢您的帮助,但设法让它发挥作用:)

我使用了一个命令行工具,我将后面的命令传递给了php网页。程序从给定的URL(这是从表单的POST中拉出的变量)下载视频,并将下载的视频放回到嵌入式HTLM 5视频元素中,该视频元素具有后备闪存。

我创建了if语句来为某些浏览器提取mp4而为其他浏览器提供webm因此它应该始终有效,而旧版浏览器的flash不支持该标记。

很好地工作:)

参考代码: -

<?php
$input = $_POST['url'];
function browser_info($agent=null) {
  $known = array('msie', 'firefox', 'safari', 'webkit', 'opera', 'netscape',
    'konqueror', 'gecko');
  $agent = strtolower($agent ? $agent : $_SERVER['HTTP_USER_AGENT']);
  $pattern = '#(?<browser>' . join('|', $known) .
    ')[/ ]+(?<version>[0-9]+(?:\.[0-9]+)?)#';
  if (!preg_match_all($pattern, $agent, $matches)) return array();
  $i = count($matches['browser'])-1;
  return array($matches['browser'][$i] => $matches['version'][$i]);
};
$ua = browser_info();

if($ua['firefox']):
$filename = `C:\Windows\dl.exe -e -f 45/44/43/35/34/5 $input`;
$download = `C:\Windows\dl.exe -o "%(title)s.%(ext)s" -f 45/44/43/35/34/5 $input`;
$output = `C:\Windows\dl.exe -g -f 45/44/43/35/34/5 $input`;

else:
$filename = `C:\Windows\dl.exe -e -f 22/18/35/34/5 $input`;
$download = `C:\Windows\dl.exe -o "%(title)s.%(ext)s" -f 22/18/35/34/5 $input`;
$output = `C:\Windows\dl.exe -g -f 22/18/35/34/5 $input`;

endif;
?>
<html>
<head>
<script type="text/javascript">
window.onunload=function(){
window.open('/watch/close.php', '_blank', '');
window.close();
};
</script>
<link rel="stylesheet" href="../css/navigation.css" type="text/css" media="screen" />
<link rel="stylesheet" href="index.css" type="text/css" media="screen" />
</head>
<body>
<ul class="t1">
<li class="t2"><a href="/">Home</a></li>
<li class="t2 t3"><a href="../Video">Videos</a></li>
<li class="t2 t4"><a href="/Downloads">Downloads</a></li>
<li class="t2 t8"><a href="/web">Proxy</a></li>
<li class="t2 t5"><a href="../Forsale">For Sale</a></li>
<li class="t2 t6"><a href="/owa">E-mail</a></li>
<li class="t2 t7"><a href="/CV">My CV</a></li>
</ul>
<br />
<div class="white">
<video controls id="vid" width="800" height="450" autoplay="autoplay" preload="none" poster="../Images/loading.jpg">
<source src="<?php echo $filename; ?>.mp4">
<source src="<?php echo $filename; ?>.webm" type="video/webm; codecs=&quot;vp8, vorbis&quot;">
<object>
<embed
src="player.swf" 
width="640" height="360" 
bgcolor="000000" 
allowscriptaccess="always" 
allowfullscreen="true" 
type="application/x-shockwave-flash" 
flashvars="width=640&height=360&type=video&fullscreen=true&volume=100&autostart=true&file='<?php echo $filename; ?>.flv'" 
/>
</object>
</video>
</div>
<div class="white">
<a onmouseover="self.status='Downloadable file'; return true" onmouseout="self.status=''" onclick="alert('Please right click and use \'Save Target/Link As\'.'); return false"  href="<?php echo $output; ?>">Download this video</a>
</div>
</body>
</html>