O PHP também pode iniciar e encerrar diretamente o processo Daemon. Comparado com o shell, é muito mais simples e conveniente de entender. Obviamente, se o daemon PHP precisar reiniciar automaticamente, ele ainda depende do cronograma Crontab do shell. Execute o script de vez em quando para ver se o script precisa ser reiniciado. Se necessário, mate o processo e exclua o arquivo runfile, reinicie e escreva o PID no arquivo runfile.
A cópia do código é a seguinte:
<? php
Função Iniciar ($ arquivo) {
$ caminho = Dirname (arquivo __ __). '/';
$ RUNFILE = $ PATH. $ FILE. '. RUN';
$ DIEFILE = $ PATH. $ FILE. '. DIE';
$ file = $ path. "Data/{$ file} .php";
ClearStatCache ();
if (file_exists ($ runfile)) {
$ oldpid = file_get_contents ($ runfile);
$ agorapid = shell_exec ("ps aux | grep 'php -f process.php' | grep $ {oldpid} | awk '{print $ 2}'");
// Se o número PID no arquivo de execução puder corresponder ao de execução, e a diferença entre a última vez que você acessa o arquivo de execução e a diferença atual é inferior a 5 minutos, retorne
if (($ Oldpid == $ NowPid) && (time () - FileAtime ($ runfile) <300)) {
eco "o arquivo $ está em círculo em execução não";
retornar;
}outro{
// O número PID não corresponde ou a instrução Loop não foi executada por 300 segundos. Apenas mate o processo e reinicie -o
$ pid = file_get_contents ($ runfile);
shell_exec ("ps aux | grep 'php -f process.php' | grep {$ pid} | xargs --if-no-run-run-run-Kill Kill");
}
}outro{
// Escreva o arquivo PID no arquivo de corrida
if (! ($ newpid = getMypid ()) ||! file_put_contents ($ runfile, $ newpid)) {
retornar;
}
while (true) {
// recebe um novo número de processo final, encerre o processo e exclua os arquivos relevantes
if (file_exists ($ diefile) && desvincular ($ runfile) && desvincular ($ diefile)) {
retornar;
}
/*É isso que o daemon precisa fazer*/
file_put_contents ($ arquivo, "estou executando agora" .php_eol, file_append);
/************************/
toque ($ runfile);
sono (5);
}
}
}
start ("teste");
Alguns pontos a prestar atenção ao escrever daemons com a HP:
1. A primeira coisa é a função clearstatcache () função. Olhando para o manual oficial, você pode saber que a função limpa o cache do status do arquivo. Ao verificar o status do cache do mesmo arquivo várias vezes em um script, ocorrerá um erro se a função não for usada. The affected functions are: stat(), lstat(), file_exists(), is_writable(), is_readable(), is_executable(), is_file(), is_dir(), is_link(), filectime(), fileatime(), filemtime(), fileinode(), filegroup(), fileowner(), filesize(), filetype(), FILEPERMS ().
2. Quando o script for executado várias vezes, ele será detectado antes da execução. A distância de tempo do último loop agora é maior que 300s ou o número PID não corresponde será reiniciado (o tempo deve ser atualizado em cada execução do loop).
3. O reinício automático também usa a programação de Crontab, adicione o arquivo ao cronograma:
A cópia do código é a seguinte:
Crontab -e
#Open the cronogram, modo inserido
*/3 * * * */usr/bin/php -f process.php
#Execute a cada 3 minutos, coloque o processo para pendurar
Isso é basicamente ok. Se houver funções específicas, você precisará alterar o código.