A routine that executes 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);
php file.
<?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 function exec()
, that combined with some parameters ignores the return of a response. Thus, asynchronous executions.
Combinations vary by environment, so be aware that it is not enough to just copy the code and think it will work like magic.
In the method Call()
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.
The most traditional way would be to use scheduled tasks (with cron), which run from time to time and handle a queue of what needs to be done in the webservice.
– bfavaretto
the main script needs to wait for completion of parallel processes or not?
– Pedro Sanção
No need to wait @Sanction
– touchmx