English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Métodos de implementação de bloqueio de processo e múltiplos processos no php

Por que é necessário o bloqueio de processo?

Sua principal função é evitar a execução repetida do mesmo programa, principalmente usada no crontab. Quando você configura uma tarefa agendada e executa uma vez a cada minuto, se não houver bloqueio de processo, novos processos serão gerados a cada minuto, desde que o processo anterior não tenha sido concluído. Com o bloqueio de processo, sempre que a tarefa agendada for executada, será verificado se o bloqueio de processo existente existe; se existir, não será executado.

1.A implementação do bloqueio de processo para a situação de processo único

Vamos dar um exemplo, escreva um script php, chame-o de process.php, o código é o seguinte:}

<?php
$lock_file = dirname(__FILE__) . "/process.lock";
$lock_file_handle = fopen($lock_file, 'w');
if ($lock_file_handle === false)
 die("Can not create lock file {$lock_file}\n");
if (!flock($lock_file_handle, LOCK_EX + LOCK_NB)) {
 die(date("Y-m-d H:i:s) . " Process already exists.\n");
}
while(1{
}

Em seguida, execute este código no ambiente Linux, a primeira vez ele funcionará normalmente, mas na segunda execução, ele será exibido: Process already exists. Após isso, independentemente de quantas vezes você executar, ele sempre exibirá essa mensagem indicando que o processo falhou.

php process.php & //& símbolo representa a execução php em segundo plano


O código acima também pode ser usado em scripts agendados, adicionando-o no início. Isso é equivalente a adicionar um bloqueio de processo para um único script.

2. Implementação de múltiplos processos usando bloqueio de processo

Se falamos de um bloqueio para um script php, para implementar múltiplos processos usando bloqueios de processo, basta permitir que um processo tenha múltiplos bloqueios de processo.
Para modificar o nome do bloqueio de processo do código acima, é suficiente fazer algumas alterações. O nome do bloqueio de processo depende dos parâmetros passados, então se os parâmetros forem iguais, eles terão o mesmo bloqueio.

if(!($argc > 1))
{
 $lock_file = dirname(__FILE__) . "/process.lock";
}else{
 unset($argv[0]);
 $lock_file = dirname(__FILE__) . "/process". implode('.', $argv) .".lock";
}
$lock_file_handle = fopen($lock_file, 'w');
if ($lock_file_handle === false){
 die("Can not create lock file $lock_file\n");
}
if (!flock($lock_file_handle, LOCK_EX + LOCK_NB)) {
 die(date("Y-m-d H:i:s) . " Process already exists.\n");
}
while(1{
}

Em ambiente Linux. Acesse o diretório do arquivo e execute php process.php 1, em seguida, abra uma nova janela e execute php process.php 1será exibido o erro Process already exists, mas se você estiver executando php process.php 2Se não, ele funcionará normalmente, assim, você pode passar dois parâmetros, como php process.php 1 2Isso novamente é um novo bloqueio de processo. A implementação principal usa os parâmetros argc e argv, que são parâmetros nativos do php, argc representa o número total de parâmetros, argv representa quais parâmetros são usados na chamada específica.

3Bloqueio de processo no yii2do yii

Na implementação de2Para implementar o bloqueio de processo de multiprocessos no yii, é necessário herdar o controlador no console do yii, assim você pode passar parâmetros, use yii\console\Controller;
Em seguida, no crontab, o comando é o seguinte, execute o script agendado com o comando nativo do yii. Então o código do bloqueio de processo é o mesmo que o acima.

* * * * * root /usr/local/bin/php /data/www/html/newVanish/Nome do controlador yii/Método de parâmetros passados > /dev/null 2>&1

4Comando para matar processo

Isso é realmente um segredo guardado, que eu não conto a ninguém.
Pode deletar o processo correspondente com um único comando. O comando a seguir pode deletar todos os processos cujo nome seja process_name. Basta modificar process_name para o nome do processo que você deseja deletar.

ps aux|grep process_name |grep -v grep|awk '{print $2}'|xargs kill -9

Resumo

Isso é tudo sobre o bloqueio de processo e a implementação de multiprocessos no PHP. Espero que o conteúdo deste artigo ajude você a aprender ou usar PHP. Se tiver alguma dúvida, você pode deixar um comentário para trocar. Obrigado pelo apoio ao tutorial de clamor.

Declaração: O conteúdo deste artigo é de origem na internet, pertencente ao respectivo proprietário. O conteúdo é contribuído e carregado voluntariamente pelos usuários da internet. Este site não possui direitos de propriedade, não foi editado manualmente e não assume responsabilidades legais relacionadas. Se você encontrar conteúdo suspeito de infringir direitos autorais, por favor, envie um e-mail para: notice#oldtoolbag.com (ao enviar e-mail, substitua # por @ para denunciar e forneça provas relevantes. Se confirmado, o site deletará imediatamente o conteúdo suspeito de infringir direitos autorais.)

Você também pode gostar