現在的工作中,經常要寫一些指令碼做一些非同步的操作。
一般是大量的資料修改,或者解決部分併發問題。
為了能夠穩定的做好資料處理,一般情況下會用定時指令碼的方式。
那麼問題來了。
當我們處理大量資料的時候,指令碼的執行時間可能很長,或者重複處理某條資料(寫錯的情況下)。
為了避免資料的重複處理、執行指令碼過多導致伺服器壓力過大等問題,我們需要限制指令碼的執行數量。
思路一查詢某種標識的程序數量,如果超過一定數量,則直接退出,不處理。
思路二記錄每次的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...