A routine that runs processes in the background:
class Background
{
/*
$cmd -> A linha de comando a executar.
$opt -> Opção de parâmetros para o ambiente onde executa o script.
*/
public static function Call($cmd, $opt = 'start')
{
if (stripos(php_uname('s'), 'windows') !== false) {
/*
Condições de parâmetros para ambiente Windows.
*/
switch ($opt) {
default:
case 'start':
$prefix = 'start /B '; // Esse aqui é o padrão, pois é compatível com as versões mais recentes do Windows.
$sufix = '';
break;
case 'nul':
$prefix = '';
$sufix = ' > NUL 2> NUL';
break;
}
} else {
/*
Opções para ambiente *nix. (isso inclui os-x)
Normalmente o sufixo ' &' é compatível com diversas distribuições Linux. Esse parâmetro diz ao sistema operacional executar em background.
*/
switch ($opt) {
default:
case '&':
$prefix = '';
$sufix = ' &';
break;
case 'dev-null':
$prefix = '';
$sufix = ' > /dev/null 2>/dev/null &';
break;
}
}
exec(sprintf('%s%s%s', $prefix, $cmd, $sufix));
return null;
}
}
define('PHP_PATH', '/local/do/binario/php');
echo 'start '.microtime(true);
Background::Call(PHP_PATH.' "/local/de/um/arquivo.php"');
Background::Call(PHP_PATH.' "/local/de/um/arquivo.php"');
Background::Call(PHP_PATH.' "/local/de/um/arquivo.php"');
echo PHP_EOL.'end '.microtime(true);
file.php
<?php
/*
Fecha o output, ou seja, faz com que o script que invocou, não fique esperando por uma resposta.
*/
fclose(STDOUT);
/*
Daqui em diante, pode fazer o que bem entender.
Claro, esteja ciente de que tudo aqui está sendo executado em ambiente CLI (Command Line Interface).
Vamos fazer uma simulação e testar se está funcionando.
*/
file_put_contents('background.txt', 'start '.microtime(true).PHP_EOL, FILE_APPEND);
sleep(5); // espera 5 segundos
file_put_contents(BASE_DIR.'background.txt', 'end '.microtime(true).PHP_EOL, FILE_APPEND);
About the asynchronous execution routine
There is no process control. Basically an execution command is sent by the exec()
function, which, combined with some parameters, ignores the return of a response. By doing so, asynchronous executions.
Combinations vary by environment, so be aware that it's not enough just to copy the code and think it will work like magic.
In method Call()
of class Background
, just add new parameters if necessary.
Example:
/*
Opções para ambiente *nix. (isso inclui os-x)
Normalmente o sufixo ' &' é compatível com diversas distribuições Linux. Esse parâmetro diz ao sistema operacional executar em background.
*/
switch ($opt) {
default:
case '&':
$prefix = '';
$sufix = ' &';
break;
case 'dev-null':
$prefix = '';
$sufix = ' > /dev/null 2>/dev/null &';
break;
case 'dev-null2':
$prefix = '';
$sufix = ' /dev/null 2>&1 &';
break;
case 'outro-nome-como-quiser':
$prefix = '';
$sufix = ' /algum/comando/diferente/que/funcione/num/ambiente/especifico';
break;
}
The script is simple, clean, easy to understand. It does not depend on third-party libraries.