php 定時任務
google百度了下,PHP任務大體上可以分為三類
最近需要去定時請求資料,然後分析之後 指定相應的文字 通過socket廣播給使用者。
具體的分析 制定文字的業務 不復雜。 使用curl 請求資料 。但是對於定時任務這一塊怎麼使用都不行。
1、伺服器計劃任務
WIN伺服器可以直接使用定時任務執行相關的應用程式,LINUX伺服器則可以通過在/etc/crontab裡新增定時任務來實現。
php -f檔案所在位置
缺點:最低一分鐘的任務計劃。很多請求需要一分鐘以內。需要儲存上一次的資料,下次再去取。
2、通過死迴圈實現任務自動執行
建立一個程式檔案頁面,通過ignore_user_abort來設定關閉瀏覽器頁面後仍可執行,那麼,在執行該程式頁面後,您所需要的任務計劃便會一直自動執行。對於一般的PHP程式設計師來說,如果沒有足夠的把握,這種操作是不被允許的,因為死迴圈極容易使用伺服器當機。
set_time_limit(0);// 取消超時 // ignore_user_abort(true);//瀏覽器關閉 繼續執行 while (true) { dongsomthing(); sleep( 120); // 定時 120秒usleep()毫秒1000毫秒=1秒 } die;
sleep 和 usleep 都不太精確
缺點:長時間佔據記憶體,經常無緣無故 自己暫停。
3、通過workman等第三方框架。
···
<?php use \Workerman\Worker; use \Workerman\Lib\Timer; require_once __DIR__ . './Workerman/Autoloader.php'; $task = new Worker(); // 開啟多少個程序執行定時任務,注意多程序併發問題 $task->count = 1; $task->onWorkerStart = function($task) { // 每2.5秒執行一次 支援小數,可以精確到0.001,即精確到毫秒級別 $time_interval = 30; Timer::add($time_interval, function() { dosomthing() echo "task run\n"; }); }; // 執行worker Worker::runAll(); ?>
···
可以精確到秒, 還是會經常暫停! 別人說他能跑半年 不停。我是不是開的任務比較多,因為我又8個任務 沒30秒 請求一次。
參考workman手冊 (https://www.kancloud.cn/walko... )
使用方法很簡單 配置好php環境,然後直接命令列執行改檔案就行了
php-f 檔案所在位置
4、使用GatewayWorker搭建socket 服務端
https://www.workerman.net/workerman-chat
因為需要分析出文字之後廣播到每個客戶端,那如何在呼叫socket方法推送給每個客戶呢?
參考其他專案中推送訊息 (https://www.kancloud.cn/walko... )
那如何存入資料庫呢?