2013-11-27 5 views
0

Я пробовал NUMEROUS методы, чтобы запустить фоновый php-скрипт из другого php-скрипта. Мне нужно создать zip-файл файлов базы данных для загрузки. Я настроил его для мгновенной загрузки для отдельных файлов, но если файлы нужно закрепить, я хочу запустить фоновый процесс, который отправит ссылку на zip-файл. Процесс работает, но исходный сценарий все еще ждет завершения процесса. Я пробовал следующие методы, и, как я уже сказал, они работают, но они не пойдут на задний план. Он заставил меня ждать более восьми минут для определенных случаев (большие файлы ZIP), и никто не будет ждать этого.PHP - фоновые команды Windows работают, но все еще ждут завершения фонового процесса

print `php -f zipfiles7.php | at now`; 

$WshShell = new COM("WScript.Shell"); 
$oExec = $WshShell->Run("C:\wamp\bin\php\php5.4.3\php.exe -f C:/wamp/www/zipfiles7.php", 0, false); 

$WshShell = new COM("WScript.Shell"); 
$oExec = $WshShell->Run("cmd /c C:\wamp\bin\php\php5.4.3\php.exe -f C:/wamp/www/zipfiles7.php", 3, false); 

$exe = "C:\wamp\bin\php\php5.4.3\php.exe"; 
$args = "C:\wamp\www\zipfiles7.php"; 
pclose(popen("start \"bla\" \"" . $exe . "\" " . escapeshellarg($args), "r")); 

$cmd = "php-win.exe zipfiles7.php"; 
$cmd = "start /B php-win.exe zipfiles7.php"; 
$PID = shell_exec("nohup $cmd > test.txt 2>&1"); 

exec("Psexec.exe -i -d php.exe zipfiles7.php"); 

$cmd = "C:\wamp\bin\php\php5.4.3\php-win.exe -f C:\wamp\www\zipfiles7.php"; 
function _exec($cmd) 
{ 
    $WshShell = new COM("WScript.Shell"); 
    $oExec = $WshShell->Run($cmd, 0,false); 
    echo $cmd; 
    return $oExec == 0 ? true : false; 
}_exec("C:\wamp\bin\php\php5.4.3\php-win.exe -f C:\wamp\www\zipfiles7.php"); 

$cmd = "C:\wamp\bin\php\php5.4.3\php-win.exe -f C:\wamp\www\zipfiles7.php"; 
pclose(popen('start /B ' . $cmd, 'r')); 

$cmd = "C:\wamp\bin\php\php5.4.3\php-win.exe -f C:\wamp\www\zipfiles7.php"; 
pclose(popen("start /B " . $cmd, "r")); 

system("cmd /c php zipfiles7.php > test.txt 2>&1"); 

exec('psexec start /B -d php.exe zipfiles7.php > test.txt 2>&1'); 

exec('psexec -d php.exe zipfiles7.php > test.txt 2>&1'); 

exec('psexec -d php.exe zipfiles7.php'); 

$cmd = "C:\wamp\bin\php\php5.4.3\php-win.exe -f C:\wamp\www\zipfiles7.php"; 
exec(sprintf("%s > %s 2>&1 & echo $! >> %s", $cmd, "test.txt", "php_error.log")); 

pclose(popen('start /B php zipfiles7.php > test.txt 2>&1', 'r')); 

pclose(popen("start /B C:\wamp\bin\php\php5.4.3\php-win.exe -f C:\wamp\www\zipfiles7.php", "r")); 

shell_exec('start /B "C:\wamp\bin\php\php5.4.3\php.exe -f C:\wamp\www\zipfiles7.php > test.txt 2>&1"'); 

exec('START /B "C:\wamp\bin\php\php5.4.3\php.exe -f C:\wamp\www\zipfiles7.php"', $output); 

passthru("start /B c:/wamp/bin/php/php5.4.3/php-win c:/wamp/www/zipfiles7.php > test.txt 2>&1"); 

exec("php.exe -f zipfiles7.php > test.txt 2>&1"); 

exec("php-win -f zipfiles7.php > /dell/null 2>/dev/null &", $output); 

exec("start /B php zipfiles7.php > test.txt 2>&1"); 

exec("start php.exe -f zipfiles7.php > test.txt 2>&1"); 

$WshShell = new COM("WScript.Shell"); 
$oExec = $WshShell->Run("cmd /C C:\wamp\www\batch.bat", 0, false); 

