PHP如何限制定時任務的程序數量

2022-09-25 22:15:12 字數 2026 閱讀 7226

現在的工作中,經常要寫一些指令碼做一些非同步的操作。

一般是大量的資料修改,或者解決部分併發問題。

為了能夠穩定的做好資料處理,一般情況下會用定時指令碼的方式。

那麼問題來了。

當我們處理大量資料的時候,指令碼的執行時間可能很長,或者重複處理某條資料(寫錯的情況下)。

為了避免資料的重複處理、執行指令碼過多導致伺服器壓力過大等問題,我們需要限制指令碼的執行數量。

思路一查詢某種標識的程序數量,如果超過一定數量,則直接退出,不處理。

思路二記錄每次的pid,可以使用 檔案、redis、memcached 等來儲存。

當啟動乙個新程序的時候,去查一下這個標識下面有哪些pid,是否還在執行,且與當前標識有關係。

當超過一定數量的時候,直接退出,不處理。

思路一實踐

這裡通過 linux 的 ps、grep、wc 的命令來獲取指定標識的執行程序數。

php/** * 是否可以執行

* * @param stwww.cppcns.comring $ident 標識

* @param integer $maxnum 最大執行數量

* * @return bool

*/function canrun($ident, $maxnum)

思路二實踐

這裡使用 redis 儲存 pid 資訊。

通過 /proc//cmdline 檔案檢測指定程序是否還在執行。

<?php /**

* 檢查 pid 是否存活

* * @param string $pid pid

* @param string $ident 標識

* * @return bool

*/function issurvive($pid, $ident)

$cmdline = trim(file_get_contents($cmdlinepath));

// 檢查標識是否在 cmdline 中

return strpos($cmdline, $ident) !== false;

}/**

* 是否可以執行

* * @param string $ident 標識

* @param integer $maxnum 最大執行數量

* * @return bool

*/function canrun($ident, $maxnum)

// 檢查 pid 是否還在執行中

if (issurvive($pid, $ident))

// 若不再執行,則直接刪除

unset($pids[$index]);

$redis->sremove($key, $pid);

} return count($pids程式設計客棧) <= $maxnum;

}關於標識,可能我們在執行一些定時指令碼的時候,統一的部分可能就是 php 了;或者,擁有相同標識的指令碼,我們要歸為幾類。

為了能夠實現這些需求,我們可以通過 php 的內建函式 cli_set_process_title 來實現自定義 command。

demo.php:

這個時候,我們執行 demo.php,然後通過 ps ax 可以看到如下結果:

pid user time command

1 root 0:09 php-fpm: master process (/usr/local/etc/php-fpm.conf)

7 root 0:16 php-fpm:www.cppcns.com pool www

8 root 0:15 php-fpm: pool www

9 root 0:14 php-fpm: pool www

10 root 0:00 sh

663 root 0:00 sh

690 root 0:00 job demo

691 root 0:00 ps ax

修改指定指令碼的程序標題,我們就可以實現定義某些指令碼的標識了。

沒 bug 的功能,也可能出現 bug,我們需要更多的思考和設計減少這類錯誤的發生

PHP 限制定時任務程序數量

現在的工作中,經常要寫一些指令碼做一些非同步的操作。一般是大量的資料修改,或者解決部分併發問題。為了能夠穩定的做好資料處理,一般情況下會用定時指令碼的方式。那麼問題來了。當我們處理大量資料的時候,指令碼的執行時間可能很長,或者重複處理某條資料 寫錯的情況下 為了避免資料的重複處理 執行指令碼過多導致...

php 實現linux的定時任務

在php學習和工作生活中,經常需要定時去執行任務,一般可以分為純 實現和借助linux的定時任務管理器cron.d或者crontab來實現。1.先來說一下純 是如何實現的。ignore user abort 關閉瀏覽器仍然執行 set time limit 0 讓程式一直執行下去 interval ...

PHP的crontab定時任務管理

cron 是乙個linux下的定時執行工具。使用者可以使用crontab工具來配置cron任務。安裝crontab yum install crontabs 啟動 sbin service crond start 啟動服務 sbin service crond stop 關閉服務 sbin serv...