php如何?進程鎖與多進程

來源:互聯網
上載者:User
php如何?進程鎖與多進程?本文給大家介紹了單進程的情況的進程鎖實現、進程鎖實現多進程、進程鎖在yii2中的實現以及殺死進程的命令,有需要的朋友們可以參考借鑒,希望對大家有所協助。

為什麼需要進程鎖?

主要作用就是防止你重複執行同一程式,主要用在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


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

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 進程鎖定問題分析研究_PHP教程

阿里技術文章:淺談 Node.js 和 PHP 進程管理

php非同步多線程swoole用法執行個體

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.