国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > PHP > 正文

php 異步執行腳本程序代碼

2024-05-04 21:48:03
字體:
來源:轉載
供稿:網友

這里說的異步執行是讓php腳本在后臺掛起一個執行具體操作的腳本,主腳本退出后,掛起的腳本還能繼續執行,比如執行某些耗時操作或可以并行執行的操作,可以采用php異步執行的方式,主腳本和子腳本的通訊可以采用外部文件或memcached的方式,原理就是通過exec或system來執行一個外部命令,注意,本文所述的是針對Linux環境.

在Linux下要讓一個腳本掛在后臺執行可以在命令的結尾加上一個 "&" 符號,有時候這還不夠,需要借助nohup命令,關于nohup,玩過Linux的人應該都知道,如果想讓一個程序在后臺運行,只要在執行命令的末尾加上一個&符號就可以了,但是這種方式不是很保險,有些程序當你登出終端后它就會停止,那么如何讓一個程序真正永遠在后臺執行呢,答案就是使用 nohub 命令,格式為:

nohup 執行程序的命令 &

如果程序有輸出,它會試著把輸出寫入執行上述命令的當前文件夾下的 nohup.out 文件中,當寫入失敗,就會寫當前用戶的$HOME目錄下的nohup.out 中.

CLI環境和Web環境執行的操作還不太一樣,先來說CLI環境,這里需要用上nohup和&,同時還要把指定輸出,如果不想要輸出結果,可以把輸出定向到/dev/null中,現在來做一個測試,假設在一個目錄中有main.php、sub1.php和sub2.php,其中sub1和sub2內容一樣都讓sleep函數暫停一段時間,代碼如下:

  1. //main.php 
  2. <?php 
  3.     $cmd = 'nohup php ./sub.php >./tmp.log  &'
  4.     exec($cmd); 
  5.     $cmd = 'nohup php ./sub1.php >/dev/null  &'
  6.     exec($cmd); 
  7. ?> 
  8.  
  9. //sub1.php sub2.php 
  10. <?php 
  11.     sleep(100000); 
  12. ?> 

上述文件中main.php是作為主腳本,在命令行中執行php main.php,可以看到main.php腳本很快就執行完并退出,在使用ps aux | grep sub命令搜索進程,應該可以在后臺看到上述的兩個子腳本,說明成功掛起了子腳本.

在Web環境下,執行php腳本都是Web服務器開啟的cgi進程來處理,只要腳本不退出,就會一直占有該cgi進程,當啟動的所有cgi進程都被占用完后就不能在處理新的請求,所以對那些可能會很費時的腳本,可以采用異步的方式,啟動子腳本的方式和CLI差不多,必須要使用&和指定輸出(只好是定向到/dev/null),但是不能使用nohup,例如如下代碼:

  1. <?php 
  2.     $cmd = 'php PATH_TO_SUB1/sub1.php >/dev/null  &'
  3.     exec($cmd); 
  4.     $cmd = 'php PATH_TO_SUB1/sub2.php >/dev/null  &'
  5.     exec($cmd); 
  6. ?> 

當在瀏覽器中訪問該腳本文件,可以看到瀏覽器里面響應完成,同時使用ps命令查看后臺可以看到sub1和sub2腳本.

注意上述例子中如果php命令不在PATH中,需要指定命令完整的路徑,推薦使用完整路徑,特別是在Web下.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 南岸区| 揭西县| 海原县| 芜湖市| 香格里拉县| 富裕县| 遂昌县| 固始县| 甘孜县| 水城县| 湖北省| 来安县| 乌兰察布市| 宣汉县| 武义县| 即墨市| 乐都县| 会同县| 修文县| 普定县| 库尔勒市| 岢岚县| 关岭| 柳河县| 五台县| 崇礼县| 沽源县| 合水县| 纳雍县| 怀远县| 阿拉尔市| 高唐县| 本溪| 阳曲县| 油尖旺区| 济源市| 塘沽区| 青阳县| 永州市| 扶余县| 丰镇市|