2010-01-14 26 views
6

Tôi đang tìm cách tốt nhất, hoặc bất kỳ cách nào thực sự để bắt đầu một quá trình từ php trong nền để tôi có thể giết nó sau này trong kịch bản.PHP trên máy tính windows; Bắt đầu quá trình trong nền

Hiện tại, tôi đang sử dụng: shell_exec ($ Command); Vấn đề với điều này là nó chờ chương trình đóng lại.

Tôi muốn một cái gì đó sẽ có tác dụng tương tự như nohup khi tôi thực thi lệnh trình bao. Điều này sẽ cho phép tôi chạy quá trình trong nền, để sau này trong kịch bản nó có thể được đóng lại. Tôi cần phải đóng nó bởi vì kịch bản này sẽ chạy một cách thường xuyên và chương trình không thể mở khi điều này chạy.

Tôi đã nghĩ đến việc tạo tệp .bat để chạy lệnh trong nền, nhưng ngay cả khi đó, làm cách nào để tôi xóa quy trình sau?

Mã Tôi đã nhìn thấy cho linux là:

$PID = shell_exec("nohup $Command > /dev/null & echo $!"); 
// Later on to kill it 
exec("kill -KILL $PID"); 

EDIT: Hóa ra tôi không cần phải giết chết quá trình

+0

Vậy giải pháp là gì? – Aramil

Trả lời

4

Trợ giúp này function from the PHP Manual có giúp được không?

function runAsynchronously($path,$arguments) { 
    $WshShell = new COM("WScript.Shell"); 
    $oShellLink = $WshShell->CreateShortcut("temp.lnk"); 
    $oShellLink->TargetPath = $path; 
    $oShellLink->Arguments = $arguments; 
    $oShellLink->WorkingDirectory = dirname($path); 
    $oShellLink->WindowStyle = 1; 
    $oShellLink->Save(); 
    $oExec = $WshShell->Run("temp.lnk", 7, false); 
    unset($WshShell,$oShellLink,$oExec); 
    unlink("temp.lnk"); 
} 
+0

Tôi đã sử dụng (gần như) điều này để khởi chạy một tệp hàng loạt và nó hoạt động hoàn hảo ngay bây giờ. –

+0

Xin lỗi vì đã đào ra ngôi mộ cổ này. Tôi m bằng cách sử dụng cùng một mã để thực hiện chương trình bên ngoài tôi thực hiện trong C#. Trình duyệt/tập lệnh php hoặc apache chỉ bị treo, nếu ứng dụng C# này ném một ngoại lệ. Có bất kỳ công việc xung quanh cho điều này? – WatsMyName

+0

@LoVeSmItH: Không có ý kiến ​​người đàn ông. = \ –

1

Từ hướng dẫn php cho exec:

Nếu chương trình được bắt đầu bằng chức năng này, để chương trình tiếp tục chạy ở chế độ nền, đầu ra của chương trình phải được chuyển hướng đến tệp hoặc đầu ra khác suối. Không làm như vậy sẽ khiến PHP bị treo cho đến khi chương trình kết thúc.

tức là ống đầu ra vào một tập tin và php sẽ không chờ cho nó:

exec('myprog > output.txt'); 

Từ bộ nhớ, tôi tin rằng có một nhân vật điều khiển mà bạn có thể thêm vào trước (giống như bạn làm với @) với nhóm lệnh exec cũng ngăn chặn việc thực hiện tạm dừng - không thể nhớ nó là gì.

Chỉnh sửa Tìm thấy! Trên unix, các chương trình được thực thi với & được thêm vào trước sẽ chạy ở chế độ nền. Xin lỗi, không giúp bạn nhiều.

+0

Tôi đã kết thúc bằng cách sử dụng tệp lô và thực hiện: hệ thống ("cmd/c C: [đường dẫn đến tệp]"); Điều đó giúp kịch bản diễn ra. Bất kỳ ý tưởng về làm thế nào để giết chết quá trình? Điều này thực sự mở ra Adobe Reader, và tôi vẫn cần một cách để đóng nó trước khi kịch bản chạy lại. –

+0

Nevermind, hóa ra tôi không cần phải giết quá trình. Tôi có thể để nó chạy. –

+1

Tôi hiện đang cố gắng điều này trên một hệ thống cửa sổ và nó vẫn chờ đợi cho kịch bản để kết thúc trong cửa sổ trình duyệt bất kể thực tế nó được xuất ra một tập tin. Bất kỳ suy nghĩ về điều này? –

8

shell_exec('start /B "C:\Path\to\program.exe"');

Tham số /B là chìa khóa ở đây.

Tôi dường như không thể tìm thấy nơi tôi tìm thấy điều này nữa. Nhưng điều này làm việc cho tôi.

+0

Tôi không biết về/B. Rất tiện dụng, cảm ơn. –

+0

Vì mục đích hoàn chỉnh, tôi để lại liên kết đến tài liệu về lệnh bắt đầu tại đây: https://technet.microsoft.com/en-us/library/cc770297(v=ws.11).aspx – zinky

2

Cố gắng để đạt được cùng trên một máy chủ Windows 2000 với PHP 5.2.8.

Không có giải pháp nào phù hợp với tôi. PHP tiếp tục chờ đợi phản hồi.

Tìm thấy giải pháp cho là:

$cmd = "E:\PHP_folder_path\php.exe E:\some_folder_path\backgroundProcess.php"; 
pclose(popen("start /B ". $cmd, "a")); // mode = "a" since I had some logs to edit 
1

Trên Windows tôi 10 và Windows Server 2012 máy móc, giải pháp duy nhất mà làm việc đáng tin cậy trong pclose/popen là để gọi lệnh Start-Process powershell, như trong:

pclose(popen('powershell.exe "Start-Process foo.bat -WindowStyle Hidden"','r')); 

Hoặc một cách chi tiết hơn nếu bạn muốn cung cấp luận cứ và chuyển hướng kết quả đầu ra:

pclose(popen('powershell.exe "Start-Process foo.bat 
      -ArgumentList \'bar\',\'bat\' 
      -WindowStyle Hidden 
      -RedirectStandardOutput \'.\\console.out\' 
      -RedirectStandardError \'.\\console.err\'"','r')); 
Các vấn đề liên quan