Utilisez cette fonction pour exécuter votre programme en arrière-plan. Il est multiplateforme et entièrement personnalisable.
<?php
function startBackgroundProcess(
$command,
$stdin = null,
$redirectStdout = null,
$redirectStderr = null,
$cwd = null,
$env = null,
$other_options = null
) {
$descriptorspec = array(
1 => is_string($redirectStdout) ? array('file', $redirectStdout, 'w') : array('pipe', 'w'),
2 => is_string($redirectStderr) ? array('file', $redirectStderr, 'w') : array('pipe', 'w'),
);
if (is_string($stdin)) {
$descriptorspec[0] = array('pipe', 'r');
}
$proc = proc_open($command, $descriptorspec, $pipes, $cwd, $env, $other_options);
if (!is_resource($proc)) {
throw new \Exception("Failed to start background process by command: $command");
}
if (is_string($stdin)) {
fwrite($pipes[0], $stdin);
fclose($pipes[0]);
}
if (!is_string($redirectStdout)) {
fclose($pipes[1]);
}
if (!is_string($redirectStderr)) {
fclose($pipes[2]);
}
return $proc;
}
Notez qu'après le démarrage de la commande, par défaut, cette fonction ferme les stdin et stdout du processus en cours d'exécution. Vous pouvez rediriger la sortie du processus dans un fichier via les arguments $ redirectStdout et $ redirectStderr.
Remarque pour les utilisateurs de Windows:
vous ne pouvez pas rediriger stdout / stderr vers nul
de la manière suivante:
startBackgroundProcess('ping yandex.com', null, 'nul', 'nul');
Cependant, vous pouvez le faire:
startBackgroundProcess('ping yandex.com >nul 2>&1');
Notes pour les utilisateurs de * nix:
1) Utilisez la commande shell exécutable si vous voulez obtenir le PID réel:
$proc = startBackgroundProcess('exec ping yandex.com -c 15', null, '/dev/null', '/dev/null');
print_r(proc_get_status($proc));
2) Utilisez l'argument $ stdin si vous souhaitez passer des données à l'entrée de votre programme:
startBackgroundProcess('cat > input.txt', "Hello world!\n");