鍍金池/ 問答/PHP/ PHP先后請求調(diào)用一個方法,如果過第一次請求處理沒結(jié)束,第二次又調(diào)用會有什么影響

PHP先后請求調(diào)用一個方法,如果過第一次請求處理沒結(jié)束,第二次又調(diào)用會有什么影響?

后臺定時任務(wù)輪詢調(diào)用一個方法,每秒執(zhí)行一次,主要是從數(shù)據(jù)庫取出幾十條數(shù)據(jù)循環(huán)進行處理,處理結(jié)束整個循環(huán)大概要3秒鐘,每秒輪詢的話,第一次還沒處理完,緊接著調(diào)用會有什么影響嗎?它是怎樣的一個執(zhí)行流程,是會被阻塞嗎?還是我需要使用文件鎖,當(dāng)循環(huán)執(zhí)行完成再釋放

回答
編輯回答
淡墨

第一次沒執(zhí)行完,再次調(diào)用會再執(zhí)行一次,因為不同的進程再處理,這肯定不是你想要的結(jié)果,所以你需要自行處理掉,文件鎖或者redis鎖都行。

2018年5月6日 01:51
編輯回答
護她命

這個問題可以思考下,當(dāng)多用戶同時點贊該文章的時候是怎么實現(xiàn)的?因為操作的流程一般是取值,修改,存值。如果它們都是同時操作,不考慮誤差,不做其它處理,那么大家所操作的流程都是 獲取 0 ,修改 0 + 1 ,保存 1.

2018年8月22日 18:09
編輯回答
亮瞎她

首先這個問題本質(zhì)就是一個并發(fā)處理互斥資源的問題

  1. 解決你提問的的最簡單方法,啟動一個進程,依次處理,然后再迭代即可

偽代碼:

<?php
# do.php
while(true) {
    $rows = mysql_fetch_rows();
    foreach ($rows as $row) {
        do_something(row);
        usleep(500000);
    }
    //todo record log
    sleep(1);
}

php do.php
  1. 進階處理:你可以學(xué)習(xí)多進程,分布式鎖相關(guān)來做資源互斥的處理(文件鎖,redis鎖,zookeeper鎖都可以);

當(dāng)然直接利用mysql的排他鎖也可以簡單解決一個互斥問題,不過會帶來更多其他問題

2017年7月16日 04:09