2013-10-09 40 views
0

我的設置: Server 2008 R2的 IIS 7.5 PHP 5PHP網頁與參數運行命令行,然後使用輸出

我期待對頁面的一個PHP腳本執行命令行然後使用網頁可以使用的輸出的參數。

我有一個命令行程序,轉換視頻並將其保存到運行該命令的位置,我希望php能夠從網頁執行此操作,然後讓網頁能夠將轉換後的文件把它放在一個嵌入式播放器中觀看?

這甚至可能:-s

+2

**你嘗試過什麼到目前爲止** –

+0

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

+0

[PHP retrieve ex]可能的重複使用[+]參數+表示+ +網頁+可以+然後使用+ ternal程序數據](http://stackoverflow.com/questions/2778122/php-retrieve-external-program-data) – aynber

回答

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> 
0

你正在尋找的功能是exec()

確保您在命令中使用之前逃脫參數:escapeshellarg()

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

,您的命令

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

小心使用'exec'和php。如果使用不當,會變得有害。另外,共享主機(如果您將項目託管在一個主機上)可能會在PHP中完全禁用exec,system和shell命令以防止資源佔用和濫用。 –

+1

如果使用不當,不會有害嗎? – 2013-10-09 19:10:54

+0

的確,即使是安全套也可能有害。 –

0

有可能用PHP。然而,還有更適合的編程語言,如Phyton,Ruby,C++或C#,它們更好地處理後臺任務。

要開展的PHP後臺任務你需要使用類似execsystemshell_execpopen或一些更先進的像fsockopenpcntl_fork

這一切都取決於你的堆棧。有像Gearman這樣的作業服務器需要一些設置,但是使得php中的作業更容易處理,因爲處理由這些服務器處理。

你想達到什麼的一種方法:

  1. 創建一個PHP腳本,轉換和保存視頻

  2. CHMOD 755的文件,以使其可執行在CLI

  3. 在視頻轉換後立即在後臺運行腳本,如下所示:

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命令大致相同,只是修改了一下。

給它一個嘗試,讓我們知道,如果它的工作:-)

這裏有一些資源,值得在此主題的更多信息閱讀: