當前位置:首頁 » 編程語言 » 任務調度php

任務調度php

發布時間: 2025-05-07 17:05:30

① 【協程】php yield關鍵詞和協程的實現(二)

協程是一種編程邏輯的轉變,使多個任務能交替運行,而不是按流程順序執行。例如,當你有一個邏輯,每次調用這個文件時需要執行3個任務:寫入300個文件、發送郵件給500個會員和插入100條數據。可以實現這3個功能,但問題是如何改成交替運行,即寫入文件一次之後,馬上去發送郵件,然後再去插入一條數據。代碼1實現了這3個功能,但代碼可讀性差,擴展性也很差。

這時候我們就必須藉助yield了。首先,我們得封裝一個任務類,這個封裝類可以更好地調用運行生成器函數,但只有這個還不夠,我們還需要一個調度任務類來代替while循環。有了調度類和任務類,可以繼續實現上面的功能。除了上面的兩個類,task函數和代碼1不同的地方就是多了個yield。運行代碼,我們實現了可以調度任務,進行任務交叉運行的功能,這就是"協程"。

協程可以將多個不同的任務交叉運行。除了實現基本的調度功能,還需要解決任務和調度器之間的通信問題。我們封裝了一個調用的封裝類,同時在調度器的run方法中新增了一個返回當前任務id的函數。接著,修改了task1、task2、task3函數,讓它們可以通過task_id獲取調度器的信息。執行結果,當第一次執行時,會先調用getTaskId獲取task_id,然後繼續執行任務,這樣我們就獲取到了調度器分配給任務的task_id。

如果新增一個需求,比如在發送郵件時需要新增一個發送簡訊的子任務,當會員id大於200時則停止。這時,我們可以利用yieldCall來新增任務和殺死任務。同時,調度器Scheler類也需要有killTask的方法。有了新增和刪除任務的功能,我們重新編寫了task2以及新增了task4。

總結來說,協程只是一種編程邏輯,一種寫代碼的技巧。它幫助我們更好地切換代碼中的任務。從上面的例子不難發現,其實協程的實現封裝較為麻煩,並且在不需要協程的情況下也能實現這些功能。但為什麼還要用協程呢?因為協程可以讓代碼更加簡潔,任務相互之間獨立區分開,使代碼更加清爽。協程讓我們可以更好地控制切換任務流。在一些特定場景下,如JS AJAX,協程能實現非同步處理,提高效率,讓CPU在等待IO操作時處理其他任務,實現更高效的任務調度。

② PHP線程安全與非線程安全的區別:如何選擇用哪一個

首先,linux下的PHP,沒有線程安全版和非線程安全版之分。從2000年10月20日發布的第一個Windows版的PHP3.0.17開始的都是線程安全的版本,直至5.2.1版本開始有Thread Safe(TS,線程安全)和None Thread Safe(NTS,非線程安全)之分。

因為,Linux/Unix系統採用的是多進程的工作方式,而Windows系統採用多線程的工作方式。即:Linux系統的任務調度基本單位是進程,Windows系統的任務調度基本單位是線程(本觀點來自自學與總結,不能保證百分之百正確)。

所以,在Windows系統的IIS下以CGI方式運行PHP會非常慢,這是由於CGI模式是建立在多進程的基礎之上的,而非多線程,且CGI模式對於每個HTTP請求都需要重新載入和卸載整個PHP環境,其消耗是巨大的。

於是,一般我們會把PHP配置成以ISAPI的方式來運行,ISAPI是多線程的方式,這樣就快多了。但存在一個問題,很多常用的PHP擴展是以 Linux/Unix的多進程思想來開發的,這些擴展在ISAPI的方式運行時就會出錯搞垮IIS。

為了兼顧IIS下PHP的效率和安全,微軟給出了FastCGI的解決方案。FastCGI可以讓PHP的進程重復利用,而不是每一個新的請求就重開一個進程。同時FastCGI也可以允許幾個進程同時執行。這樣既解決了CGI進程模式消耗太大的問題,又利用上了CGI進程模式不存在線程安全問題的優勢。

因此,如果是使用ISAPI的方式來運行PHP就必須用Thread Safe(TS,線程安全)的版本;而用FastCGI模式運行PHP的話就沒有必要用線程安全檢查了,用None Thread Safe(NTS,非線程安全)的版本能夠更好的提高效率。

名詞解析:

  • IIS:Internet Information Services (互聯網信息服務),是由微軟公司提供的基於運行Microsoft Windows的互聯網基本服務

  • CGI:Common Gateway Interface (通用網關介面),是外部應用程序(CGI程序)與Web伺服器之間的介面標准

  • ISAPI:Internet Server Application Programming Interface (互聯網應用程序介面),是為Microsoft所提的Internet server的API

  • FastCGI:CGI存在收到每個請求時都開辟一個進程等不足,FastCGI可以理解為是征對CGI的改進版

③ php如何每天定時執行

php做不到每天定時執行,只有java或者c可以,因為php是不訪問頁面就不會動得代碼,但是有一個方法可以曲線救國
你寫一個頁面是你要每天定時執行的頁面,然後視你的操作系統而言,做定時任務,定時去訪問這個頁面
如果是windows請使用任務計劃功能
如果是linux請使用定時任務Cron,在定時的時候使用curl來訪問你那個頁面。以下我只貼出linux的解決方案,因為一般伺服器都是linux的,windows的大家都會

=========================linux cron 入門 ============================

Linux操作系統定時任務系統 Cron 入門
cron是一個linux下的定時執行工具,可以在無需人工干預的情況下運行作業。由於Cron 是Linux的內置服務,但它不自動起來,可以用以下的方法啟動、關閉這個服務:
/sbin/service crond start //啟動服務
/sbin/service crond stop //關閉服務
/sbin/service crond restart //重啟服務
/sbin/service crond reload //重新載入配置
你也可以將這個服務在系統啟動的時候自動啟動:
在/etc/rc.d/rc.local這個腳本的末尾加上:
/sbin/service crond start
現在Cron這個服務已經在進程裡面了,我們就可以用這個服務了,Cron服務提供以下幾種介面供大家使用:
1.直接用crontab命令編輯
cron服務提供crontab命令來設定cron服務的,以下是這個命令的一些參數與說明:
crontab -u //設定某個用戶的cron服務,一般root用戶在執行這個命令的時候需要此參數
crontab -l //列出某個用戶cron服務的詳細內容
crontab -r //刪除沒個用戶的cron服務
crontab -e //編輯某個用戶的cron服務
比如說root查看自己的cron設置:crontab -u root -l
再例如,root想刪除fred的cron設置:crontab -u fred -r
在編輯cron服務時,編輯的內容有一些格式和約定,輸入:crontab -u root -e
進入vi編輯模式,編輯的內容一定要符合下面的格式:*/1 * * * * ls >> /tmp/ls.txt
任務調度的crond常駐命令
crond 是linux用來定期執行程序的命令。當安裝完成操作系統之後,默認便會啟動此任務調度命令。crond命令每分鍾會定期檢查是否有要執行的工作,如果有要執行的工作便會自動執行該工作。
1、linux任務調度的工作主要分為以下兩類:
*系統執行的工作:系統周期性所要執行的工作,如備份系統數據、清理緩存
*個人執行的工作:某個用戶定期要做的工作,例如每隔10分鍾檢查郵件伺服器是否有新信,這些工作可由每個用戶自行設置。
2.crontab命令選項:
-u指定一個用戶,
-l列出某個用戶的任務計劃,
-r刪除某個用戶的任務,
-e編輯某個用戶的任務
3.cron文件語法:
分 小時 日 月 星期 命令
0-59 0-23 1-31 1-12 0-6 command (取值范圍,0表示周日一般一行對應一個任務)
4.記住幾個特殊符號的含義:
"*"代表取值范圍內的數字,
"/"代表"每",
"-"代表從某個數字到某個數字,
","分開幾個離散的數字
一、任務調度設置文件的寫法
可用crontab -e命令來編輯,編輯的是/var/spool/cron下對應用戶的cron文件,也可以直接修改/etc/crontab文件
具體格式如下:
Minute Hour Day Month Dayofweek command
分鍾 小時 天 月 天每星期 命令
每個欄位代表的含義如下:
Minute 每個小時的第幾分鍾執行該任務
Hour 每天的第幾個小時執行該任務
Day 每月的第幾天執行該任務
Month 每年的第幾個月執行該任務
DayOfWeek 每周的第幾天執行該任務
Command 指定要執行的程序
在這些欄位里,除了「Command」是每次都必須指定的欄位以外,其它欄位皆為可選欄位,可視需要決定。對於不指定的欄位,要用「*」來填補其位置。
舉例如下:
5 * * * * ls 指定每小時的第5分鍾執行一次ls命令
30 5 * * * ls 指定每天的 5:30 執行ls命令
30 7 8 * * ls 指定每月8號的7:30分執行ls命令
30 5 8 6 * ls 指定每年的6月8日5:30執行ls命令
30 6 * * 0 ls 指定每星期日的6:30執行ls命令[註:0表示星期天,1表示星期1,以此類推,也可以用英文來表示,sun表示星期天,mon表示星期一等。]
30 3 10,20 * * ls 每月10號及20號的3:30執行ls命令[註:「,」用來連接多個不連續的時段]
25 8-11 * * * ls 每天8-11點的第25分鍾執行ls命令[註:「-」用來連接連續的時段]
*/15 * * * * ls 每15分鍾執行一次ls命令 [即每個小時的第0 15 30 45 60分鍾執行ls命令 ]
30 6 */10 * * ls 每個月中,每隔10天6:30執行一次ls命令[即每月的1、11、21、31日是的6:30執行一次ls命令。 ]
每天7:50以root 身份執行/etc/cron.daily目錄中的所有可執行文件
50 7 * * * root run-parts /etc/cron.daily [ 註:run-parts參數表示,執行後面目錄中的所有可執行文件。 ]
二、新增調度任務
新增調度任務可用兩種方法:
1、在命令行輸入: crontab -e 然後添加相應的任務,wq存檔退出。
2、直接編輯/etc/crontab 文件,即vi /etc/crontab,添加相應的任務。
三、查看調度任務
crontab -l //列出當前的所有調度任務
crontab -l -u jp //列出用戶jp的所有調度任務
四、刪除任務調度工作
crontab -r //刪除所有任務調度工作
五、任務調度執行結果的轉向
例1:每天5:30執行ls命令,並把結果輸出到/jp/test文件中
30 5 * * * ls >/jp/test 2>&1
註:2>&1 表示執行結果及錯誤信息。
編輯/etc/crontab 文件配置cron
cron服務每分鍾不僅要讀一次/var/spool/cron內的所有文件,還需要讀一次/etc/crontab,因此我們配置這個文件也能運用cron服務做一些事情。用crontab配置是針對某個用戶的,而編輯/etc/crontab是針對系統的任務。此文件的文件格式是:
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root //如果出現錯誤,或者有數據輸出,數據作為郵件發給這個帳號
HOME=/ //使用者運行的路徑,這里是根目錄
# run-parts
01 * * * * root run-parts /etc/cron.hourly //每小時執行/etc/cron.hourly內的腳本
02 4 * * * root run-parts /etc/cron.daily //每天執行/etc/cron.daily內的腳本
22 4 * * 0 root run-parts /etc/cron.weekly //每星期執行/etc/cron.weekly內的腳本
42 4 1 * * root run-parts /etc/cron.monthly //每月去執行/etc/cron.monthly內的腳本
大家注意"run-parts"這個參數了,如果去掉這個參數的話,後面就可以寫要運行的某個腳本名,而不是文件夾名了
例如: 1、在命令行輸入: crontab -e 然後添加相應的任務,wq存檔退出。
2、直接編輯/etc/crontab 文件,即vi /etc/crontab,添加相應的任務
11 2 21 10 * rm -rf /mnt/fb

