php中實現進程鎖與多進程的方法

來源:本網整理

應用層。進程的定義:進程是指在系統中正在運行的一個應用程序。一個進程至少包括一個線程,通常將該線程稱為主線程。一個進程從主線程的執行開始進而創建一個或多個附加線程,就是所謂基于多線程的多任務。應用層:應用層(Application layer)是七層OSI模型的第七層。應用層直接和應用程序接口并提供常見的網絡應用服務。應用層也向表示層發出請求。應用層是開放系統的最高層,是直接為應用進程提供服務的www.13333515.buzz防采集請勿采集本網。

s">

php中實現進程鎖與多進程的方法

作者:Rodgexue 字體:[增加 減小] 類型:轉載 時間:2016-09-18 我要評論 這篇文章給大家介紹了單進程的情況的進程鎖實現、進程鎖實現多進程、進程鎖在yii2中的實現以及殺死進程的命令,有需要的朋友們可以參考借鑒,下面來一起看看吧。 ">

為什么需要進程鎖?

主要有三種方案 第一種是利用第三方的API來實現信息推送,主要包括環信、百度云推送、leancloud等 第二種通過javascript的setTimeout或者setInterval來實現,同理PHP端也可以用守護進程來實現 第

主要作用就是防止你重復執行同一程序,主要用在crontab中,當你設置了一個定時任務,然后每分鐘執行一次,如果不加進程鎖的話,之前的進程沒有執行完的情況下。每分鐘都會有新的進程生成了。加上進程鎖之后,每次定時任務執行的時候,就會去判斷之前的進程鎖是否存在,如果存在就不執行。

刷新,嚴格來說確實不應該算進統計中去,而且在多進程的瀏覽器中,用戶打開新窗口重復輸入網址也跟刷新差不多,而文章的真實訪問量和重復刷新量之間的差距肯定是非常大的,所以即便是將刷新的次數算進統計

1.單進程的情況的進程鎖實現

現在通過Sockets實現進程通信的網絡應用越來越多,這主要的原因是Sockets的跨平臺性要比其它IPC機制好得多,另外WinSock 2.0不僅支持TCP/IP協議,而且還支持其它協議(如IPX)。Sockets的唯一缺點是它支持的

直接來個例子好了,寫個php腳本, 就先命名為process.php吧,代碼如下:

(5)進程生成:在 UNIX 環境下的 PHP 4.0 提供了一個很智能和通用的生成進程,使用了一種名為基于automake/libtool的系統生成技術。(6)COM/DCOM 支持:PHP 4.0 提供 COM/DCOM 支持(僅用于Windows 環境)

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

這兩個根本不是一回事。RS.OPEN是打開一個記錄集并返回到客戶端。而UPDATE是要更新表里的數據,要執行更新,一定會有相應的鎖操作,而打開記錄集則不需要。

然后在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能有所幫助,如果有疑問大家可以留言交流,謝謝大家對突襲網的支持。

