0

我的设置:服务器 2008 R2 IIS 7.5 PHP 5

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

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

这是否可能:-s

4

3 回答 3

0

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

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

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

然后你的命令

$output  = exec("videoconverter ".escapeshellarg($param));
于 2013-10-09T19:05:57.893 回答
0

使用 PHP 是可能的。但是,还有更适合的编程语言,如 Phyton、Ruby、C++ 或 C#,它们可以更好地处理后台任务。

要在 PHP 中执行后台任务,您需要使用类似execsystem、或更高级的东西(如shell_exec和)。popenfsockopenpcntl_fork

这一切都取决于你的堆栈。有些作业服务器Gearman需要一些设置,但由于处理由此类服务器处理,因此在 php 中处理作业更容易。

实现您想要实现的目标的方法:

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

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

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

pclose(popen('开始 "进程" /B "C:\PHP\php-cgi.exe" -f video_converter.php 2>&1 &', 'r'));

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

但是,我会让脚本将转换器进度写入(例如 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'));

nohup没有挂断,并保持后台进程运行,直到它终止。其余的和windows命令差不多,只是稍微修改了一下。

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

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

于 2013-10-09T20:09:03.233 回答
0

破解它!

感谢您的帮助,但设法让它工作:)

我使用了一个命令行工具,我在反引号中将一个命令传递给了 php 网页。让程序从给定的 url(这是从表单的 POST 中提取的变量)下载视频,并将下载的视频放回具有回退到 flash 的嵌入式 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>
于 2013-10-11T23:33:32.620 回答