php中實現(xiàn)進程鎖與多進程的方法
為什么需要進程鎖?
主要作用就是防止你重復執(zhí)行同一程序,主要用在crontab中,當你設(shè)置了一個定時任務(wù),然后每分鐘執(zhí)行一次,如果不加進程鎖的話,之前的進程沒有執(zhí)行完的情況下。每分鐘都會有新的進程生成了。加上進程鎖之后,每次定時任務(wù)執(zhí)行的時候,就會去判斷之前的進程鎖是否存在,如果存在就不執(zhí)行。
1.單進程的情況的進程鎖實現(xiàn)
直接來個例子好了,寫個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環(huán)境下,執(zhí)行這個代碼,第一次會正常運行,然后第二次運行的時候就會提示:Process already exists.
之后無論執(zhí)行多少次都會出現(xiàn)這個提示表示進程失敗了。
php process.php & //&符號表示在后臺運行php
上面的代碼同樣可以利用在你定時計劃的腳本里,在開頭加上就好了。相當于對單個腳本加上進程鎖。
2.進程鎖實現(xiàn)多進程
上面說的是一個鎖對應(yīng)一個php腳本,那要用進程鎖實現(xiàn)多進程的話,其實就是讓一個進程可以有多個進程鎖就好了。
對上面的代碼的進程鎖的名字部分稍加改動即可實現(xiàn),根據(jù)傳進來的參數(shù)來決定進程鎖的名字,如果傳進來的參數(shù)一致則對應(yīng)同一個鎖。
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環(huán)境下。進入文件所在目錄,執(zhí)行php process.php 1, 然后新開個窗口,在執(zhí)行php process.php 1,就會提示Process already exists這個錯誤,但是如果你執(zhí)行的是php process.php 2,就會正常運行,同樣,你可以傳兩個參數(shù),如php process.php 1 2,這樣的話,對應(yīng)的又是新的進程鎖。這個實現(xiàn)主要用到的是argc和argv 這兩個php自帶的參數(shù),argc表示參數(shù)總數(shù),argv 表示具體調(diào)用的時候用的是哪個參數(shù)。
3.進程鎖在yii2中的實現(xiàn)
在yii2中要實現(xiàn)多進程的進程鎖的話,要繼承yii的console里的控制器,這樣能實現(xiàn)參數(shù)的傳遞,use yii\console\Controller;
然后在crontab中,命令如下,用yii自帶的命令來執(zhí)行定時腳本。然后進程鎖的代碼和上面的一樣就可以了。
* * * * * root /usr/local/bin/php /data/www/html/newVanish/yii 控制器名/方法 傳遞的參數(shù) > /dev/null 2>&1
4.殺死進程的命令
這個絕對是壓箱底的東西了,一般人我不告訴他。
通過一條命令就能刪除對應(yīng)的進程。下面的命令就是可以直接刪除進程名字為 process_name 的所有進程。要刪除什么只要直接將 process_name修改成你想要刪除的進程名字就可以了
ps aux|grep process_name |grep -v grep|awk '{print $2}'|xargs kill -9
總結(jié)
以上就是關(guān)于php中進程鎖與多進程實現(xiàn)的全部內(nèi)容,希望這篇文章的內(nèi)容對大家學習或者使用PHP能有所幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
PHP中ini_set和ini_get函數(shù)的用法小結(jié)
本篇文章主要是對PHP中ini_set和ini_get函數(shù)的用法進行了總結(jié)介紹,需要的朋友可以過來參考下,希望對大家有所幫助2014-02-02PHP采用get獲取url漢字出現(xiàn)亂碼的解決方法
這篇文章主要介紹了PHP采用get獲取url漢字出現(xiàn)亂碼的解決方法,是很多PHP程序員都曾遇到的問題,非常具有實用價值,需要的朋友可以參考下2014-11-11PHP實現(xiàn)將base64編碼字符串轉(zhuǎn)換成圖片示例
這篇文章主要介紹了PHP實現(xiàn)將base64編碼字符串轉(zhuǎn)換成圖片,涉及php編碼轉(zhuǎn)換、文件讀寫等簡單處理技巧,需要的朋友可以參考下2018-06-06PHP中執(zhí)行MYSQL事務(wù)解決數(shù)據(jù)寫入不完整等情況
事務(wù)可以進行模擬SQL操作,當所有的SQL都操作成功的時候才進行SQL操作,只要有一個操作失敗就回滾當前事務(wù)的所有SQL操作,避免出現(xiàn)上面描述中出現(xiàn)的數(shù)據(jù)寫入不完整等情況2014-01-01瀏覽器預覽PHP文件時頂部出現(xiàn)空白影響布局分析原因及解決辦法
在編寫PHP文件過程中,發(fā)現(xiàn)在瀏覽器預覽PHP文件時,頂部會出現(xiàn)一行空白,影響了頁面的布局2013-01-01php函數(shù)之strtr和str_replace的用法詳解以及效率分析
PHP中主要用strtr()和str_repalce()這兩個函數(shù)替換字符串和數(shù)組,但你們都知道他們這兩個函數(shù)的區(qū)別和用法嗎?有不少文章在說使用strtr函數(shù)比str_replace快4倍,那為什么很多時候都在用str_replace,到底應(yīng)該使用哪個函數(shù)呢2022-11-11在WINDOWS中設(shè)置計劃任務(wù)執(zhí)行PHP文件的方法
在網(wǎng)上找了些WINDOWS執(zhí)行PHP的計劃任務(wù)的方法,有一個寫得很全,可惜在我這竟然沒通過。最后不得不綜合各門派的方法,才能在我這運行成功2011-12-12file_get_contents獲取不到網(wǎng)頁內(nèi)容的解決方法
file_get_contents獲取不到網(wǎng)頁內(nèi)容的解決方法,需要的朋友可以參考一下2013-03-03