線程和進程都是現在電腦概念里比較時髦的用語,什么是多線程,什么是多進程?本文詳細的給您介紹一下,希望能增進您對當代電腦技術的了解,有不到之處,還往高手予以更正。進程(英語:Process,中國大陸譯作進程,臺灣譯作行程)是計算機中已運行程序的實體。進程本身不會運行,是線程的容器。程序本身只是指令的集合,進程才是程序(那些指令)的真正運行。若干進程有可能與同一個程序相關系,且每個進程皆可以同步(循序)或不同步(平行)的方式獨立運行。進程為現今分時系統的基本運作單位 線程(英語:thread,臺灣譯為運行緒),操作系統技術中的術語,是操作系統能夠進行運算調度的最小單位。它被包涵在進程之中,一條線程指的是進程中一個單一順序的控制流,一個進程中可以并發多個線程,每條線程并行執行不同的任務。在Unix System V及SunOS中也被稱為輕量進程(lightweight processes),但輕量進程更多指內核線程(kernel thread),而把用戶線程(user thread)稱為線程。線程是獨立調度和分派的基本單位。線程可以操作系統內核調度的內核線程,如Win32 線程;由用戶進程自行調度的用戶線程,如Linux Portable Thread;或者由內核與用戶進程,如Windows 7的線程,進行混合調度。同一進程中的多條線程將共享該進程中的全部系統資源,如虛擬地址空間,文件描述符和信號處理等等。但同一進程中的多個線程有各自的調用棧(call stack),自己的寄存器環境(register context),自己的線程本地存儲(thread-local storage)。一個進程可以有很多線程,每條線程并行執行不同的任務。在多核或多CPU,或支持Hyper-threading的CPU上使用多線程程序設計的好處是顯而易見,即提高了程序的執行吞吐率。在單CPU單核的計算機上,使用多線程技術,也可以把進程中負責IO處理、人機交互而常備阻塞的部分與密集計算的部分分開來執行,編寫專門的workhorse線程執行密集計算,從而提高了程序的執行效率 進程是資源分配的最小單位,線程是CPU調度的最小單位。線程和進程的區別在于,子進程和父進程有不同的代碼和數據空間,而多個線程則共享數據空間,每個線程有自己的執行堆棧和程序計數器為其執行上下文.多線程主要是為了節約CPU時間,發揮利用,根據具體情況而定.線程的運行中需要使用計算機的內存資源和CPU。多進程:進程是程序在計算機上的一次執行活動。當你運行一個程序,你就啟動了一個進程。顯然,程序是死的(靜態的),進程是活的(動態的)。進程可以分為系統進程和用戶進程。凡是用于完成操作系統的各種功能的進程就是系統進程,它們就是處于運行狀態下的操作系統本身;所有由用戶啟動的進程都是用戶進程。進程是操作系統進行資源分配的單位。進程又被細化為線程,也就是一個進程下有多個能獨立運行的更小的單位。在同一個時間里,同一個計算機系統中如果允許兩個或兩個以上的進程處于運行狀態,這便是多任務。現代的操作系統幾乎都是多任務操作系統,能夠同時管理多個進程的運行。多任務帶來的好處是明顯的,比如你可以邊聽mp3邊上網,與此同時甚至可以將下載的文檔打印出來,而這些任務之間絲毫不會相互干擾。那么這里就涉及到并行的問題,俗話說,一心不能二用,這對計算機也一樣,原則上一個CPU只能分配給一個進程,以便運行這個進程。我們通常使用的計算機中只有一個CPU,也就是說只有一顆心,要讓它一心多用,同時運行多個進程,就必須使用并發技術。實現并發技術相當復雜,最容易理解的是“時間片輪轉進程調度算法”,它的思想簡單介紹如下:在操作系統的管理下,所有正在運行的進程輪流使用CPU,每個進程允許占用CPU的時間非常短(比如10毫秒),這樣用戶根本感覺不出來 CPU是在輪流為多個進程服務,就好象所有的進程都在不間斷地運行一樣。但實際上在任何一個時間內有且僅有一個進程占有CPU。如果一臺計算機有多個CPU,情況就不同了,如果進程數小于CPU數,則不同的進程可以分配給不同的CPU來運行,這樣,多個進程就是真正同時運行的,這便是并行。但如果進程數大于CPU數,則仍然需要使用并發技術。進行CPU分配是以線程為單位的,一個進程可能由多個線程組成,這時情況更加復雜,但簡單地說,有如下關系:總線程數數量:并行運行 總線程數>CPU數量:并發運行 并行運行的效率顯然高于并發運行,所以在多CPU的計算機中,多任務的效率比較高。但是,如果在多CPU計算機中只運行一個進程(線程),就不能發揮多CPU的優勢。這里涉及到多任務操作系統的問題,多任務操作系統(如Windows)的基本原理是:操作系統將CPU的時間片分配給多個線程,每個線程在操作系統指定的時間片內完成(注意,這里的多個線程是分屬于不同進程的).操作系統不斷的從一個線程的執行切換到另一個線程的執行,如此往復,宏觀上看來,就好像是多個線程在一起執行.由于這多個線程分屬于不同的進程,因此在我們看來,就好像是多個進程在同時執行,這樣就實現了多任務 多線程:在計算機編程中,一個基本的概念就是同時對多個任務加以控制。許多程序設計問題都要求程序能夠停下手頭的工作,改為處理其他一些問題,再返回主進程。可以通過多種途徑達到這個目的。最開始的時候,那些掌握機器低級語言的程序員編寫一些“中斷服務例程”,主進程的暫停是通過硬件級的中斷實現的。盡管這是一種有用的方法,但編出的程序很難移植,由此造成了另一類的代價高昂問題。中斷對那些實時性很強的任務來說是很有必要的。但對于其他許多問題,只要求將問題劃分進入獨立運行的程序片斷中,使整個程序能更迅速地響應用戶的請求。最開始,線程只是用于分配單個處理器的處理時間的一種工具。但假如操作系統本身支持多個處理器,那么每個線程都可分配給一個不同的處理器,真正進入“并行運算”狀態。從程序設計語言的角度看,多線程操作最有價值的特性之一就是程序員不必關心到底使用了多少個處理器。程序在邏輯意義上被分割為數個線程;假如機器本身安裝了多個處理器,那么程序會運行得更快,毋需作出任何特殊的調校。根據前面的論述,大家可能感覺線程處理非常簡單。但必須注意一個問題:共享資源!如果有多個線程同時運行,而且它們試圖訪問相同的資源,就會遇到一個問題。舉個例子來說,兩個線程不能將信息同時發送給一臺打印機。為解決這個問題,對那些可共享的資源來說(比如打印機),它們在使用期間必須進入鎖定狀態。所以一個線程可將資源鎖定,在完成了它的任務后,再解開(釋放)這個鎖,使其他線程可以接著使用同樣的資源。多線程是為了同步完成多項任務,不是為了提高運行效率,而是為了提高資源使用效率來提高系統的效率。線程是在同一時間需要完成多項任務的時候實現的。一個采用了多線程技術的應用程序可以更好地利用系統資源。其主要優勢在于充分利用了CPU的空閑時間片,可以用盡可能少的時間來對用戶的要求做出響應,使得進程的整體運行效率得到較大提高,同時增強了應用程序的靈活性。更為重要的是,由于同一進程的所有線程是共享同一內存,所以不需要特殊的數據傳送機制,不需要建立共享存儲區或共享文件,從而使得不同任務之間的協調操作與運行、數據的交互、資源的分配等問題更加易于解決。進程間通信(IPC,Inter-Process Communication),指至少兩個進程或線程間傳送數據或信號的一些技術或方法。進程是計算機系統分配資源的最小單位。每個進程都有自己的一部分獨立的系統資源,彼此是隔離的。為了能使不同的進程互相訪問資源并進行協調工作,才有了進程間通信。這些進程可以運行在同一計算機上或網絡連接的不同計算機上。進程間通信技術包括消息傳遞、同步、共享內存和遠程過程調用。IPC是一種標準的Unix通信機制。使用IPC 的理由:信息共享 加速;模塊化;方便;以及 私有權分離.主要的 IPC 方法 方法 提供方(操作系統或其他環境)文件 多數操作系統 信號 多數操作系統 Socket 多數操作系統 消息隊列(en:Message queue)多數操作系統 管道(en:Pipe)所有的 POSIX systems,Windows.具名管道(en:Named Pipe)所有的 POSIX 系統,Windows.信號量(en:Semaphore)所有的 POSIX 系統,Windows.共享內存 所有的 POSIX 系統,Windows.Message passing(en:Message passing)用于 MPI規范,Java RMI,CORBA,MSMQ,MailSlot 以及其他內容來自www.13333515.buzz請勿采集。

免責聲明 - 關于我們 - 聯系我們 - 廣告聯系 - 友情鏈接 - 幫助中心 - 頻道導航
Copyright © 2017 www.13333515.buzz All Rights Reserved
3排列五开奖结果