exec("CHP.exe C:\wamp\www\batch.bat > test.txt 2>&1"); 

exec("start /min php zipfiles7.php > test.txt 2>&1"); 

shell_exec('call "cmd /c batch.bat"'); 

batch.bat

@echo off 
"start /B bg C:\wamp\bin\php\php5.4.3\php.exe -f C:\wamp\www\zipfiles7.php > test.txt" 

Дополнительные методы пытались:

$descriptorspec = array(
     0 => array("pipe", "r"), // stdin is a pipe that the child will read from 
     1 => array("pipe", "w"), // stdout is a pipe that the child will write to 
     2 => array("pipe", "r") // stderr is a file to write to 
    ); 

    $cmd = "start /B php.exe zipfiles7.php"; 
    $process = proc_open($cmd, $descriptorspec, $pipes, null, null); 
    if (is_resource($process)) 
    { .... 

// buffer all upcoming output 
ob_start(); 
// get the size of the output 
$size = ob_get_length(); 

// send headers to tell the browser to close the connection 
header("Content-Length: $size"); 
header('Connection: close'); 

// flush all output 
ob_end_flush(); 
ob_flush(); 
flush(); 

// close current session 
if (session_id()) session_write_close(); 
    exec("start /B php zipfiles7.php > test.txt 2>&1"); 

или

shell_exec('psexec -s -d php.exe zipfiles7.php'); 

или

$runCommand = 'php -q zipfiles7.php'; 
    $WshShell = new COM(“WScript.Shell”); 
    $oExec = $WshShell->Run($runCommand, 7, false); 

Даже пытается JavaScript

function background(){ 
var url = "C:\wamp\www\zipfiles7.php";// No question mark needed 

xmlReq=new XMLHttpRequest(); 

xmlReq.open("POST",url,true); 
xmlReq.send(); 
console.log("done"); 
} 
echo '<script type="text/javascript">', 'background();', '</script>'; 

или

function background(){ 
var str = "Success"; 
var url = "C:\wamp\www\zipfiles7.php"; 

xmlReq=new XMLHttpRequest(); 

xmlReq.open("POST",url,true); 
xmlReq.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
xmlReq.setRequestHeader("Content-length", str.length); 
xmlReq.setRequestHeader("Connection", "close"); 
xmlReq.send(); 
console.log("done"); 
} 

Даже Аякс не собирается на задний план!

function background() 
{ 
$.ajax(
    { 
      type: "POST", 
      url: "zipfiles7.php", 
      data: data, // data to send to above script page if any 
      cache: false, 

      success: function(response) 
      { 
       alert('Succes'); 
      } 
    }); 
} 

Пожалуйста, помогите мне понять, почему процесс не идет на задний план. Заранее спасибо.

ответ

0

Когда вы вызываете exec php завершает выполнение текущего скрипта, пока не получит возвращаемое значение из оболочки (из exec). Поэтому в этом случае php не будет продолжать выполнение скрипта до тех пор, пока файл не будет завершен.

From the php exec() documentation page:

Если программа запускается с помощью этой функции, для того, чтобы на него продолжают работать в фоновом режиме, выход программы должны быть перенаправлен в файл или другой поток вывода. В противном случае заставит PHP зависать до завершения программы.

Что касается реализации этого правильного пути, я на самом деле никогда не делал этого сам, поэтому не могу точно сказать, но, надеюсь, это указывает на то, что вы в правильном направлении.

Edit: Upon searching a little further I found this stackoverflow answer which seems like it applies to your current question.

+0

Я попытался перенаправить вывод в файл, но он все еще висит. Я слышал смешанные отзывы об использовании exec с окнами. Некоторые говорят, что это не работает вообще, а некоторые не согласны. Но ни один из методов, которые я пытаюсь работать (с зависанием). – Monkeybutt

+0

Тогда я не слишком уверен, что вызывает проблему. Если у вас есть доступ к среде разработки linux, вы можете увидеть, правильно ли работает ваш скрипт в среде linux? (или, если вы этого не сделаете, вы можете загрузить дистрибутив Linux и установить его) – echochamber

+0

Я буду изучать тестирование в среде linux. И у меня нет доступа, так что спасибо за предложение создать свою собственную.Я попробовал 'exec (sprintf ('/ usr/bin/php ...' метод также без успеха. – Monkeybutt