2

新しいコード:

<?php
exec('"C:\Program Files\TortoiseSVN\bin\svn.exe" update "c:\wamp\www\project"');

これにより、無限ループが発生し、結果は返されません。私は何を間違っていますか?

== 編集 ==

Windows で、PHP を使用してプロジェクトを更新しようとしています。コマンドラインの使用に問題があります。視覚的なフィードバックが必要なので (競合が発生した場合に重要です)、バックグラウンド プロセスとして開始したくありません。これは可能ですか?

私がこれまでに持っているコードは次のとおりです。

<?php
$todo = "cd \"C:\\Program Files\\TortoiseSVN\\bin\\\"";
$todo2 = "START TortoiseProc.exe /command:update /path:\"C:\\wamp\\www\\project\\\" /closeonend:0";

 pclose(popen($todo, "r"));  
 pclose(popen($todo2, "r"));  
4

1 に答える 1

3

execを削除してproc_openを使用します( http://php.net/manual/en/function.proc-open.phpを参照) 。

これは私がすぐに作り上げた例であり、あなたのために働くはずです:

<?php
// setup pipes that you'll use
$descriptorspec = array(
    0 => array("pipe", "r"),    // stdin
    1 => array("pipe", "w"),    // stdout
    2 => array("pipe", "w")     // stderr
);

// call your process
$process = proc_open('"C:\Program Files\TortoiseSVN\bin\svn.exe" update "c:\wamp\www\project"',
                     $descriptorspec,
                     $pipes);

// if process is called, pipe data to variables which can later be processed.
if(is_resource($process)) 
{
    $stdin = stream_get_contents($pipes[0]);
    $stdout = stream_get_contents($pipes[1]);
    $stderr = stream_get_contents($pipes[2]);
    fclose($pipes[0]);  
    fclose($pipes[1]);  
    fclose($pipes[2]);
    $return_value = proc_close($process);   
}

// Now it's up to you what you want to do with the data you've got.
// Remember that this is merely an example, you'll probably want to 
// modify the output handling to your own likings...

header('Content-Type: text/plain; charset=UTF-8');  

// check if there was an error, if not - dump the data
if($return_value === -1)    
{
    echo('The termination status of the process indicates an error.'."\r\n");
}

echo('---------------------------------'."\r\n".'STDIN contains:'."\r\n");
echo($stdin);
echo('---------------------------------'."\r\n".'STDOUTcontains:'."\r\n");
echo($stdout);
echo('---------------------------------'."\r\n".'STDERR contains:'."\r\n");
echo($stderr);

?>

余談:

この線

// call your process
$process = proc_open('"C:\Program Files\TortoiseSVN\bin\svn.exe" update "c:\wamp\www\project"',
                     $descriptorspec,
                     $pipes);

このようにエスケープすることもできます

// call your process
$process = proc_open("\"C:\\Program Files\\TortoiseSVN\\bin\\svn.exe\" update \"c:\\wamp\\www\\project\"",
                     $descriptorspec,
                     $pipes);

これにより、一部のシステムで問題が解決する場合と解決しない場合があり、表記に一重括弧 ( ') とスペース ( ) が含まれています。

于 2013-07-06T15:27:11.560 に答える