④ Docker容器里配置計劃任務 crontab(DaoCloud+Docker +Laravel5)

深入研究了crontab的使用方法後,在自己電腦上成功實現定時任務功能。通過命令執行,添加crontab配置,實現每分鍾執行特定命令,成功開啟Laravel的任務調度。


嘗試將crontab配置集成到Docker容器中,自動在容器啟動時執行任務。具體步驟包括:




  • 在項目中創建crontab配置文件




  • 將配置文件復制到Docker容器內的指定目錄




  • 編寫entrypoint.sh腳本,啟動容器內的Apache服務與crontab




使用php:7.0.7-apache基礎鏡像,該鏡像內已具備CMD指令用於啟動Apache服務,但需增加腳本以同時啟動Apache與crontab。確保容器內環境變數正確載入,以便在執行php artisan schele:run命令時獲取應用配置,避免執行錯誤。


構建與運行Laravel5應用所需的Docker文件、crontab配置文件與entrypoint.sh腳本已經完成,能夠滿足大部分需求。此配置方法適用於希望在Docker容器內執行定時任務的開發者。


為幫助進階開發者的技能提升,整理了一份包含分布式架構、高可擴展、高性能、高並發、伺服器性能調優、TP6、laravel、YII2、Redis、Swoole、Swoft、Kafka、Mysql優化、shell腳本、Docker、微服務、Nginx等多個知識點的高級進階干貨資料,有需求者可加入官方群獲取。

熱點內容
怎麼加密sd卡 發布:2025-05-08 06:16:43 瀏覽:566
中國未來的存儲 發布:2025-05-08 06:13:30 瀏覽:862
安卓允許相機訪問如何設置 發布:2025-05-08 06:06:46 瀏覽:352
修改gdp演算法 發布:2025-05-08 05:52:16 瀏覽:398
安卓藍牙分享錄音如何剪輯 發布:2025-05-08 05:13:20 瀏覽:616
密碼箱是多少 發布:2025-05-08 04:42:37 瀏覽:212
andsql語法 發布:2025-05-08 04:41:21 瀏覽:997
二級模式資料庫 發布:2025-05-08 04:39:53 瀏覽:936
重啟電腦伺服器是什麼意思 發布:2025-05-08 04:33:47 瀏覽:552
絕地求生顯卡開最高需要什麼配置 發布:2025-05-08 04:33:00 瀏覽:879