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

Методы реализации процесса блокировки и многопоточности в php

Почему нужна блокировка процесса?

Основная функция - предотвратить повторное выполнение одного и того же программного обеспечения, обычно используется в crontab. Когда вы установили задачу с таймером, которая выполняется один раз в минуту, и если не добавить блокировку процесса, то при неполном выполнении предыдущего процесса каждый минута будет создан новый процесс. После добавления блокировки процесса, при каждом выполнении задачи с таймером, будет проверяться, существует ли блокировка процесса, и если она существует, то процесс не будет выполняться.

1. Реализация блокировки процесса для одного процесса

Пример: создадим скрипт на php,命名为 process.php, код следующий:

<?php
$lock_file = dirname(__FILE__) . "/process.lock";
$lock_file_handle = fopen($lock_file, 'w');
if ($lock_file_handle === false)
 die("Не можно создать файл блокировки {$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){
{}

Затем выполните этот код в среде Linux. В первый раз он будет работать нормально, но при повторном запуске появится сообщение: Process already exists. После этого при каждом запуске будет появляться это сообщение, указывающее на неудачу процесса.

php process.php & // Символ & означает запуск PHP в фоновом режиме


Этот код можно использовать и в скриптах планировщика задач, просто добавьте его в начале. Это эквивалентно добавлению процесса-замка к отдельному скрипту.

2. Реализация многопоточности с помощью процесса-замка

Как было сказано, один замок соответствует одному PHP-скрипту. Чтобы реализовать многопоточность с помощью процесса-замка, нужно просто дать одному процессу несколько процессов-замков.
Название процесса-замка можно изменить, просто немного изменив上面的 код. Название процесса-замка зависит от переданных параметров. Если переданные параметры одинаковые, то они будут соответствовать одному и тому же замку.

if(!($argc > 1))
{
 $lock_file = dirname(__FILE__) . "/process.lock";
}
 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){
{}

В среде Linux. Войдите в каталог файла, выполните команду php process.php 1, затем откройте новый окно и выполните команду php process.php 1, появится ошибка Process already exists, но если вы выполните php process.php 2, то все будет работать нормально. Таким же образом, вы можете передать два параметра, например, php process.php 1 2, в этом случае будет создан новый процессный замок. Эта реализация использует аргументы argc и argv, предоставляемые PHP, где argc означает общее количество параметров, а argv указывает на конкретные параметры, переданные при вызове.

3. Реализация процесса блокировки в yii2

Для реализации процесса блокировки многопоточности в yii2 необходимо наследовать контроллер из yii\console\Controller, чтобы можно было передавать параметры, use yii\console\Controller;
Затем в crontab, команда такая, используется командаyii для выполнения скрипта планировщика задач. Затем код блокировки процесса такой же, как и выше.

* * * * * root /usr/local/bin/php /data/www/html/newVanish/yii controller_name/action_name передаваемые параметры > /dev/null 2>&1

4. Команда для杀死 процесса

Это绝对是 что-то, что я не хочу告诉 другим.
Удаление соответствующего процесса одним командным указанием. Ниже приведена команда для удаления всех процессов с именем process_name. Чтобы удалить что-то, просто измените process_name на имя процесса, который вы хотите удалить.

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

Обобщение

Вот и все, что касается процесса блокировки и реализации многопоточности в PHP. Надеюсь, что содержимое этой статьи поможет вам изучать или использовать PHP. Если у вас есть вопросы, пожалуйста, оставляйте комментарии для обсуждения, спасибо за поддержку учебника Kaoan.

Заявление: содержимое этой статьи взято из Интернета, авторские права принадлежат соответствующему автору. Контент предоставлен пользователями Интернета, самостоятельно загружен, сайт не обладает правами собственности, не был отредактирован вручную и не несет ответственности за связанные с этим юридические вопросы. Если вы обнаружите содержимое,涉嫌侵犯版权, пожалуйста, отправьте письмо по адресу: notice#oldtoolbag.com (во время отправки письма замените # на @),并提供相关证据. Если подтвердится, сайт немедленно удаляет涉嫌侵权的内容。

Рекомендуем к просмотру