我的设置: Server 2008 R2 IIS 7.5 PHP 5
我希望在一个执行命令行exe的页面上有一个PHP脚本,其中的参数可以让网页使用输出。
我有一个命令行程序转换视频并将其保存到运行命令的位置,我希望php从网页上执行此操作,然后让网页能够获取转换后的文件并放入它在嵌入式播放器中观看?
这是否可能:-s
答案 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中执行后台任务,您需要使用类似exec
,system
,shell_exec
,popen
或更高级的内容,例如{{3} }和fsockopen
。
这完全取决于你的筹码。像Gearman
这样的作业服务器需要一些设置,但是当处理由这些服务器处理时,可以更容易地处理php中的作业。
实现目标的方法:
创建一个转换并保存视频的php脚本
使用755 CHMOD文件使其在CLI中可执行
视频转换后,请在后台运行脚本,如下所示:
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="vp8, vorbis"">
<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>