我的设置:服务器 2008 R2 IIS 7.5 PHP 5
我希望在其中一个页面上有一个 PHP 脚本,该脚本执行带有参数的命令行 exe,然后网页可以使用其输出。
我有一个命令行程序,可以转换视频并将其保存到运行命令的位置,我希望 php 从网页中执行此操作,然后让网页能够获取转换后的文件并将其放入嵌入式播放器观看??
这是否可能:-s
我的设置:服务器 2008 R2 IIS 7.5 PHP 5
我希望在其中一个页面上有一个 PHP 脚本,该脚本执行带有参数的命令行 exe,然后网页可以使用其输出。
我有一个命令行程序,可以转换视频并将其保存到运行命令的位置,我希望 php 从网页中执行此操作,然后让网页能够获取转换后的文件并将其放入嵌入式播放器观看??
这是否可能:-s
您正在寻找的功能是exec()。
确保在命令中使用参数之前对它们进行转义:escapeshellarg()
$param = $_POST["param"];
// some sort of sanitizing happens here
...
然后你的命令
$output = exec("videoconverter ".escapeshellarg($param));
使用 PHP 是可能的。但是,还有更适合的编程语言,如 Phyton、Ruby、C++ 或 C#,它们可以更好地处理后台任务。
要在 PHP 中执行后台任务,您需要使用类似exec
、system
、或更高级的东西(如shell_exec
和)。popen
fsockopen
pcntl_fork
这一切都取决于你的堆栈。有些作业服务器Gearman
需要一些设置,但由于处理由此类服务器处理,因此在 php 中处理作业更容易。
实现您想要实现的目标的方法:
创建一个转换和保存视频的 php 脚本
使用 755 对文件进行 CHMOD 以使其在 CLI 中可执行
转换视频后立即在后台运行脚本,如下所示:
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命令差不多,只是稍微修改了一下。
试一试,让我们知道它是否有效:-)
以下是一些值得阅读的资源,其中包含有关此主题的更多信息:
破解它!
感谢您的帮助,但设法让它工作:)
我使用了一个命令行工具,我在反引号中将一个命令传递给了 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="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>