PHP exec() return value for background process (linux)

前端 未结 3 1052
南方客
南方客 2020-12-22 04:02

Using PHP on Linux, I\'d like to determine whether a shell command run using exec() was successfully executed. I\'m using the return_var parameter to check for a successful

相关标签:
3条回答
  • 2020-12-22 04:56

    My guess is that what you are trying to do is not directly possible. By backgrounding the process, you are letting your PHP script continue (and potentially exit) before a result exists.

    A work around is to have a second PHP (or Bash/etc) script that just does the command execution and writes the result to a temp file.

    The main script would be something like:

    $resultFile = '/tmp/result001';
    touch($resultFile);
    exec('php command_runner.php '.escapeshellarg($resultFile).' > /dev/null 2>&1 &');
    
    // do other stuff...    
    
    // Sometime later when you want to check the result...
    while (!strlen(file_get_contents($resultFile))) {
        sleep(5);
    }
    $result = intval(file_get_contents($resultFile));
    unlink($resultFile);
    

    And the command_runner.php would look like:

    $outputFile = $argv[0];
    exec('badcommand > /dev/null 2>&1', $output, $result);
    file_put_contents($outputFile, $result);
    

    Its not pretty, and there is certainly room for adding robustness and handling concurrent executions, but the general idea should work.

    0 讨论(0)
  • 2020-12-22 05:06

    Just my 2 cents, how about using the || or && bash operator?

    exec('ls && touch /tmp/res_ok || touch /tmp/res_bad');
    

    And then check for file existence.

    0 讨论(0)
  • 2020-12-22 05:09

    Not using the exec() method. When you send a process to the background, it will return 0 to the exec call and php will continue execution, there's no way to retrieve the final result.

    pcntl_fork() however will fork your application, so you can run exec() in the child process and leave it waiting until it finishes. Then exit() with the status the exec call returned. In the parent process you can access that return code with pcntl_waitpid()

    0 讨论(0)
提交回复
热议问题