我的設置: Server 2008 R2的 IIS 7.5 PHP 5PHP網頁與參數運行命令行,然後使用輸出
我期待對頁面的一個PHP腳本執行命令行然後使用網頁可以使用的輸出的參數。
我有一個命令行程序,轉換視頻並將其保存到運行該命令的位置,我希望php能夠從網頁執行此操作,然後讓網頁能夠將轉換後的文件把它放在一個嵌入式播放器中觀看?
這甚至可能:-s
我的設置: Server 2008 R2的 IIS 7.5 PHP 5PHP網頁與參數運行命令行,然後使用輸出
我期待對頁面的一個PHP腳本執行命令行然後使用網頁可以使用的輸出的參數。
我有一個命令行程序,轉換視頻並將其保存到運行該命令的位置,我希望php能夠從網頁執行此操作,然後讓網頁能夠將轉換後的文件把它放在一個嵌入式播放器中觀看?
這甚至可能:-s
裂開了!
感謝您的幫助,但設法得到它的工作:)
我用了一個命令行工具,我通過蜱中。在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>
你正在尋找的功能是exec()。
確保您在命令中使用之前逃脫參數:escapeshellarg()
$param = $_POST["param"];
// some sort of sanitizing happens here
...
,您的命令
$output = exec("videoconverter ".escapeshellarg($param));
小心使用'exec'和php。如果使用不當,會變得有害。另外,共享主機(如果您將項目託管在一個主機上)可能會在PHP中完全禁用exec,system和shell命令以防止資源佔用和濫用。 –
如果使用不當,不會有害嗎? – 2013-10-09 19:10:54
的確,即使是安全套也可能有害。 –
有可能用PHP。然而,還有更適合的編程語言,如Phyton,Ruby,C++或C#,它們更好地處理後臺任務。
要開展的PHP後臺任務你需要使用類似exec
,system
,shell_exec
,popen
或一些更先進的像fsockopen
和pcntl_fork
。
這一切都取決於你的堆棧。有像Gearman
這樣的作業服務器需要一些設置,但是使得php中的作業更容易處理,因爲處理由這些服務器處理。
你想達到什麼的一種方法:
創建一個PHP腳本,轉換和保存視頻
CHMOD 755的文件,以使其可執行在CLI
在視頻轉換後立即在後臺運行腳本,如下所示:
pclose(popen('start "Process" /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和太陽的使用下面的命令:
shell_exec(sprintf('nohup /usr/bin/env php -q -f %s > /dev/null 2>&1 & echo $!', 'path/to/video_converter.php'));
nohup
沒有掛斷,保持後臺進程運行,直到它的終止。其餘的與windows命令大致相同,只是修改了一下。
給它一個嘗試,讓我們知道,如果它的工作:-)
這裏有一些資源,值得在此主題的更多信息閱讀:
**你嘗試過什麼到目前爲止** –
https://www.google.com/search?q=I 「M +找+到+擁有+ A + PHP +腳本+上+一個+ +中+網頁+是+執行+ A +指令+行+ EXE +與+參數+是+中+網頁+能+再+應用+的+輸出+&OQ =我+找+到+擁有+ A + PHP +腳本+上+中+網頁+是+執行+ A +指令+行+ EXE +與+一個+ &aqs = chrome..69i57.1766j0j8&sourceid = chrome&espvd = 210&es_sm = 93&ie = UTF-8 – Sebas
[PHP retrieve ex]可能的重複使用[+]參數+表示+ +網頁+可以+然後使用+ ternal程序數據](http://stackoverflow.com/questions/2778122/php-retrieve-external-program-data) – aynber