[Origem] Todo mundo conhece o processo daemon (Daemon) no Linux/Unix, como nosso comumente usado httpd, mysqld, etc., que são programas executados na memória residente, semelhantes aos serviços no Windows. Geralmente, os processos daemon são escritos em C/C++, que visa gerar processos filhos por meio de fork. Quando o processo pai no shell atual é eliminado, o processo filho será executado em segundo plano para não gerar informações de saída no terminal. , funções como syslog são usadas para gravar arquivos de log.
Sabemos que php é uma linguagem de script e é executada por meio do mecanismo de script php, por isso é problemático criar um processo daemon. Hoje combinaremos comandos Unix/Linux para realizar a função de nosso processo daemon.
[Princípio] A função do comando nohup no Unix é executar o comando sem desligar. Ao mesmo tempo, nohup coloca toda a saída do programa no arquivo nohup.out no diretório atual. não gravável, ele é colocado no arquivo <diretório inicial do usuário> /nohup.out. Então, depois de receber este comando, nosso programa php escreve um script shell e usa um loop para manter nosso script em execução. Então, não importa se nossa janela de terminal está fechada ou não, nosso script php pode continuar em execução. Claro, quando nosso processo php for encerrado ou nosso sistema operacional for reiniciado, ele será encerrado naturalmente.
[Função] Você definitivamente perguntará: qual é a utilidade de tornar nosso script php um daemon? Claro que existem, como a função mais típica, que pode basicamente substituir a função do cron. Por exemplo, certas operações que precisamos realizar regularmente podem ser feitas por ele, e o cron não é mais necessário. servidor for reiniciado, não há como reiniciar. No entanto, os servidores Unix em geral não são tão fáceis de reiniciar. Além disso, também podemos fazer uma função simples do lado do servidor, como fazer um servidor que pode usar Telnet, pode ser transformado em um pequeno backdoor, mas a implementação é um pouco complicada.
[Prática] Exemplo 1: Gerar arquivos automaticamente Faremos agora dois exemplos para provar nossa afirmação acima. Em primeiro lugar, a primeira é gerar automaticamente um arquivo a cada trinta segundos e executá-lo para sempre.
Primeiro você deve garantir que o sistema operacional seja Unix ou Linux, como FreeBSD, Redhat, Fedora ou SUSE. Então devemos garantir que nosso mecanismo de script php esteja em /usr/local/php/bin/php. O caminho específico pode ser escrito de acordo com o seu caminho real, instale-o você mesmo.
Por exemplo, se o diretório atual for /home/heiyeluren/, então usamos vi ou outros editores para escrever um arquivo chamado php_daemon1.php:
$vi php_daemon1.php
Em seguida, escreva o seguinte código:
#!/usr/local/php/bin/php
<?
set_time_limit(0);
enquanto(1)
{
@fopen("test_".time().".txt","w");
dormir(30);
}
?>
Em seguida, salve e saia do vi e conceda permissões executáveis ao arquivo php_daemon1.php:
$ chmod +x /home/heiyeluren/php_daemon1.php
Em seguida, deixe nosso script ser executado em segundo plano e execute o seguinte comando:
$ nohup /home/heiyeluren/php_daemon1.php &
Lembre-se de adicionar o símbolo & no final para que possa ser executado em segundo plano. Após executar o comando acima, o seguinte prompt aparecerá:
[1] 82480
anexando saída a nohup.out
Depois de retornar ao carro, um prompt de shell aparecerá. Portanto, a dica acima significa que as informações de saída de toda a execução de comandos serão colocadas no arquivo nohup.out, mencionado acima. Então, após executar o comando acima, veremos mais arquivos começando com test_ no diretório atual a cada trinta segundos, como: test_1139901144.txt test_1139901154.txt e outros arquivos, o que prova que nosso programa está sendo executado em segundo plano.
Então, como encerramos a execução do programa? A melhor forma é reiniciar o sistema operacional Haha, claro, isso não é aconselhável. Podemos usar o comando kill para encerrar o processo, naturalmente sabemos o número PID do processo. ID. Você pode usar o comando ps para vê-lo chegar.
$ps
COMANDO DE TEMPO PID TT STAT
82374 p3 Ss 0:00.14 -bash (bash)
82510 p3 S 0:00.06 /usr/local/php/bin/php /home/heiyeluren/php_daemon1.php
82528 p3 R+ 0:00,00 ps
Acima vimos que o ID do processo do nosso php é: 82510, então executamos o comando kill:
$ matar -9 82510
[1]+ Matou nohup /home/heiyeluren/php_daemon1.php
Ao ver este prompt, você saberá que o processo foi encerrado. Se você executar ps novamente, descobrirá que ele desapareceu:
$ps
COMANDO DE TEMPO PID TT STAT
82374 p3 Ss 0:00.17 -bash (bash)
82535 p3 R+ 0:00,00 ps
Se você não conseguir ver o processo diretamente com o comando ps, use os dois comandos ps e apos combinados para visualizá-lo e você definitivamente poderá ver o processo.
Com base no processo acima, você pode expandir o processo para criar seu próprio programa cron, então você não precisa do cron. Claro, este é apenas um caminho. Exemplo 2: Daemon do lado do servidor. Ele é simulado aproximadamente usando PHP no lado do servidor e, em seguida, é executado em segundo plano para obter o efeito do Daemon do lado do servidor.
Continue em nosso diretório inicial: /home/heiyeluren e edite o arquivo php_daemon2.php:
$vi php_daemon2.php
Digite o seguinte código (o código é do manual do PHP, modifiquei os comentários):
#!/usr/local/php/bin/php
<?php
/* As configurações http://www.knowsky.com/php.asp não exibem nenhum erro*/
relatório_erro(0);
/* O tempo limite do script é infinito*/
set_time_limit(0);
/* Inicia a compensação fixa */
ob_implicit_flush();
/* O IP desta máquina e as portas que precisam ser abertas */
$endereço = '192.168.0.1';
$porta = 10000;
/* Gera um soquete */
if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) {
echo "socket_create() falhou: motivo: " . socket_strerror($sock) "n";
}
/* Vincula o endereço IP e a porta */
if (($ret = socket_bind($meia, $endereço, $porta)) < 0) {
echo “socket_bind() falhou: motivo: ” . socket_strerror($ret) “n”;
}
/* Conexão do soquete do monitor */
if (($ret = socket_listen($sock, 5)) < 0) {
echo “socket_listen() falhou: motivo: ” . socket_strerror($ret) “n”;
}
/*Loop eterno para monitorar as conexões do usuário*/
fazer {
if (($msgsock = socket_accept($sock)) < 0) {
echo "socket_accept() falhou: razão: " . socket_strerror($msgsock) .
quebrar;
}
/* Envia informações de prompt para usuários conectados*/
$msg = “=========================================rn " .
"Bem-vindo ao Servidor de Teste PHP. rnrn".
"Para sair, digite 'quit'. rn" .
"Para desligar o servidor digite 'shutdown'.rn" .
"Para obter mensagem de ajuda, digite 'help'.rn" .
"========================================rn" .
"php>";
socket_write($msgsock, $msg, strlen($msg));
fazer {
if (falso === ($buf = socket_read($msgsock, 2048, PHP_NORMAL_READ))) {
echo “socket_read() falhou: motivo: ” . socket_strerror($ret) “n”;
pausa 2;
}
if (!$buf = trim($buf)) {
continuar;
}
/*Fecha a conexão do cliente quando o cliente digita o comando quit*/
if ($buf == 'sair') {
quebrar;
}
/* Quando o cliente digita o comando shutdown, tanto o servidor quanto o cliente são desligados*/
if ($buf == 'desligamento') {
socket_close($msgsock);
pausa 2;
}
/* Gera informações de ajuda quando o cliente digita o comando de ajuda*/
if ($buf == 'ajuda') {
$msg = “Mensagem de ajuda do servidor PHP rnrn”.
"Para sair, digite 'quit'. rn" .
"Para desligar o servidor digite 'shutdown'.rn" .
"Para obter mensagem de ajuda, digite 'help'.rn" .
"php>";
socket_write($msgsock, $msg, strlen($msg));
continuar;
}
/*Mensagem de aviso quando o comando de entrada do cliente não existe*/
$talkback = “PHP: comando desconhecido '$buf'.rnphp> “;
socket_write($msgsock, $talkback, strlen($talkback));
echo “$bufn”;
} while (verdadeiro);
socket_close($msgsock);
} while (verdadeiro);
/* Fecha a conexão do soquete */
socket_close($meia);
?>
Salve o código acima e saia.
O código acima completa aproximadamente uma função semelhante ao lado do servidor Telnet, ou seja, quando o lado do servidor executa o programa, o cliente pode se conectar à porta 10000 do servidor para comunicação.
Adicione permissões executáveis ao arquivo:
$ chmod +x /home/heiyeluren/php_daemon2.php
Execute o comando no servidor:
$ nohup /home/heiyeluren/php_daemon2.php &
Ele entra na operação em segundo plano e subimos pelo telnet do cliente Windows:
C:>telnet 192.168.0.1 10000
Se solicitado:
Conectando-se a 192.168.0.188...Não é possível abrir a conexão com o host na porta 10000: Se a conexão falhar, significa que o servidor não está aberto ou o programa acima não foi executado corretamente. -função de soquetes. Se solicitado:
=========================================
Bem-vindo ao Servidor de Testes PHP.
Para sair, digite 'quit'.
Para desligar o servidor digite 'shutdown'.
Para obter mensagem de ajuda digite 'help'.
=========================================
php>
Isso significa que nos conectamos com sucesso ao daemon do lado do servidor escrito em PHP. Após o prompt php>, podemos executar três comandos, como help, quit e shutdown. Se a entrada do comando não for esses três, ele solicitará:
php>asdf
PHP: comando desconhecido 'asdf'.
Execute o comando help para obter ajuda php> help
Mensagem de ajuda do servidor PHP
Para sair, digite 'quit'.
Para desligar o servidor digite 'shutdown'.
Para obter mensagem de ajuda digite 'help'.
Este lado do servidor não será introduzido e pode ser expandido por você mesmo.
Eliminar o processo é semelhante ao exemplo 1.
[Resumo] Através do aprendizado acima, sabemos que o PHP também pode ser usado como um processo daemon. Se for bem projetado, a função será mais poderosa, porém, estamos apenas aprendendo aqui e você pode pesquisá-la e atualizá-la por conta própria. .
Este artigo refere-se ao manual chinês do PHP. Ler mais manuais será muito benéfico para você.