中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何在php項目中實現一個進程鎖

發布時間:2021-01-30 14:14:44 來源:億速云 閱讀:155 作者:Leah 欄目:開發技術

本篇文章為大家展示了如何在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("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環境下,執行這個代碼,第一次會正常運行,然后第二次運行的時候就會提示:Process already exists. 之后無論執行多少次都會出現這個提示表示進程失敗了。

php process.php & //&符號表示在后臺運行php

如何在php項目中實現一個進程鎖

上面的代碼同樣可以利用在你定時計劃的腳本里,在開頭加上就好了。相當于對單個腳本加上進程鎖。

2.進程鎖實現多進程

上面說的是一個鎖對應一個php腳本,那要用進程鎖實現多進程的話,其實就是讓一個進程可以有多個進程鎖就好了。
對上面的代碼的進程鎖的名字部分稍加改動即可實現,根據傳進來的參數來決定進程鎖的名字,如果傳進來的參數一致則對應同一個鎖。

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){
}

在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里的控制器,這樣能實現參數的傳遞,use yii\console\Controller;
然后在crontab中,命令如下,用yii自帶的命令來執行定時腳本。然后進程鎖的代碼和上面的一樣就可以了。

* * * * * root /usr/local/bin/php /data/www/html/newVanish/yii 控制器名/方法 傳遞的參數 > /dev/null 2>&1

4.殺死進程的命令

這個絕對是壓箱底的東西了,一般人我不告訴他。
通過一條命令就能刪除對應的進程。下面的命令就是可以直接刪除進程名字為 process_name 的所有進程。要刪除什么只要直接將 process_name修改成你想要刪除的進程名字就可以了

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

上述內容就是如何在php項目中實現一個進程鎖,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

php
AI

南雄市| 镇康县| 静海县| 铁力市| 张北县| 于都县| 筠连县| 绥棱县| 孟州市| 封丘县| 通河县| 中西区| 新干县| 怀柔区| 绥江县| 西和县| 裕民县| 宝应县| 扬州市| 高要市| 玛纳斯县| 博湖县| 遂川县| 深水埗区| 延安市| 修水县| 久治县| 宜川县| 洪洞县| 花莲市| 虞城县| 南华县| 江油市| 明水县| 广饶县| 大连市| 宿迁市| 蕉岭县| 三亚市| 临沂市| 奉新县|